Docker Swarm 覆盖网络上的端口转发
Port forward on Docker Swarm overlay network
我在覆盖网络下有一个 flask 和一个 mysql 服务 运行,每个都发布一个端口(分别为 8080 和 3306)。这是 my-network
的检查
"Containers": {
"4698a46d9748b802c74d3eb3cd47c76b9c8ff9fb2aa954338be3ec0ca6fba028": {
"Name": "mysql-app.1.bfoy8mz5ts9mb7jmuyaqy1ytu",
"EndpointID": "4c229598a84bc2a3488c24cf15f870bbaa7c48a9b67801558bc9c6382f0f8445",
"MacAddress": "02:42:0a:00:00:03",
"IPv4Address": "10.0.0.3/24",
"IPv6Address": ""
},
"4ca9811fe4e04d4ec9a8b0d887b7d971c7d6251e08702729487c2de531dc582f": {
"Name": "flask-app.1.56j825gcgfrfvv2vkj6e65seu",
"EndpointID": "260568e4f00aa596ed1fd2b68c51eaf9827d602f54d9d0573d6fcd1da038e899",
"MacAddress": "02:42:0a:00:00:06",
"IPv4Address": "10.0.0.6/24",
"IPv6Address": ""
}
},
我可以使用 10.0.0.3
通过 Flask 连接到 MySQL。这不是有保证的 IP 地址,无法手动设置。我希望有一种方法可以连接到 MySQL,而无需首先检查其 IP。
这是我当前创建服务的命令:docker service create -p 3306:3306 --network my-network --replicas 2 -e MYSQL_ROOT_PASSWORD=password --name mysql-app mysql
。我的假设是将端口发布到 3306 会将其转发到 my-network
,然后我可以连接到 my-network
的网关。
DNSRR 是 docker 集群模式的关键概念:https://docs.docker.com/engine/swarm/key-concepts/#load-balancing
因为您正在使用 --name mysql-app
部署您的 MySQL 服务并在同一网络 --network my-network
中分配您的 flask-app
,这两个服务可以通过它们的姓名。无需弄清楚IP地址。
尝试
# create a test network
docker network create testnetwork
# start mariadb
docker run -d --name bettermysql --network testnetwork -e MYSQL_ROOT_PASSWORD=nomysql mariadb:latest
# start some other linux and ping mariadb by name
docker run -ti --network testnetwork alpine:3.7 /bin/sh
/ # ping bettermysql
PING bettermysql (172.19.0.2): 56 data bytes
64 bytes from 172.19.0.2: seq=0 ttl=64 time=1.661 ms
...
当您在 swarm 模式下开发时,您希望在 docker network create
命令中使用 --attachable
选项。您可以使用普通 docker 容器 (docker run ...
) 访问覆盖网络进行测试和调试。
TL;DR
在您的 flask-app
配置中将 mysql-app
用作 MYSQL_HOST
。
我在覆盖网络下有一个 flask 和一个 mysql 服务 运行,每个都发布一个端口(分别为 8080 和 3306)。这是 my-network
"Containers": {
"4698a46d9748b802c74d3eb3cd47c76b9c8ff9fb2aa954338be3ec0ca6fba028": {
"Name": "mysql-app.1.bfoy8mz5ts9mb7jmuyaqy1ytu",
"EndpointID": "4c229598a84bc2a3488c24cf15f870bbaa7c48a9b67801558bc9c6382f0f8445",
"MacAddress": "02:42:0a:00:00:03",
"IPv4Address": "10.0.0.3/24",
"IPv6Address": ""
},
"4ca9811fe4e04d4ec9a8b0d887b7d971c7d6251e08702729487c2de531dc582f": {
"Name": "flask-app.1.56j825gcgfrfvv2vkj6e65seu",
"EndpointID": "260568e4f00aa596ed1fd2b68c51eaf9827d602f54d9d0573d6fcd1da038e899",
"MacAddress": "02:42:0a:00:00:06",
"IPv4Address": "10.0.0.6/24",
"IPv6Address": ""
}
},
我可以使用 10.0.0.3
通过 Flask 连接到 MySQL。这不是有保证的 IP 地址,无法手动设置。我希望有一种方法可以连接到 MySQL,而无需首先检查其 IP。
这是我当前创建服务的命令:docker service create -p 3306:3306 --network my-network --replicas 2 -e MYSQL_ROOT_PASSWORD=password --name mysql-app mysql
。我的假设是将端口发布到 3306 会将其转发到 my-network
,然后我可以连接到 my-network
的网关。
DNSRR 是 docker 集群模式的关键概念:https://docs.docker.com/engine/swarm/key-concepts/#load-balancing
因为您正在使用 --name mysql-app
部署您的 MySQL 服务并在同一网络 --network my-network
中分配您的 flask-app
,这两个服务可以通过它们的姓名。无需弄清楚IP地址。
尝试
# create a test network
docker network create testnetwork
# start mariadb
docker run -d --name bettermysql --network testnetwork -e MYSQL_ROOT_PASSWORD=nomysql mariadb:latest
# start some other linux and ping mariadb by name
docker run -ti --network testnetwork alpine:3.7 /bin/sh
/ # ping bettermysql
PING bettermysql (172.19.0.2): 56 data bytes
64 bytes from 172.19.0.2: seq=0 ttl=64 time=1.661 ms
...
当您在 swarm 模式下开发时,您希望在 docker network create
命令中使用 --attachable
选项。您可以使用普通 docker 容器 (docker run ...
) 访问覆盖网络进行测试和调试。
TL;DR
在您的 flask-app
配置中将 mysql-app
用作 MYSQL_HOST
。