之前一直是通过包管理的方式或者源码编译的方式来安装 Nginx,最近喜欢上了 Docker ,这里记录一下使用 Docker 配置 Nginx 及遇到的问题

获取配置文件

先创建一个 Nginx 容器,拷贝出来其中的配置文件

1
2
3
docker run -d \
--name nginx \
nginx:latest

拷贝容器内 Nginx 默认配置文件到 /etc/nginx 目录下(前面的是容器内路径,后面的是自己指定的目录)

1
2
docker cp nginx:/etc/nginx /etc/nginx
docker cp nginx:/usr/share/nginx/html /etc/nginx

停止并删除容器

1
docker stop nginx && docker rm nginx

重新安装 Nginx 容器

这次把 80 和 443 端口映射出来,映射配置文件的路径到刚才配置的路径(-v 前面的路径是自己的配置路径,后面的是容器内路径)

1
2
3
4
5
6
7
docker run -d \
-p 80:80 \
-p 443:443 \
--name nginx \
--restart=always \
-v /etc/nginx:/etc/nginx/ \
nginx:latest

配置完成后访问 80 端口,就可以正常看到 Nginx 的欢迎页面了(如果有问题的话,检查防火墙)

反向代理其他容器

这里需要注意的是如果反向代理其他容器,因为 Nginx 也在容器中的原因,默认代理 127.0.0.1 的话访问的是 Nginx 自己的网络,而不是宿主机的网络,这里需要用需要反向代理的容器 ip 才可以,否则就是 502 bad gateway 错误

查看需要反向代理的容器 ip

1
docker inspect 容器ID

在 “Networks”: 中找到 “IPAddress” 即可

配置反向代理

在上面配置过的 /etc/nginx/conf.d/ 目录下新建自己需要的反向代理配置文件即可,注意修改为需要反向代理的容器 ip,比如新建一个 80.conf

1
2
3
4
5
6
7
8
9
10
11
12
server {
listen 80;
server_name example.com;

location / {
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;
proxy_pass http://172.17.0.3:8080;
}
}

完成后重启 Nginx 容器

1
docker restart nginx