Back to Blog
2026-02-27ToolBox Team

Docker 与 Nginx - 构建现代应用的标准架构

📌 相关工具推荐 | Related Tool

🐳tools.dockerComposeVisualizer
dockernginxdevopsdeployment

Docker 与 Nginx: 构建现代应用的标准架构

在当今的云计算时代,Docker 容器化和 Nginx 反向代理已成为现代应用部署的标准选择。无论是个人项目还是企业级应用,这套组合都能帮助我们快速、高效地部署和管理服务。

为什么选择 Docker + Nginx?

Docker 的核心优势

  • 一致的环境:开发、测试、生产环境完全一致,消除"在我的电脑上没问题"的尴尬
  • 快速部署:秒级启动,支持快速迭代
  • 资源隔离:每个容器独立运行,互不影响
  • 便捷扩展:水平扩展变得简单直观

Nginx 的核心价值

  • 高性能:采用事件驱动架构,能处理数万并发连接
  • 灵活配置:强大的反向代理和负载均衡能力
  • 低内存占用:相比 Apache,内存占用减少 50%+
  • 成熟稳定:被全球数百万网站信赖

快速开始:Docker + Nginx

1. 编写 Dockerfile

FROM node:18-alpine

WORKDIR /app

COPY package*.json ./
RUN npm install

COPY . .

EXPOSE 3000

CMD ["npm", "start"]

这个 Dockerfile 定义了:

  • 基础镜像为 Node.js 18(Alpine 轻量版)
  • 工作目录为 /app
  • 复制项目文件和安装依赖
  • 暴露端口 3000
  • 启动应用

2. Docker Compose 编排多个服务

version: '3.8'

services:
  web:
    build: .
    container_name: my_app
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
    networks:
      - app_network

  nginx:
    image: nginx:alpine
    container_name: my_nginx
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./ssl:/etc/nginx/ssl
    depends_on:
      - web
    networks:
      - app_network

networks:
  app_network:
    driver: bridge

这个配置:

  • 定义 web 和 nginx 两个服务
  • web 服务在内部 3000 端口运行
  • nginx 监听外部 80/443 端口并转发到 web
  • 通过 depends_on 确保启动顺序

启动所有服务只需一条命令:

docker-compose up -d

3. Nginx 反向代理配置

upstream backend {
    server web:3000;
}

server {
    listen 80;
    server_name yourdomain.com;

    # 重定向 HTTP 到 HTTPS
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    server_name yourdomain.com;

    ssl_certificate /etc/nginx/ssl/cert.pem;
    ssl_certificate_key /etc/nginx/ssl/key.pem;

    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        # WebSocket 支持
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    # 静态资源缓存
    location /static/ {
        expires 30d;
        add_header Cache-Control "public, immutable";
    }
}

这个配置实现了:

  • HTTP 自动重定向到 HTTPS
  • SSL/TLS 加密传输
  • 反向代理到后端应用
  • WebSocket 支持
  • 静态资源长期缓存

生产环境最佳实践

1. 健康检查

healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
  interval: 30s
  timeout: 10s
  retries: 3

2. 资源限制

services:
  web:
    deploy:
      resources:
        limits:
          cpus: '1'
          memory: 512M
        reservations:
          cpus: '0.5'
          memory: 256M

3. 日志管理

logging:
  driver: "json-file"
  options:
    max-size: "10m"
    max-file: "3"

4. 环境分离

分别为开发、测试、生产环境维护不同的 docker-compose 配置:

  • docker-compose.yml - 本地开发
  • docker-compose.prod.yml - 生产环境

常见问题排查

容器间通信失败

问题:Nginx 无法连接到 web 应用
解决:确保使用正确的服务名称(如 web:3000),而非 localhost:3000

SSL 证书配置报错

问题SSL_ERROR_BAD_CERT_DOMAIN
解决:使用 SSL/TLS 证书检查工具 验证证书的有效性和域名匹配

容器频繁重启

问题:Docker 容器运行数秒后自动退出
解决:检查 entrypoint 是否正确,确保主进程不会立即退出

扩展建议

  • 负载均衡:使用多个 web 容器,nginx 在它们之间分配流量
  • 持久化:将数据库、缓存分离到独立容器
  • 监控告警:集成 Prometheus + Grafana 监控容器状态
  • 自动化部署:使用 CI/CD(如 GitHub Actions)自动构建和推送镜像

Docker 与 Nginx 的组合为我们提供了强大而灵活的部署方案。掌握这套技能,将大幅提升您的开发效率和系统的可靠性。


相关工具推荐