Skip to content

🚀 使用 Docker Compose 部署 Nginx

🚀 使用 Docker Compose 部署 Nginx

本教程将详细介绍如何使用 Docker Compose 部署 Nginx。Nginx 是一个高性能的 HTTP 和反向代理服务器,在 Docker 环境中部署可以简化配置管理、实现环境隔离,并便于快速部署和扩展

📦 项目简介

Nginx 以其高并发处理能力、低内存占用和模块化设计而闻名。在 Docker 中部署 Nginx 的主要优势包括:

  • 环境一致性:确保开发、测试和生产环境的一致性。
  • 快速部署与扩展:可以快速启动多个实例,并结合负载均衡器使用。
  • 配置与数据持久化:通过挂载宿主机目录,确保容器重建时配置和日志不丢失。

⚙️ 部署前准备

  1. 环境要求

    • 确保你的系统已安装 DockerDocker Compose
    • 系统内存:建议 512MB 以上。
    • 确保计划使用的端口(例如配置文件中的 60)未被占用。
  2. 环境检查 在终端中执行以下命令,确认 Docker 环境正常: bash docker --version docker-compose --version

  3. 创建项目目录 建议创建一个独立的目录来管理所有部署文件,这有助于日后管理和备份。 bash mkdir -p /opt/docker/nginx cd /opt/docker/nginx

🛠️ 配置 Docker Compose

基于你提供的配置,这里是对 docker-compose.yml 文件的解读和优化说明。

#version: '3.8'  # 添加版本声明(使用3.4或更高版本)
services:
  nginx:
    #stdin_open: true
    #tty: true
    container_name: nginx # 容器名称,便于管理(如停止/查看日志)
    ports:
      - 60:80  # 端口映射:主机 60 端口 → 容器 80 端口(访问静态网站的端口)
      #- 61:81
    volumes:
      # 核心:挂载 mkdocs 静态文件目录到 Nginx 默认站点目录
      - /home/compose/mkdocs/docs/my-project/site:/usr/share/nginx/html #/var/www/html
      #- ./html:/usr/share/nginx/html #/var/www/html      

      # 挂载 Nginx 日志目录(主机 ./logs → 容器 /var/log/nginx,便于查看访问日志)
      - ./logs:/var/log/nginx
      #- ./nginx:/etc/nginx  # 可选:如需自定义 Nginx 配置(如反向代理),取消注释并挂载配置目录
    image: nginx:alpine  # 使用 Alpine 轻量镜像(体积小、启动快)
    restart: always  # 容器退出后自动重启(开机自启,确保服务不中断)
    user: "root" # 使用 root 权限运行(避免静态文件目录权限不足,新手推荐默认)
    # 资源限制:防止 Nginx 占用过多服务器资源(适合单机多服务场景)
    deploy:  # 在单机模式下使用deploy.resources  # 单机模式也支持这种语法
      resources:
        limits:
          cpus: '0.5'  # 最多使用 0.5 个 CPU 核心(即半核)
          memory: 512M  # 最多使用 512MB 内存
    # 调试选项:保持标准输入打开、分配伪终端(便于进入容器调试)
    stdin_open: true
    tty: true
    #如果使用非常旧的 Docker 版本(<1.13),请使用旧语法:
    #mem_limit: 512m
    #cpu_shares: 512  # 0.5核心 ≈ 512 shares (1024=1核心)



#VPS版配置
#version: '3.8'  # 添加版本声明(使用3.4或更高版本)
services:
  nginx:
    #stdin_open: true
    #tty: true
    container_name: nginx
    ports:
      - 60:80
      #- 61:81
    volumes:
      #- ./html:/usr/share/nginx/html #/var/www/html      
      - /home/compose/mkdocs/docs/my-project/site:/usr/share/nginx/html #/var/www/html
      #- ./nginx:/etc/nginx
      - ./logs:/var/log/nginx
    image: nginx:alpine
    restart: always
    user: "root"  # 避免权限问题
    # 资源限制配置
    deploy:  # 在单机模式下使用deploy.resources  # 单机模式也支持这种语法
      resources:
        limits:
          #cpus: '0.5'
          #memory: 512M
          cpus: '0.1'
          memory: 356M
    # 添加调试选项(可选)
    stdin_open: true
    tty: true
    #如果使用非常旧的 Docker 版本(<1.13),请使用旧语法:
    #mem_limit: 512m
    #cpu_shares: 512  # 0.5核心 ≈ 512 shares (1024=1核心)



关键配置说明

