🚀 使用 Docker Compose 部署 Nginx
🚀 使用 Docker Compose 部署 Nginx
本教程将详细介绍如何使用 Docker Compose 部署 Nginx。Nginx 是一个高性能的 HTTP 和反向代理服务器,在 Docker 环境中部署可以简化配置管理、实现环境隔离,并便于快速部署和扩展。
📦 项目简介
Nginx 以其高并发处理能力、低内存占用和模块化设计而闻名。在 Docker 中部署 Nginx 的主要优势包括:
- 环境一致性:确保开发、测试和生产环境的一致性。
- 快速部署与扩展:可以快速启动多个实例,并结合负载均衡器使用。
- 配置与数据持久化:通过挂载宿主机目录,确保容器重建时配置和日志不丢失。
⚙️ 部署前准备
-
环境要求
- 确保你的系统已安装 Docker 和 Docker Compose。
- 系统内存:建议 512MB 以上。
- 确保计划使用的端口(例如配置文件中的
60)未被占用。
-
环境检查 在终端中执行以下命令,确认 Docker 环境正常:
bash docker --version docker-compose --version -
创建项目目录 建议创建一个独立的目录来管理所有部署文件,这有助于日后管理和备份。
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 的配置目录也挂载出来。具体操作可参考下文"维护与管理"部分。
🚀 启动与验证
-
启动服务 在
docker-compose.yml文件所在目录执行:bash docker-compose up -d此命令会拉取镜像(如果本地没有)并在后台启动容器。 -
检查服务状态
bash docker-compose ps如果看到nginx容器的状态为Up,就表示部署成功了。 -
查看实时日志(可选) 如果遇到问题,可以通过以下命令查看容器日志来排查:
bash docker-compose logs -f nginx -
访问验证 打开浏览器,访问
http://你的服务器IP:60。- 如果一切正常,你将看到部署的静态网站内容。
- 如果看到 Nginx 默认欢迎页,请检查挂载的网站目录(
/home/compose/mkdocs/docs/my-project/site)内是否有正确的index.html文件。
⚙️ 基础配置与使用
阶段1 成功部署后,你可能需要对 Nginx 进行一些基础配置。
-
修改 Nginx 配置
- 进入容器内部修改(临时调试):
bash docker exec -it nginx /bin/sh然后你可以使用容器内的编辑器(如vi)直接修改/etc/nginx/nginx.conf或/etc/nginx/conf.d/default.conf等配置文件。修改后,在容器内执行nginx -s reload重载配置。 - 挂载外部配置目录(推荐用于生产环境):
- 先在宿主机创建配置目录,例如
mkdir -p /opt/docker/nginx/conf。 - 将运行中容器的配置文件复制到宿主机:
bash docker cp nginx:/etc/nginx/nginx.conf /opt/docker/nginx/conf/ docker cp nginx:/etc/nginx/conf.d /opt/docker/nginx/conf/ - 在
docker-compose.yml的volumes部分增加配置目录的挂载: ```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 # 挂载子配置文件目录 ```
- 之后直接在宿主机上修改配置文件,重启容器 (
docker-compose restart) 或让 Nginx 重载配置即可生效。
- 先在宿主机创建配置目录,例如
- 进入容器内部修改(临时调试):
-
查看日志 日志文件位于你挂载的
./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 端口,无需输入端口号),步骤:
- 编辑
docker-compose.yml,将ports: - 60:80改为ports: - 80:80; - 重启容器生效:
docker compose down && docker compose up -d; - 访问时直接输入
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 构建未覆盖旧文件。
- 解决:
- 浏览器按
Ctrl+Shift+R强制刷新(清除缓存); - 重新执行
mkdocs build(确保构建成功,无报错)。
- 浏览器按
希望这份教程能帮助你顺利完成 Nginx 的部署!享受 Docker 化带来的便捷吧!