在覆盖网络中使用 docker swarm 节点时,如果从另一台主机连接,则会丢失连接

在覆盖网络中使用 docker swarm 节点时,如果从另一台主机连接,则会丢失连接

使用以下命令通过 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 的更多信息,请访问本维基

相关内容