使用 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 部署环境。