Nginx反向代理多个docker容器

场景:

配置一个docker nginx容器,希望可以反向代理多个docker容器。

nginx反向代理docker容器架构

注意
  1. 所有docker容器(包括nginx)之间是相互隔离的,即nginx容器的不能直接访问其他docker容器,而且nginx容器不可以与其他容器连接到一个bridge网络内(这么做会失去隔离性)。
  2. 所有的docker容器都可以访问外网(即docker网络以外的网络,包括宿主机和因特网)

解决方式

  1. 除了docker-nginx以外的每个容器对外映射端口,通过宿主机的映射端口可以直接访问docker容器。

  2. 配置nginx容器的nginx.conf,将特定域名和端口的服务反向代理到宿主机的不同映射端口(此映射端口关联的是docker容器)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    server {
    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项目

    本解决方案的架构图与该博客的架构类似,如下图所示。

    image.png

    最后,在nginx.conf所在目录,使用docker构建并启动nginx容器,命令如下

    1
    2
    sudo docker run -d --name proxy-nginx -p 80:80 -v \
    $(pwd)/nginx.conf:/etc/nginx/nginx.conf --restart always nginx

参考链接: