跨境电商 Docker 部署实战:从服务器搭建到上线运维全流程
Docker 部署完整教程|适合跨境电商
一、为什么跨境电商团队需要 Docker?
跨境电商业务通常具有几个明显特点:系统多、环境复杂、迭代频繁、访问区域分散、对稳定性要求高。一个成熟的跨境电商项目,往往不只是一个网站,而是由多个模块组成,例如独立站前台、后台管理系统、商品管理、订单系统、支付服务、物流接口、邮件服务、数据分析、客服系统、ERP 或仓储系统对接等。
如果使用传统方式部署,每台服务器都需要手动安装运行环境,例如 Node.js、Java、PHP、Python、Nginx、MySQL、Redis 等。不同开发人员、本地测试环境、测试服务器、生产服务器之间很容易出现版本不一致的问题。比如本地 Node.js 是 18,服务器上是 16;本地 MySQL 是 8.0,线上是 5.7;开发环境可以运行,部署到服务器后却报错。这类问题会消耗大量排查时间。
Docker 的核心价值,就是把应用和运行环境一起打包成标准化容器。只要服务器上安装了 Docker,就可以用统一方式运行应用。对于跨境电商团队来说,Docker 可以显著提升部署效率、降低环境差异、方便扩容迁移,也便于后续接入 CI/CD 自动化发布流程。
简单来说,Docker 解决的是一句话:“在我电脑上能跑,在服务器上也一定能跑。”
二、Docker 的基本概念
在正式部署之前,需要先理解几个核心概念。
1. 镜像 Image
镜像可以理解为应用的“安装包”或“运行模板”。它包含应用代码、依赖环境、系统库、启动命令等。比如一个基于 Node.js 的独立站项目,可以制作成一个 Docker 镜像。
常见镜像包括:
nginxmysqlredisnodephppythonopenjdk
你也可以基于这些基础镜像制作自己的业务镜像。
2. 容器 Container
容器是镜像运行后的实例。镜像类似类,容器类似对象。一个镜像可以启动多个容器。
例如,你可以用同一个商城后端镜像,在不同端口启动多个容器,用于负载均衡。
3. Dockerfile
Dockerfile 是用来构建镜像的配置文件。它定义了应用运行所需的环境、依赖安装方式、复制哪些代码、容器启动时执行什么命令。
4. Docker Compose
Docker Compose 用于管理多个容器。跨境电商项目通常不仅有一个应用,还会包含数据库、缓存、Nginx、队列服务等。使用 Docker Compose 可以通过一个 docker-compose.yml 文件统一管理多个服务。
例如:
- 前端服务
- 后端 API 服务
- MySQL 数据库
- Redis 缓存
- Nginx 反向代理
只需要一条命令即可全部启动。
三、服务器准备
跨境电商项目建议选择稳定的云服务器,例如 AWS、Google Cloud、Azure、阿里云国际站、腾讯云国际站、Vultr、DigitalOcean 等。如果目标客户主要在欧美,建议服务器部署在美国、欧洲或靠近目标市场的地区。如果目标客户遍布全球,建议结合 CDN 使用。
推荐服务器配置
对于中小型跨境电商独立站,初期可以选择:
| 项目 | 推荐配置 |
|---|---|
| CPU | 2 核以上 |
| 内存 | 4GB 以上 |
| 硬盘 | 40GB SSD 以上 |
| 系统 | Ubuntu 22.04 LTS |
| 带宽 | 根据访问量选择 |
| 安全组 | 开放 80、443、22 端口 |
如果业务包含较多图片处理、搜索、数据同步任务,建议提升到 4 核 8GB 或更高配置。
四、安装 Docker
以下示例以 Ubuntu 22.04 为例。
1. 更新系统软件包
sudo apt update
sudo apt upgrade -y
2. 安装依赖工具
sudo apt install -y ca-certificates curl gnupg lsb-release
3. 添加 Docker 官方 GPG 密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
| sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
4. 添加 Docker 软件源
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" \
| sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
5. 安装 Docker
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
6. 验证安装
docker --version
docker compose version
如果能看到版本号,说明 Docker 和 Docker Compose 已经安装成功。
7. 设置普通用户使用 Docker
默认情况下,执行 Docker 命令需要 sudo。可以将当前用户加入 Docker 用户组:
sudo usermod -aG docker $USER
执行后需要退出服务器并重新登录,配置才会生效。
五、部署一个跨境电商项目的典型架构
假设我们要部署一个跨境电商独立站,架构如下:
用户浏览器
↓
CDN
↓
Nginx 容器
↓
前端容器 / 后端 API 容器
↓
MySQL 容器 / Redis 容器
各模块作用如下:
- Nginx:负责反向代理、HTTPS、静态资源分发。
- 前端服务:展示商品、购物车、支付页面、用户中心等。
- 后端 API:处理商品、订单、库存、支付、物流、用户数据。
- MySQL:存储商品、订单、用户、支付记录等核心数据。
- Redis:用于缓存、验证码、会话、队列等。
- CDN:提升海外访问速度,减少服务器压力。
对于跨境电商来说,图片、视频、商品详情页静态资源较多,强烈建议将静态资源上传到对象存储,并结合 CDN 分发,例如 AWS S3 + CloudFront,或 Cloudflare R2 + CDN。
六、准备项目目录
在服务器上创建项目目录:
mkdir -p /www/cross-border-shop
cd /www/cross-border-shop
推荐目录结构如下:
cross-border-shop/
├── backend/
│ ├── Dockerfile
│ └── ...
├── frontend/
│ ├── Dockerfile
│ └── ...
├── nginx/
│ └── default.conf
├── mysql/
│ └── data/
├── redis/
├── docker-compose.yml
└── .env
其中:
backend存放后端代码。frontend存放前端代码。nginx存放 Nginx 配置。mysql/data用于持久化数据库文件。.env存放环境变量,例如数据库密码、接口地址、密钥等。docker-compose.yml是核心编排文件。
七、编写后端 Dockerfile
假设后端是 Node.js 项目,可以在 backend/Dockerfile 中编写:
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install --production
COPY . .
EXPOSE 3000
CMD ["npm", "run", "start"]
说明:
FROM node:20-alpine表示使用轻量级 Node.js 镜像。WORKDIR /app设置容器工作目录。COPY package*.json ./先复制依赖文件,便于利用 Docker 构建缓存。RUN npm install --production安装生产依赖。COPY . .复制项目代码。EXPOSE 3000声明服务端口。CMD定义容器启动命令。
如果你的后端是 Java、PHP、Python,Dockerfile 会有所不同,但思路一致:安装环境、复制代码、安装依赖、启动服务。
八、编写前端 Dockerfile
假设前端是 Vue、React 或 Next.js 静态构建项目,可以采用多阶段构建。
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
如果是 Vite 项目,构建结果通常是 dist。如果是 React CRA,也通常是 build,需要根据实际情况调整:
COPY --from=builder /app/build /usr/share/nginx/html
这种方式的优点是:构建阶段使用 Node.js,最终运行阶段只使用 Nginx,镜像更小、更安全、更适合生产环境。
九、编写 Nginx 配置
在 nginx/default.conf 中配置反向代理:
server {
listen 80;
server_name example.com www.example.com;
location / {
proxy_pass http://frontend:80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /api/ {
proxy_pass http://backend:3000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
这里的 frontend 和 backend 是 Docker Compose 中定义的服务名。在同一个 Compose 网络内,容器之间可以通过服务名互相访问,不需要写固定 IP。
十、编写 docker-compose.yml
在项目根目录创建 docker-compose.yml:
services:
nginx:
image: nginx:alpine
container_name: shop_nginx
ports:
- "80:80"
volumes:
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
depends_on:
- frontend
- backend
restart: always
frontend:
build:
context: ./frontend
container_name: shop_frontend
restart: always
backend:
build:
context: ./backend
container_name: shop_backend
env_file:
- .env
depends_on:
- mysql
- redis
restart: always
mysql:
image: mysql:8.0
container_name: shop_mysql
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
volumes:
- ./mysql/data:/var/lib/mysql
ports:
- "3306:3306"
restart: always
redis:
image: redis:7-alpine
container_name: shop_redis
restart: always
然后创建 .env 文件:
MYSQL_ROOT_PASSWORD=your_root_password
MYSQL_DATABASE=shop_db
MYSQL_USER=shop_user
MYSQL_PASSWORD=your_password
DB_HOST=mysql
DB_PORT=3306
DB_NAME=shop_db
DB_USER=shop_user
DB_PASSWORD=your_password
REDIS_HOST=redis
REDIS_PORT=6379
注意:生产环境中不要使用简单密码,也不要将 .env 文件提交到 Git 仓库。
十一、启动项目
进入项目根目录,执行:
docker compose up -d --build
参数说明:
up表示启动服务。-d表示后台运行。--build表示启动前重新构建镜像。
查看容器状态:
docker compose ps
查看日志:
docker compose logs -f
查看某个服务日志:
docker compose logs -f backend
如果所有容器状态都是 running,说明项目已经成功启动。
十二、配置域名解析
跨境电商独立站通常会绑定正式域名,例如:
example.com
www.example.com
你需要进入域名服务商后台,添加 DNS 解析:
| 类型 | 主机记录 | 值 |
|---|---|---|
| A | @ | 服务器公网 IP |
| A | www | 服务器公网 IP |
如果使用 Cloudflare,可以将域名托管到 Cloudflare,并开启 CDN 加速、防火墙、防 DDoS、Bot 防护等能力。
十三、配置 HTTPS 证书
跨境电商网站必须使用 HTTPS,尤其涉及注册、登录、支付、订单信息等敏感数据时,HTTPS 是基础要求。
可以使用 Certbot 免费申请 Let’s Encrypt 证书。
1. 安装 Certbot
sudo apt install -y certbot
2. 停止占用 80 端口的 Nginx 容器
docker compose stop nginx
3. 申请证书
sudo certbot certonly --standalone \
-d example.com \
-d www.example.com
证书通常会保存到:
/etc/letsencrypt/live/example.com/
4. 修改 docker-compose.yml 挂载证书
volumes:
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
- /etc/letsencrypt:/etc/letsencrypt:ro
5. 修改 Nginx HTTPS 配置
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
location / {
proxy_pass http://frontend:80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /api/ {
proxy_pass http://backend:3000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
同时在 docker-compose.yml 中开放 443 端口:
ports:
- "80:80"
- "443:443"
重新启动:
docker compose up -d
十四、数据库数据持久化与备份
跨境电商最重要的数据包括订单、支付记录、用户信息、商品信息、库存信息等。数据库不能只存在容器内部,否则容器删除后数据也会丢失。
在上面的 Compose 配置中:
volumes:
- ./mysql/data:/var/lib/mysql
这表示 MySQL 数据会保存到服务器本地目录 ./mysql/data,即使容器删除,数据仍然存在。
推荐备份方式
可以定期执行:
docker exec shop_mysql mysqldump \
-u root \
-p shop_db > backup.sql
更推荐写成定时任务,每天自动备份,并上传到对象存储,例如 AWS S3、Cloudflare R2、阿里云 OSS 等。
备份策略建议:
- 每日自动备份数据库。
- 至少保留最近 7 天备份。
- 每周保留一份完整备份。
- 备份文件加密存储。
- 定期测试恢复流程,而不是只备份不验证。
对于跨境电商来说,数据库备份不是可选项,而是业务安全底线。
十五、常用 Docker 运维命令
查看容器
docker ps
查看所有容器,包括已停止:
docker ps -a
查看镜像
docker images
重启服务
docker compose restart
重启单个服务:
docker compose restart backend
停止服务
docker compose down
重新构建并启动
docker compose up -d --build
清理无用镜像
docker image prune -f
查看容器资源占用
docker stats
这些命令是日常维护中最常用的,建议团队成员都熟悉。
十六、跨境电商部署的关键注意事项
1. 不要把数据库端口暴露到公网
示例中 MySQL 映射了:
ports:
- "3306:3306"
生产环境如果没有远程连接需求,建议删除这段配置。数据库应只允许后端容器在内部网络访问。如果必须远程管理数据库,也应限制 IP 白名单,并使用 VPN 或 SSH 隧道。
2. 环境变量要妥善管理
支付密钥、数据库密码、JWT 密钥、邮件服务密钥等都不能写死在代码里。应通过 .env 或云平台密钥管理服务注入。
常见敏感配置包括:
- PayPal Client Secret
- Stripe Secret Key
- 数据库密码
- 邮件 SMTP 密码
- AWS Access Key
- JWT Secret
- 管理员初始化密码
3. 日志要可追踪
跨境电商订单链路较长,一个订单可能涉及用户下单、库存扣减、支付回调、物流同步、邮件通知等。如果没有日志,很难排查问题。
建议至少记录:
- 请求 ID
- 用户 ID
- 订单号
- 支付平台交易号
- 错误堆栈
- 第三方接口返回结果
4. 支付回调必须稳定
PayPal、Stripe 等支付平台通常通过 Webhook 通知支付状态。你的后端接口必须能被公网访问,并正确处理重复通知、签名验证、状态幂等更新。
支付回调处理建议:
- 验证签名。
- 检查订单是否存在。
- 判断订单状态是否已经处理。
- 使用事务更新订单状态。
- 记录完整回调日志。
- 返回平台要求的成功响应。
5. 图片资源不要直接放服务器
商品图片、详情图、用户上传文件不建议直接保存在应用容器内。容器是可替换的,应用重建后本地文件可能丢失。建议使用对象存储和 CDN。
推荐方案:
商品图片 → 对象存储 → CDN → 用户访问
这样既能提升访问速度,也便于扩容和迁移。
十七、上线发布流程建议
一个较规范的发布流程如下:
- 开发人员提交代码到 Git 仓库。
- CI 平台自动拉取代码。
- 执行测试和构建。
- 构建 Docker 镜像。
- 推送镜像到镜像仓库。
- 服务器拉取最新镜像。
- 使用 Docker Compose 重启服务。
- 检查健康状态和日志。
- 发布完成后观察订单、支付、访问数据。
如果团队规模较小,也可以先采用手动部署:
git pull
docker compose up -d --build
docker compose logs -f
等业务稳定后,再逐步引入 GitHub Actions、GitLab CI、Jenkins 等自动化工具。
十八、性能优化建议
1. 使用 CDN
跨境访问链路较长,CDN 对访问速度影响非常明显。尤其是图片、CSS、JS、字体文件等静态资源,应尽量通过 CDN 分发。
2. 开启 Nginx Gzip
可以在 Nginx 中开启 Gzip 压缩,减少传输体积:
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml;
3. 合理使用 Redis 缓存
适合缓存的数据包括:
- 首页商品列表
- 热销商品
- 分类信息
- 汇率信息
- 运费模板
- 用户会话
但订单、支付状态等强一致数据不能简单依赖缓存,必须以数据库为准。
4. 数据库索引优化
跨境电商常见高频查询字段包括:
order_nouser_idemailskupayment_statuscreated_at
这些字段应根据实际查询建立索引,避免订单量增长后后台查询变慢。
十九、安全加固建议
上线后建议进行基础安全加固:
- 服务器只开放必要端口,例如 22、80、443。
- SSH 禁止 root 直接登录。
- SSH 使用密钥登录,避免密码暴力破解。
- 定期更新系统和 Docker 镜像。
- 后台管理地址增加访问限制或二次验证。
- 支付、登录、注册接口增加限流。
- 所有用户输入都要进行校验和过滤。
- 后端接口必须进行权限验证。
- 定期备份数据库和关键配置。
- 使用 WAF 或 Cloudflare 防护恶意流量。
跨境电商网站容易受到爬虫、撞库、虚假注册、恶意下单、支付欺诈等攻击,安全策略应从项目初期就纳入设计。
二十、常见问题排查
1. 容器启动失败
查看日志:
docker compose logs -f 服务名
常见原因包括:
- 环境变量缺失。
- 数据库连接失败。
- 端口被占用。
- 依赖安装失败。
- 启动命令错误。
2. 网站无法访问
检查以下项目:
- 域名是否解析到正确 IP。
- 服务器安全组是否开放 80 和 443。
- Nginx 容器是否运行。
- Nginx 配置是否正确。
- 应用容器是否正常启动。
3. 后端连不上 MySQL
在 Docker Compose 内部,后端连接数据库时,主机名应该写服务名:
DB_HOST=mysql
不要写 localhost。因为在容器内,localhost 指的是当前容器本身,而不是 MySQL 容器。
4. 修改代码后没有生效
重新构建镜像:
docker compose up -d --build
如果仍然没有生效,可以清理旧镜像后再构建。
结语
Docker 非常适合跨境电商项目部署,因为它可以统一环境、简化发布、降低迁移成本,并为后续自动化运维打下基础。对于独立站、ERP 对接系统、订单管理后台、支付服务、物流同步服务等业务模块,Docker 都能提供更清晰、更稳定的部署方式。
如果你刚开始做跨境电商技术部署,可以先从单服务器 Docker Compose 架构开始:Nginx、前端、后端、MySQL、Redis 分别容器化,配合 HTTPS、数据库备份、CDN 和基础安全策略,就已经能够支撑大多数中小型业务。
当访问量增长后,再逐步升级到更高级的架构,例如负载均衡、多服务器部署、托管数据库、对象存储、消息队列、Kubernetes、CI/CD 自动发布等。技术架构不需要一开始就过度复杂,但一定要保证稳定、安全、可备份、可扩展。对于跨境电商来说,部署不是一次性工作,而是持续优化业务稳定性和用户体验的重要基础。