使用Docker容器运行Nginx并实现反向代理
推荐使用 docker-compose 定义和运行多容器,本文实践时,尚未使用 docker-compose
;
1.安装nginx镜像与运行容器
1.拉取镜像
# 本文使用nginx镜像: nginx:alpine
sudo docker pull nginx:alpine
2.准备映射文件
mkdir -p ~/nginx/www ~/nginx/logs ~/nginx/conf.d
# 准备默认初始页、错误页、默认配置文件,置放于相应目录下
~/nginx/www/index.html
~/nginx/www/50.html
~/nginx/conf.d/default.conf
3.创建nginx容器
docker run -d -p 80:80 \
--name nginx-web \
-v ~/nginx/www:/usr/share/nginx/html \
-v ~/nginx/conf.d:/etc/nginx/conf.d \
-v ~/nginx/logs:/var/log/nginx \
nginx:alpine
2.实现反向代理
本文以代理gitlab容器为例说明,gitlab容器映射端口:5080;
1.创建相应配置文件
cd ~/nginx/conf.d
touch gitlab.conf
2.代理的程序的IP地址
# docker inspect : 获取容器/镜像的元数据
# 通过以下命令获取到容器IP地址, 如: 172.17.0.2
sudo docker inspect gitlab | grep 'IPAddress'
3.添加相应配置
- 如下配置中,server可设置为被代理容器的虚拟IP:PORT,或服务器真实IP:PORT;
- 若使用服务器真实IP:PORT,则需要对外开放相应端口,否则无须对外开放相应端口;
- 该处设置不能设置为
127.0.0.1:5080
或localhost:5080
,因其皆不等同于服务器真实IP;
upstream gitlab {
#被代理容器的虚拟IP:PORT 或 服务器真实IP:PORT
server 172.17.0.2:80;
}
server {
listen 80;
listen [::]:80;
server_name xxx.xxx.xx;
#access_log /var/log/nginx/host.access.log main;
server_name_in_redirect off;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location / {
proxy_pass http://gitlab/;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
重启nginx服务
# 进入容器
sudo docker exec nginx-web /bin/sh
# 校验配置文件语法格式
nginx -t
# 重启nginx服务
nginx -s reload
# 退出
exit