使用 Docker 部署网站的完整指南:从开发到生产
Docker 容器化使得网站部署从「手工配置」转变为「代码化管理」。本文展示一个完整的前端+后端+数据库网站项目的 Docker 部署。
项目结构
project/
├── frontend/ # 前端应用(Nginx + 静态文件)
├── backend/ # 后端 API(Node.js/Python/Go)
├── docker-compose.yml
└── .env
前端 Dockerfile
# Build stage
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Production stage
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
后端 Dockerfile
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
Docker Compose 编排
version: "3.8"
services:
nginx:
build: ./frontend
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/ssl:/etc/nginx/ssl:ro
depends_on:
- backend
backend:
build: ./backend
env_file: .env
environment:
- NODE_ENV=production
restart: always
postgres:
image: postgres:16-alpine
volumes:
- pgdata:/var/lib/postgresql/data
env_file: .env
volumes:
pgdata:
生产部署要点
1. 使用多阶段构建
多阶段构建可以显著减小最终镜像大小。上面的前端 Dockerfile 即展示了多阶段构建模式。
2. 配置反向代理
server {
listen 80;
server_name example.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com;
location / {
proxy_pass http://backend:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location /static/ {
alias /usr/share/nginx/html/static/;
expires 365d;
}
}
3. 配置 CI/CD
# .github/workflows/deploy.yml
name: Deploy
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build and push Docker image
run: |
docker build -t myapp:${{ github.sha }} .
docker push myapp:${{ github.sha }}
- name: Deploy to server
run: |
ssh user@server "cd /app && docker-compose pull && docker-compose up -d"
16IDC 观察
Docker 化部署极大减少了环境不一致导致的问题。建议新项目从一开始就使用 Docker 和 Docker Compose 管理部署流程,即使是一个简单的静态网站,Docker 也能提供更清晰的发布和回滚流程。
推荐阅读我们的 服务器推荐 来选择合适的 Docker 部署环境。