配置项 说明与建议
image 使用 nginx:alpine,这是一个体积更小的镜像。
ports "60:80" 将容器内的 80 端口映射到主机的 60 端口。你可以根据需要修改主机端口(前面的60),但容器端口(后面的80)请保持不变
volumes /home/compose/mkdocs/docs/my-project/site:/usr/share/nginx/html 将你的静态网站目录映射到容器内 Nginx 的默认静态文件目录。./logs:/var/log/nginx 用于持久化存储 Nginx 的访问日志和错误日志,防止容器重启后日志丢失。
user: "root" 以 root 用户运行,可以避免一些权限问题。
deploy 限制容器使用的 CPU 和内存资源,避免过度消耗宿主机资源。

注意:关于数据持久化,你当前的配置已经挂载了网站目录和日志目录。如果你后续需要频繁修改 Nginx 配置(如虚拟主机、代理设置等),可以考虑将 Nginx 的配置目录也挂载出来。具体操作可参考下文"维护与管理"部分。

🚀 启动与验证

  1. 启动服务docker-compose.yml 文件所在目录执行: bash docker-compose up -d 此命令会拉取镜像(如果本地没有)并在后台启动容器。

  2. 检查服务状态 bash docker-compose ps 如果看到 nginx 容器的状态为 Up,就表示部署成功了。

  3. 查看实时日志(可选) 如果遇到问题,可以通过以下命令查看容器日志来排查: bash docker-compose logs -f nginx

  4. 访问验证 打开浏览器,访问 http://你的服务器IP:60

    • 如果一切正常,你将看到部署的静态网站内容。
    • 如果看到 Nginx 默认欢迎页,请检查挂载的网站目录(/home/compose/mkdocs/docs/my-project/site)内是否有正确的 index.html 文件。

⚙️ 基础配置与使用

阶段1 成功部署后,你可能需要对 Nginx 进行一些基础配置。

  1. 修改 Nginx 配置

    • 进入容器内部修改(临时调试)bash docker exec -it nginx /bin/sh 然后你可以使用容器内的编辑器(如 vi)直接修改 /etc/nginx/nginx.conf/etc/nginx/conf.d/default.conf 等配置文件。修改后,在容器内执行 nginx -s reload 重载配置。
    • 挂载外部配置目录(推荐用于生产环境)
      1. 先在宿主机创建配置目录,例如 mkdir -p /opt/docker/nginx/conf
      2. 将运行中容器的配置文件复制到宿主机: bash docker cp nginx:/etc/nginx/nginx.conf /opt/docker/nginx/conf/ docker cp nginx:/etc/nginx/conf.d /opt/docker/nginx/conf/
      3. docker-compose.ymlvolumes 部分增加配置目录的挂载: ```yaml volumes:
        • /home/compose/mkdocs/docs/my-project/site:/usr/share/nginx/html
        • ./logs:/var/log/nginx
        • ./conf/nginx.conf:/etc/nginx/nginx.conf:ro # 挂载主配置文件,只读
        • ./conf/conf.d:/etc/nginx/conf.d # 挂载子配置文件目录 ```
      4. 之后直接在宿主机上修改配置文件,重启容器 (docker-compose restart) 或让 Nginx 重载配置即可生效。
  2. 查看日志 日志文件位于你挂载的 ./logs 目录下(与 docker-compose.yml 同级的 logs 文件夹),通常包括 access.log(访问日志)和 error.log(错误日志)。你可以直接查看这些文件,或者使用 docker-compose logs -f nginx 命令。

阶段2 本教程中 Nginx 核心用途是 “托管 mkdocs 静态文档”,以下为新手常用操作:

1. 更新静态文档(mkdocs 内容修改后)

当 mkdocs 文档更新(如修改 Markdown 文件),需重新构建静态文件并让 Nginx 生效:

# 1. 进入 mkdocs 部署目录,重新构建静态文件
cd /home/compose/mkdocs/docs/my-project
docker compose exec mkdocs mkdocs build  # 容器内执行 mkdocs build,生成新的 site 目录

# 2. 无需重启 Nginx!Nginx 会实时读取挂载的 site 目录,刷新浏览器即可看到更新

2. 查看访问日志(了解谁在访问网站)

Nginx 访问日志保存在主机 ./logs/access.log,错误日志在 ./logs/error.log

# 实时查看访问日志(按 Ctrl+C 退出)
tail -f ./logs/access.log
  • 日志示例:192.168.1.200 - - [01/Oct/2024:10:30:00 +0800] "GET / HTTP/1.1" 200 1234 "-" "Mozilla/5.0"(表示 192.168.1.200 访问了首页,状态码 200 表示成功)。

3. 简单修改 Nginx 端口(进阶)

