1. 准备宿主机目录

首先,在你的服务器(宿主机)上创建存放配置和内容的目录。建议先从一个运行中的 Nginx 容器中拷贝默认配置文件,以防自己手写的配置缺少关键参数。

创建配置文件夹
mkdir -p /docker/nginx/conf
mkdir -p /docker/nginx/html
mkdir -p /docker/nginx/logs

先启动一个临时容器,把默认配置拷贝出来
docker run --name tmp-nginx -d nginx
docker cp tmp-nginx:/etc/nginx/nginx.conf /docker/nginx/conf/nginx.conf
docker cp tmp-nginx:/etc/nginx/conf.d /docker/nginx/conf/
docker rm -f tmp-nginx

2. 使用 docker run 挂载启动

通过 -v 参数将宿主机的目录与容器内部目录建立映射关系。

docker run -d \
  --name my-nginx \
  -p 80:80 \
  -v /docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro \
  -v /docker/nginx/conf/conf.d:/etc/nginx/conf.d:ro \
  -v /docker/nginx/html:/usr/share/nginx/html:rw \
  -v /docker/nginx/logs:/var/log/nginx \
  nginx

关键参数解析:

  1. -v /.../nginx.conf:/etc/nginx/nginx.conf: 挂载主配置文件。

  2. -v /.../conf.d:/etc/nginx/conf.d: 挂载子配置目录(通常用于存放虚拟主机 server 块)。

  3. :ro (Read Only): 设置容器内为只读权限,增加安全性,防止容器内部意外修改宿主机配置。

  4. :rw (Read Write): HTML 目录通常设置为读写,方便上传网页文件。

3. 修改配置并生效

当你需要修改 Nginx 配置(例如更改反向代理地址或添加域名)时:

直接编辑宿主机文件:vim /docker/nginx/conf/conf.d/default.conf

无需删除容器,直接检查语法并重载:

# 检查语法是否正确
docker exec my-nginx nginx -t

# 重新加载配置
docker exec my-nginx nginx -s reload

常见避坑指南

常见问题 原因及对策
容器启动后立即退出 通常是 nginx.conf 路径挂载成了目录。如果宿主机不存在该文件就挂载,Docker 会默认创建一个同名目录,导致 Nginx 启动失败。
403 Forbidden 检查宿主机 /docker/nginx/html 的权限,确保容器内的 nginx 用户有权限读取。
配置不生效 确认你修改的是 conf.d/ 下的具体配置文件,还是 nginx.conf。现代 Nginx 镜像通常在主配置里 include 了 conf.d/*.conf。