使用 Docker 部署 Nginx 的完整指南

准备工作

  1. 安装 Docker

    • 对于 Linux 系统:
      curl -fsSL https://get.docker.com | sh
      sudo systemctl enable --now docker
      

    • 对于 Windows/macOS:从 Docker 官网下载 Docker Desktop 并安装
  2. 验证 Docker 安装

    docker --version
    docker run hello-world
    

快速部署 Nginx

  1. 拉取最新 Nginx 镜像

    docker pull nginx:latest
    

  2. 运行基本容器

    docker run --name my-nginx -p 80:80 -d nginx
    

    • --name:为容器指定名称
    • -p 80:80:将主机的80端口映射到容器的80端口
    • -d:在后台运行容器
  3. 验证运行

    • 访问 http://localhost 应该能看到 Nginx 欢迎页面
    • 查看容器日志:
      docker logs my-nginx
      

高级配置选项

1. 挂载自定义配置文件

  1. 创建本地配置目录:

    mkdir -p ~/nginx-config
    

  2. 获取默认配置(可选):

    docker cp my-nginx:/etc/nginx/nginx.conf ~/nginx-config/
    

  3. 使用自定义配置运行:

    docker run --name my-nginx \
      -p 80:80 \
      -v ~/nginx-config/nginx.conf:/etc/nginx/nginx.conf \
      -v ~/nginx-config/conf.d:/etc/nginx/conf.d \
      -d nginx
    

2. 挂载网站文件

docker run --name my-nginx \
  -p 80:80 \
  -v /path/to/your/html:/usr/share/nginx/html \
  -d nginx

3. 使用环境变量

docker run --name my-nginx \
  -p 80:80 \
  -e NGINX_PORT=80 \
  -e NGINX_HOST=example.com \
  -d nginx

常用管理命令

  1. 停止容器

    docker stop my-nginx
    

  2. 启动容器

    docker start my-nginx
    

  3. 重启容器

    docker restart my-nginx
    

  4. 进入容器

    docker exec -it my-nginx bash
    

  5. 删除容器

    docker rm my-nginx
    

使用 Docker Compose 部署

  1. 创建 docker-compose.yml 文件:
version: '3'
services:
  nginx:
    image: nginx:latest
    container_name: my-nginx
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx-config/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx-config/conf.d:/etc/nginx/conf.d
      - ./html:/usr/share/nginx/html
      - ./certs:/etc/nginx/certs
    restart: unless-stopped

  1. 启动服务:
    docker-compose up -d
    

实际应用场景

  1. 开发环境

    • 快速搭建本地Web服务器
    • 测试静态网站
    • 前端开发调试
  2. 生产环境

    • 作为反向代理
    • 负载均衡
    • 静态资源服务器
  3. 微服务架构

    • 作为API网关
    • 路由不同服务请求
    • 处理SSL终止

安全注意事项

配置文件丢失问题

问题描述:容器重启后Nginx配置丢失。

解决方案

静态文件服务问题

问题描述:如何通过Nginx容器提供静态文件服务。

解决方案

docker run -v /path/to/html:/usr/share/nginx/html:ro -p 80:80 nginx

确保目录结构符合Nginx默认配置:

/usr/share/nginx/html
├── index.html
└── static/
    ├── css/
    ├── js/
    └── images/

日志管理问题

问题描述:容器日志过大或需要持久化存储。

解决方案

SSL/TLS 配置问题

问题描述:如何在容器中配置HTTPS。

解决方案

docker run -v /path/to/certs:/etc/nginx/certs \
           -v /path/to/nginx.conf:/etc/nginx/nginx.conf \
           -p 443:443 nginx

示例Nginx配置片段:

server {
    listen 443 ssl;
    ssl_certificate /etc/nginx/certs/fullchain.pem;
    ssl_certificate_key /etc/nginx/certs/privkey.pem;
    # 其他配置...
}

容器性能调优问题

问题描述:如何优化Nginx容器性能。

解决方案

问题描述:Nginx容器如何与其他服务容器通信。

解决方案

容器健康检查问题

问题描述:如何监控Nginx容器健康状况。

解决方案

多容器协作问题

  1. 使用非root用户运行:

    docker run --name my-nginx -p 80:80 -u 1000 -d nginx
    

  2. 定期更新镜像:

    docker pull nginx:latest
    docker stop my-nginx
    docker rm my-nginx
    docker run ... # 使用新镜像重新运行
    

  3. 限制资源使用:

    docker run --name my-nginx \
      --memory="512m" \
      --cpus="1" \
      -p 80:80 \
      -d nginx
    

    使用 Docker 部署 Nginx 常见问题及解决方案

    端口冲突问题

    问题描述:当运行 docker run -p 80:80 nginx 时,可能会遇到端口已被占用的错误。

    解决方案

  4. 检查当前占用80端口的进程:sudo lsof -i :80
  5. 停止占用端口的服务或修改映射端口:docker run -p 8080:80 nginx
  6. 使用 --network host 模式(不推荐生产环境使用):docker run --network host nginx
  7. 使用数据卷持久化配置:
    docker run -v /path/to/nginx.conf:/etc/nginx/nginx.conf:ro nginx
    

  8. 自定义Dockerfile构建镜像:
    FROM nginx
    COPY nginx.conf /etc/nginx/nginx.conf
    

  9. 挂载日志目录:
    docker run -v /path/to/logs:/var/log/nginx nginx
    

  10. 配置日志轮转:
    docker run --log-opt max-size=10m --log-opt max-file=3 nginx
    

  11. 限制资源使用:
    docker run --cpus 2 --memory 512m nginx
    

  12. 调整Nginx worker进程数:
    worker_processes auto;
    events {
        worker_connections 1024;
    }
    

  13. 启用HTTP/2:
    listen 443 ssl http2;
    

  14. 使用Docker网络:
    docker network create app_network
    docker run --network app_network --name nginx nginx
    docker run --network app_network --name app your_app
    

  15. 在Nginx配置中使用容器名作为上游:
    upstream app {
        server app:3000;
    }
    

  16. 使用内置健康检查:
    docker run --health-cmd="curl -f http://localhost || exit 1" nginx
    

  17. 自定义健康检查端点:
    location /health {
        access_log off;
        return 200 'OK';
        add_header Content-Type text/plain;
    }
    

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