若需将访问端口从 60 改为 80(默认 HTTP 端口,无需输入端口号),步骤:

  1. 编辑 docker-compose.yml,将 ports: - 60:80 改为 ports: - 80:80
  2. 重启容器生效:docker compose down && docker compose up -d
  3. 访问时直接输入 http://服务器IP(无需加端口号)。

🔒 维护与管理

  • 服务管理

    • 停止服务docker-compose down
    • 重启服务docker-compose restart nginx
    • 查看服务状态docker-compose ps
  • 数据备份

    • 定期备份你的 docker-compose.yml 文件。
    • 备份你通过 volumes 挂载的所有重要目录,特别是网站源文件目录和自定义的 Nginx 配置目录。
  • 版本更新: Nginx 会定期发布更新,建议关注版本信息。 bash # 进入 docker-compose.yml 所在目录 docker-compose down docker-compose pull # 拉取最新镜像 docker-compose up -d # 可选:清理无用镜像 docker image prune 注意:更新前,如果挂载了 Nginx 配置目录,请确认新版本 Nginx 的配置语法和结构是否有重大变更,以免配置不兼容导致服务启动失败。

  • 监控 Nginx 运行状态: 通过 docker stats 可查看资源占用,若 CPU / 内存使用率过高,需排查是否有异常访问(如爬虫大量请求),可通过访问日志定位:

# 统计 top 10 访问 IP(查看是否有异常高频访问)
awk '{print $1}' ./logs/access.log | sort | uniq -c | sort -nr | head -10

🐛 常见问题排查 (FAQ)

问题现象 可能原因与解决方法
无法访问 http://服务器IP:60 1. 检查防火墙/安全组是否放行了 60 端口
2. 确认容器是否正常运行:docker-compose ps
3. 查看容器日志:docker-compose logs nginx
权限错误 (Permission denied) 1. 检查挂载的宿主机目录(如网站目录、日志目录)的权限,确保容器内进程(根据 user 设置)有读写权限。
2. 如果使用非 root 用户,确保该用户对挂载目录有相应权限。你配置中的 user: "root" 通常可避免此问题。
Nginx 欢迎页而非你的网站 1. 检查 volumes 中网站目录的挂载路径是否正确,宿主机源目录是否存在 index.html 等入口文件。
2. 确认挂载成功:可以进入容器查看 /usr/share/nginx/html 目录内容是否正确。
配置文件修改后未生效 1. 检查配置文件语法:docker exec nginx nginx -t
2. 重载 Nginx 配置:docker exec nginx nginx -s reload
3. 如果修改了挂载的宿主机配置文件,确保文件格式为 Unix (LF),而非 Windows (CRLF)。

常见问题排查

1. 访问 http://IP:60 显示 “无法访问此网站”

  • 原因 1:端口被占用(60 端口已被其他程序使用)。

    解决:执行 netstat -tuln | grep 60 查看占用程序,或修改 docker-compose.yml 的 ports 为空闲端口(如 8080:80),重启容器。 - 原因 2:防火墙 / 安全组未开放 60 端口。

    解决:开放端口(Linux UFW 命令:sudo ufw allow 60;云服务器需在安全组添加 “TCP 60 端口入站规则”)。

2. 访问显示 “403 Forbidden”

  • 原因 1:静态文件目录无 index.html(mkdocs 未构建或构建失败)。

    解决:进入 mkdocs 目录执行 docker compose exec mkdocs mkdocs build,确保 site 目录下生成 index.html。 - 原因 2:静态文件目录权限不足(Nginx 无法读取文件)。

    解决:执行 sudo chmod -R 755 /home/compose/mkdocs/docs/my-project/site,赋予读权限。

3. 日志无法生成(./logs 目录为空)

  • 原因:日志目录权限不足,Nginx 无法写入日志。
  • 解决:执行 sudo chmod -R 777 ./logs,重启容器后访问网站,日志会自动生成。

4. 进入容器后无法修改配置(权限不足)

  • 原因:虽配置 user: "root",但容器内部分目录默认权限限制。
  • 解决:进入容器时使用 root 用户(默认已为 root),或执行 docker compose exec --user root nginx sh 明确指定 root 用户。

5. mkdocs 文档更新后,Nginx 网页不刷新

  • 原因:浏览器缓存了旧页面,或 mkdocs 构建未覆盖旧文件。
  • 解决
    1. 浏览器按 Ctrl+Shift+R 强制刷新(清除缓存);
    2. 重新执行 mkdocs build(确保构建成功,无报错)。

希望这份教程能帮助你顺利完成 Nginx 的部署!享受 Docker 化带来的便捷吧!