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:8080
和 localhost:8443
上访问它:
...
network_mode: host
# ports:
# - "80:8080"
# - "443:8443"
volumes:
...
运行 主机网络上的容器不是我通常推荐的东西,但因此您的设置非常特别,在一个 docker 主机上有一个容器 运行ning 并且另一个容器 运行 在另一个独立的 docker 主机中,我假设您不想创建覆盖网络并最终将两个 docker 主机注册到一个群中。
我有两台服务器 (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:8080
和 localhost:8443
上访问它:
...
network_mode: host
# ports:
# - "80:8080"
# - "443:8443"
volumes:
...
运行 主机网络上的容器不是我通常推荐的东西,但因此您的设置非常特别,在一个 docker 主机上有一个容器 运行ning 并且另一个容器 运行 在另一个独立的 docker 主机中,我假设您不想创建覆盖网络并最终将两个 docker 主机注册到一个群中。