场景:
配置一个docker nginx容器,希望可以反向代理多个docker容器。
注意
- 所有docker容器(包括nginx)之间是相互隔离的,即nginx容器的不能直接访问其他docker容器,而且nginx容器不可以与其他容器连接到一个
bridge
网络内(这么做会失去隔离性)。 - 所有的docker容器都可以访问外网(即docker网络以外的网络,包括宿主机和因特网)
解决方式
除了docker-nginx以外的每个容器对外映射端口,通过宿主机的映射端口可以直接访问docker容器。
配置nginx容器的nginx.conf,将特定域名和端口的服务反向代理到宿主机的不同映射端口(此映射端口关联的是docker容器)
1
2
3
4
5
6
7
8
9
10
11
12
13
14server {
listen 80;
server_name md.me.com;
location / {
# 172.17.0.1是宿主机docker0网卡的位置
# 如果将docker-nginx连接到host网络,该IP可直接写localhost
proxy_pass http://172.17.0.1:88;
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的地址——172.17.0.1是宿主机的docker0网卡的地址,因机器而异。
原因:宿主机上任意一个网卡的内网IP地址都可以代表宿主机本身,由于docker0的地址比较稳定,故采用该地址。
如果直接将docker-nginx链接到
host
网络,也就是设定docker-nginx与主机同享物理网络,则proxy_pass可以直接填写localhost。如果docker-nginx链接的是
bridge
网络,localhost代表的地址是容器内部,这一点请与host
网络相区分。这部分涉及到的知识点是“docker访问宿主机网络”,此处提供一处链接:Docker容器访问宿主机网络的方法
优势
减少服务器防火墙或者安全组暴露的端口,只通过域名对外访问
更直观一点的图:
参考博客:Docker nginx部署二级域名访问多个web项目
本解决方案的架构图与该博客的架构类似,如下图所示。
最后,在nginx.conf所在目录,使用docker构建并启动nginx容器,命令如下
1
2sudo docker run -d --name proxy-nginx -p 80:80 -v \
$(pwd)/nginx.conf:/etc/nginx/nginx.conf --restart always nginx
参考链接: