FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD [
ode" ".js" ```
关键指令说明:
*`FROM`: 指定基础镜像。
*`WORKDIR`: 设置工作目录。
*`COPY`/`ADD`: 将本地代码复制到容器内。
*`RUN`: 执行构建命令(如安装依赖)。
*`EXPOSE`: 声明容器运行时监听的端口。
*`CMD`: 指定容器启动后执行的命令。
3.构建镜像:在Dockerfile所在目录执行 `docker build -t my-shop:latest .`。这条命令会创建一个名为 `my-shop`,标签为 `latest` 的本地镜像。
在单台服务器(如你的VPS或云主机)上,使用Docker命令直接新增和运行容器是最直接的方式。
基本运行命令:
```bash
docker run -d --name my-shop-container -p 80:3000 -v /path/on/host:/path/in/container my-shop:latest
```
*`-d`: 后台运行(守护进程模式)。
*`--name`: 为容器指定一个易读的名称,便于管理。
*`-p 80:3000`: 端口映射,将宿主机的80端口映射到容器的3000端口。这样用户访问服务器IP的80端口(HTTP默认端口)就能访问到网站。
*`-v ...`: 数据卷挂载,这是极其重要的一步。它将宿主机的一个目录挂载到容器内,用于持久化存储数据库文件、上传的图片、日志等。确保容器重建或删除时,这些关键数据不会丢失。
*`my-shop:latest`: 指定要运行的镜像名和标签。
管理与查看:
*`docker ps`: 查看正在运行的容器。
*`docker logs my-shop-container`: 查看容器日志,用于排错。
*`docker exec -it my-shop-container bash`: 进入容器内部执行命令(调试用)。
*`docker stop/start/restart my-shop-container`: 停止、启动、重启容器。
*`docker rm my-shop-container`: 删除容器(需先停止)。
一个完整的外贸独立站通常不止一个应用容器,它可能包括:
*Web应用容器(如你的PHP/Node.js代码)
*数据库容器(如MySQL或PostgreSQL)
*缓存容器(如Redis)
*反向代理容器(如Nginx,处理SSL、静态文件、负载均衡)
手动管理这些容器的网络、依赖和启动顺序非常繁琐。Docker Compose通过一个`docker-compose.yml`文件来定义和运行多容器应用。
```yaml
version: '3.8'
services:
nginx:
image: nginx:alpine
ports:
depends_on:
app:
build: . # 使用当前目录的Dockerfile构建
environment:
volumes:
depends_on:
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: your_strong_password
MYSQL_DATABASE: shop_db
volumes:
redis:
image: redis:alpine
volumes:
volumes:
mysql_data:
redis_data:
```
新增整个站点的所有容器,只需一条命令:`docker-compose up -d`。Docker Compose会自动处理网络创建、服务依赖和启动顺序。
对于业务量大的外贸站,真正的“新增容器”需求是动态的、弹性的。Kubernetes(K8s)是容器编排的事实标准,它能根据CPU、内存使用率或自定义指标(如QPS),自动新增或减少容器副本,实现水平扩展(Scaling)。
核心概念与操作:
1.将镜像推送到仓库:首先需要将构建好的`my-shop`镜像推送到Docker Hub、阿里云容器镜像服务等公共或私有仓库。
2.定义Deployment:这是K8s中描述应用部署的核心对象。它定义了使用哪个镜像、需要运行多少个副本(Pod,即容器组)、更新策略等。
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-shop-deployment
spec:
replicas: 3 # 初始启动3个副本(即3个容器组)
selector:
matchLabels:
app: my-shop
template:
metadata:
labels:
app: my-shop
spec:
containers:
image: your-registry.com/your-username/my-shop:v1.0
ports:
resources:
requests:
memory: "256Mi" cpu: "250m" limits:
memory: "512Mi" cpu: "500m" ```
应用此配置后,K8s会确保始终有3个你的网站容器在运行。
3.自动扩缩容(HPA):创建Horizontal Pod Autoscaler资源。
```bash
kubectl autoscale deployment my-shop-deployment --cpu-percent=50 --min=2 --max=10
```
这条命令指示K8s监控`my-shop-deployment`下所有Pod的CPU使用率。当平均CPU使用率超过50%时,K8s会自动新增容器副本,直到不超过10个;当负载降低时,会自动减少,但不少于2个。这就是“按需新增容器”的自动化实现。
4.通过Service暴露服务:Deployment管理了容器副本,但需要创建一个Service来提供稳定的网络端点,供用户或前端负载均衡器访问。
*数据持久化:容器本身是无状态的。务必使用K8s的PersistentVolume(PV)和PersistentVolumeClaim(PVC)或云提供的块存储服务来持久化数据库、媒体文件。
*配置管理:将数据库连接字符串、API密钥等敏感信息或环境相关配置,通过K8s的ConfigMap和Secret进行管理,而非硬编码在镜像中。
*日志与监控:实施集中式日志收集(如EFK栈:Elasticsearch, Fluentd, Kibana)和监控告警(如Prometheus + Grafana),以便洞察容器运行状态和性能。
*安全:定期更新基础镜像以修补安全漏洞;使用非root用户运行容器;限制容器的资源配额。
*CI/CD集成:将镜像构建、推送和K8s部署编排自动化,集成到GitLab CI/CD、Jenkins或GitHub Actions中,实现代码提交后自动测试、构建并滚动更新到生产环境。
为外贸独立站“新增容器”并非一个孤立的操作,而是一套从镜像构建、单机运行、多服务编排到集群弹性伸缩的完整技术体系。从简单的`docker run`命令开始,逐步过渡到使用Docker Compose管理本地或中小型生产环境,最终在Kubernetes集群上实现全自动的、弹性的容器化部署,是应对业务规模化增长的可靠路径。拥抱容器化,能让你的外贸独立站在全球市场的竞争中,获得更快的迭代速度、更强的稳定性和更优的资源利用率,从而为海外客户提供持续流畅的购物体验。
版权说明: