Docker swarm 容器无法解析另一个节点中容器的地址

Docker swarm container cannot resolve address of container in another node

我在我的 Vm 上启动了一个 swarm,并将另一个 Vm 作为管理器加入了我的 swarm。然后我覆盖一个网络 docker network create --attachable --driver overlay my-net.

然后我 运行 docker stack deploy 来部署我的服务。但是,当我执行一个容器并尝试从另一个节点 nslookup 一个容器时。例如 nslookup <container_name>

我得到了:

Server:         127.0.0.11
Address:        127.0.0.11#53

** server can't find <container_name>: NXDOMAIN

nslookup 到同一节点中的容器仍然有效。

我猜我的 DNS 在从另一个节点解析地址时无法正常工作,我想知道为什么。

附加信息:

两个节点的 netstat -l:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 *:ssh                   *:*                     LISTEN
tcp6       0      0 [::]:2377               [::]:*                  LISTEN
tcp6       0      0 [::]:7946               [::]:*                  LISTEN
tcp6       0      0 [::]:30283              [::]:*                  LISTEN
tcp6       0      0 [::]:30284              [::]:*                  LISTEN
tcp6       0      0 [::]:30285              [::]:*                  LISTEN
tcp6       0      0 [::]:30289              [::]:*                  LISTEN
tcp6       0      0 [::]:30290              [::]:*                  LISTEN
tcp6       0      0 [::]:30291              [::]:*                  LISTEN
tcp6       0      0 [::]:ssh                [::]:*                  LISTEN
udp        0      0 *:bootpc                *:*
udp        0      0 *:4789                  *:*
udp6     768      0 [::]:7946               [::]:*

ufw 状态显示未激活。

docker 检查(部分结果) 会不会是我的对端ip 10.0.0.5不正确?

"Peers": [
            {
                "Name": "c7feabf505ba",
                "IP": "10.0.0.5"
            },
            {
                "Name": "073e551404e8",
                "IP": "137.116.149.79"
            }
        ]

docker 信息节点 1:

Containers: 2
 Running: 2
 Paused: 0
 Stopped: 0
Images: 15
Server Version: 18.06.1-ce
Storage Driver: overlay2
 Backing Filesystem: extfs
 Supports d_type: true
 Native Overlay Diff: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
Swarm: active
 NodeID: ro2p9n7o33darkuylentq1nx0
 Is Manager: true
 ClusterID: 01q4hei9hzibq3x8m36pzqo8c
 Managers: 2
 Nodes: 2
 Orchestration:
  Task History Retention Limit: 5
 Raft:
  Snapshot Interval: 10000
  Number of Old Snapshots to Retain: 0
  Heartbeat Tick: 1
  Election Tick: 10
 Dispatcher:
  Heartbeat Period: 5 seconds
 CA Configuration:
  Expiry Duration: 3 months
  Force Rotate: 0
 Autolock Managers: false
 Root Rotation In Progress: false
 Node Address: 168.63.239.163
 Manager Addresses:
  137.116.149.79:2377
  168.63.239.163:2377
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 468a545b9edcd5932818eb9de8e72413e616e86e
runc version: 69663f0bd4b60df09991c08812a60108003fa340
init version: fec3683
Security Options:
 apparmor
 seccomp
  Profile: default
Kernel Version: 4.15.0-1025-azure
Operating System: Ubuntu 16.04.5 LTS
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 3.853GiB
Name: blockcord-staging2
ID: UT5F:4ZFW:4PRT:LGFS:JIV4:3YAD:DK5I:BIYL:FU6P:ZFEB:3OD3:U5EX
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
 127.0.0.0/8
Live Restore Enabled: false

docker 信息节点 2:

Containers: 1
 Running: 1
 Paused: 0
 Stopped: 0
Images: 15
Server Version: 18.06.0-ce
Storage Driver: overlay2
 Backing Filesystem: extfs
 Supports d_type: true
 Native Overlay Diff: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
Swarm: active
 NodeID: osmwr2fcrcg8mazopkanf4gr7
 Is Manager: true
 ClusterID: 01q4hei9hzibq3x8m36pzqo8c
 Managers: 2
 Nodes: 2
 Orchestration:
  Task History Retention Limit: 5
 Raft:
  Snapshot Interval: 10000
  Number of Old Snapshots to Retain: 0
  Heartbeat Tick: 1
  Election Tick: 10
 Dispatcher:
  Heartbeat Period: 5 seconds
 CA Configuration:
  Expiry Duration: 3 months
  Force Rotate: 0
 Autolock Managers: false
 Root Rotation In Progress: false
 Node Address: 10.0.1.6
 Manager Addresses:
  137.116.149.79:2377
  168.63.239.163:2377
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: d64c661f1d51c48782c9cec8fda7604785f93587
runc version: 69663f0bd4b60df09991c08812a60108003fa340
init version: fec3683
Security Options:
 apparmor
 seccomp
  Profile: default
Kernel Version: 4.15.0-1025-azure
Operating System: Ubuntu 16.04.4 LTS
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 1.885GiB
Name: doc2us-staging
ID: JG7Q:HZBH:7WIF:22GC:PZQQ:EXJC:ZDPT:C2SA:TDRM:XJ4M:KKX4:OAEI
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
 127.0.0.0/8
Live Restore Enabled: false

原因是因为当我使用 docker swarm join 命令时,docker 自动使用我的内部 ip 加入。

我必须这样做

docker swarm join --token ...... --advertise-addr .

学分 https://github.com/docker/swarmkit/issues/1429#issuecomment-329325410