![在覆盖网络中使用 docker swarm 节点时,如果从另一台主机连接,则会丢失连接](https://linux22.com/image/1549278/%E5%9C%A8%E8%A6%86%E7%9B%96%E7%BD%91%E7%BB%9C%E4%B8%AD%E4%BD%BF%E7%94%A8%20docker%20swarm%20%E8%8A%82%E7%82%B9%E6%97%B6%EF%BC%8C%E5%A6%82%E6%9E%9C%E4%BB%8E%E5%8F%A6%E4%B8%80%E5%8F%B0%E4%B8%BB%E6%9C%BA%E8%BF%9E%E6%8E%A5%EF%BC%8C%E5%88%99%E4%BC%9A%E4%B8%A2%E5%A4%B1%E8%BF%9E%E6%8E%A5.png)
使用以下命令通过 docker 创建我的服务:
docker service create --mount
type=bind,src=/tmp/postgres,dst=/var/lib/postgresql/data
--name dev_db
--network mynetwork -p 5432:5432 -d postgres
问题是,如果我不使用覆盖网络--network
,我可以仅使用简单的 postgresql 客户端从另一台主机连接到这个 docker 实例:
psql -h (ipofthehost) mydatabase -Umydatabase
但现在我想从另一台主机连接它时出现此错误:
psql: could not connect to server: Connection refused
Is the server running on host "ipofdehost" and accepting
TCP/IP connections on port 5432?
这告诉我它可能正在运行,但它看不到它。我使用以下命令验证了该服务是否正在运行:
docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
8hr0qwtca230 dev_db replicated 1/1 postgres:latest *:5432->5432/tcp
我通过 ss 验证了该服务是否正在监听:
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 :::22 :::*
LISTEN 0 128 :::5432 :::*
LISTEN 0 128 :::12376 :::*
LISTEN 0 100 ::1:25 :::*
LISTEN 0 128 :::443 :::*
它似乎因为该行而处于监听状态::::5432
,但对我来说,这似乎仅适用于 ipv6 连接,那么我怎样才能让它监听 ipv4 连接呢?我所做的所有改变就是将该节点连接到覆盖网络,所以我不明白为什么如果我让它公开端口却不公开。
谢谢你!
答案1
要明确设置覆盖主机网卡上的监听,首先确定覆盖接口的 IP 地址,然后将运行命令修改为:
docker service create --mount
type=bind,src=/tmp/postgres,dst=/var/lib/postgresql/data --name dev_db --network mynetwork -p host-overlay-ipv4:5432:5432 -d postgres
将 host-overlay-ipv4 替换为正确的覆盖 IPv4 地址。
有关 Docker CLI 的更多信息,请访问本维基。