服务器上有很多 Docker 容器,它们没有设置端口映射,而是通过统一的前端 Nginx 程序反代。这样做的好处是在外部可以访问内部 Docker 服务,又不用浪费宝贵的外部端口。

原理

每个Docker容器都有自己的主机名和 内部 IP,即使不设置外部端口映射,在内部分配的 IP 上也会有对应的端口监听。举例来说,我的主机上Wekan容器基本信息如下:

container_name:wekan-app
ip:172.19.0.xxx
Network:network_group1(bridge)

操作另一个容器加入network_group1网络组,在该容器内 ping Wekan 容器名:

之后尝试访问该容器的服务:

此时两个容器间可以互相通信。

操作

1.容器互通

首先准备一个 Nginx 容器,掠过不表。

之后将Nginx容器加入到Wekan容器的网络组中。使用Protainer的话这一步非常简单,只需要选择对应的网络并点击Join network即可:

为了验证容器间是否可以通信,可以手动 ping 一下 wekan 容器。

2.修改 Wekan 配置

编辑 Wekan 配置,将ROOT_URL修改为外部使用的访问地址,例如 mywekan.test.com

3.修改 Nginx 配置

修改 Nginx 配置是为了增加访问地址监听及反代转发。

由于 Wekan 使用了websocket通信,因此在配置文件中需要增加Upgrade等字段:

map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}
server {
    listen       80;
    server_name  mywekan.test.com;
    #access_log /dev/null;
    #access_log  /var/log/nginx/nginx.localhost.access.log  main;
    error_log  /var/log/nginx/mywekan.test.com.error.log  warn;
    location / {
            proxy_pass http://wekan-app:8080;
            index  index.html index.htm;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            proxy_set_header X-Forwarded-For $remote_addr;
    }
    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    location ~ /\.ht {
       deny  all;
    }
}

其他字段按需添加即可。

完成后,重启 Nginx 容器,访问mywekan.test.com即可看到效果。

梓喵出没博客(azimiao.com)版权所有,转载请注明链接:https://www.azimiao.com/6722.html
欢迎加入梓喵出没博客交流群:313732000

我来吐槽

*

*