Docker 容器与不同 host/server 上的其他容器通信

Docker container communication with other container on diffirent host/server

我有两台服务器 (CentOS8)。
在 server1 上我有 mysql-server 容器,在 server2 上我有 zabbix-front-end 即 zabbix-web-apache-mysql(容器名称 zabbixfrontend)。 我正在尝试从 zabbixfrontend 容器连接到 mysql-server。获取错误

bash-4.4$ mysql -h <MYSQL_SERVER_IP> -P 3306 -uroot -p 
Enter password: 
ERROR 2002 (HY000): Can't connect to MySQL server on '<MYSQL_SERVER_IP>' (115)

当我从 zabbixfrontend 容器执行 nc 到我的 mysql-server IP 时,我得到“没有到主机的路由”。错误信息。

bash-4.4$ nc -zv <MYSQL_SERVER_IP> 3306
Ncat: Version 7.70 ( https://nmap.org/ncat )
Ncat: No route to host.

注意:我成功地从主机(服务器 2)mysql-服务器容器执行 nc。

docker-compose.yml

version: '3.5'
services:
 zabbix-web-apache-mysql:
  image: zabbix/zabbix-web-apache-mysql:centos-8.0-latest
  container_name: zabbixfrontend
  #network_mode: host
  ports:
   - "80:8080"
   - "443:8443"
  volumes:
   - /etc/localtime:/etc/localtime:ro
   - /etc/timezone:/etc/timezone:ro
   - ./zbx_env/etc/ssl/apache2:/etc/ssl/apache2:ro
   - ./usr/share/zabbix/:/usr/share/zabbix/
  env_file:
   - .env_db_mysql
   - .env_web
  secrets:
   - MYSQL_USER
   - MYSQL_PASSWORD
   - MYSQL_ROOT_PASSWORD
     # zbx_net_frontend:
  sysctls:
   - net.core.somaxconn=65535

secrets:
  MYSQL_USER:
    file: ./.MYSQL_USER
  MYSQL_PASSWORD:
    file: ./.MYSQL_PASSWORD
  MYSQL_ROOT_PASSWORD:
    file: ./.MYSQL_ROOT_PASSWORD

docker logs zabbixfrontend出如下

** Deploying Zabbix web-interface (Apache) with MySQL database
** Using MYSQL_USER variable from ENV
** Using MYSQL_PASSWORD variable from ENV
********************
* DB_SERVER_HOST: <MYSQL_SERVER_IP>
* DB_SERVER_PORT: 3306
* DB_SERVER_DBNAME: zabbix
********************
**** MySQL server is not available. Waiting 5 seconds...
**** MySQL server is not available. Waiting 5 seconds...
**** MySQL server is not available. Waiting 5 seconds...
**** MySQL server is not available. Waiting 5 seconds...
**** MySQL server is not available. Waiting 5 seconds...
**** MySQL server is not available. Waiting 5 seconds...
**** MySQL server is not available. Waiting 5 seconds...
**** MySQL server is not available. Waiting 5 seconds...

nc 消息说的是事实:没有到主机的路由

发生这种情况是因为当您在 docker bridge 网络中部署 front-end 容器时,其 IP 地址属于 172.18.0.0/16 子网,而您正在尝试通过属于不同子网 (10.0.0.0/16) 的 IP 地址访问数据库。

另一方面,当你在 host 网络上部署你的 front-end 容器时,你不再面临那个问题,因为现在 IP 实际上是使用主机的 IP 地址, 10.0.0.2 并且不需要显式创建到达 10.0.0.3 的路由。
现在您面临的问题是您无法再通过浏览器访问 web-ui。发生这种情况是因为我假设您在 docker-compose.yml 中保留了 ports:" 选项并尝试访问 localhost:80/443 上的服务。如果您 运行 主机网络上的容器,则不需要指定源端口和目标端口。容器将直接在容器内打开的端口上的主机上侦听。

尝试使用此配置 运行 front-end 容器,然后在 localhost:8080localhost:8443 上访问它:

...  
network_mode: host
#  ports:
#   - "80:8080"
#   - "443:8443"
  volumes:
...

运行 主机网络上的容器不是我通常推荐的东西,但因此您的设置非常特别,在一个 docker 主机上有一个容器 运行ning 并且另一个容器 运行 在另一个独立的 docker 主机中,我假设您不想创建覆盖网络并最终将两个 docker 主机注册到一个群中。