1

当运行 docker 容器一个 swarm 集群时,容器是否可以通过 ENV 变量或其他方式访问集群节点的所有 IP?

我想在集群中的每个节点上运行一个 Elasticsearch 实例。他们将以单播模式相互发现。因此,每个 Elasticsearch 实例都需要配置集群中的 IP 列表。

4

2 回答 2

0

如果您的意思是一个节点的容器可以访问另一个节点的容器IP,那么这是不可能的。您必须使用编织工具跨不同节点或其他工具连接容器。

于 2015-06-01T17:42:20.227 回答
0

如果您使用带有 swam 覆盖网络的最新 Docker (1.13+),您应该能够通过 DNS 循环获取所有集群的节点 IP。(--endpoint-mode dnsrr)

1) 创建一个覆盖网络。

https://docs.docker.com/engine/swarm/networking/

docker network create \
  --driver overlay \
  my-network

2)验证游泳节点:

docker@node1:~$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS
5l07yt2itiee60xfq7g6c01e4 *   node1               Ready               Active              Leader
pckn7qo3xpbxvs89ni6whyql3     node2               Ready               Active              

3)使用“全局”模式在每个节点上创建一个 alpine 容器:

docker service create --mode global --endpoint-mode dnsrr --name testservice --detach=true --network my-network alpine ash -c "apk update;apk add drill; ping docker.com"

4)验证服务是否正在运行:

docker@node1:~$ docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
lmy5s3flw763        testservice         global              2/2                 alpine:latest 

5) 验证容器是否部署在各个节点上:

$ docker-machine ssh node1 "docker ps"
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
4c7055b01479        alpine:latest       "ash -c 'apk updat..."   2 minutes ago       Up 2 minutes                            testservice.5l07yt2itiee60xfq7g6c01e4.atvascigh3rvxvlzttaotkrua

$ docker-machine ssh node2 "docker ps"
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
28da546aa0d5        alpine:latest       "ash -c 'apk updat..."   2 minutes ago       Up 2 minutes                            testservice.pckn7qo3xpbxvs89ni6whyql3.ebjz4asni4w1f0srna0p3vj4a

6)确认node1和node2上每个容器的单独虚拟IP:

| => docker-machine ssh node1 "docker exec 4c7055b01479 ash -c 'ip addr'|grep eth0"
349: eth0@if350: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue state UP 
    inet 10.0.0.2/24 scope global eth0


| => docker-machine ssh node2 "docker exec 28da546aa0d5 ash -c 'ip addr'|grep eth0"
319: eth0@if320: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue state UP 
    inet 10.0.0.3/24 scope global eth0

7) 使用 Drill dns 工具获取集群中所有容器的容器 IP 地址:

| => docker-machine ssh node1 "docker exec 4c7055b01479 ash -c 'drill testservice'"
;; ->>HEADER<<- opcode: QUERY, rcode: NOERROR, id: 60920
;; flags: qr rd ra ; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0 
;; QUESTION SECTION:
;; testservice. IN  A

;; ANSWER SECTION:
testservice.    600 IN  A   10.0.0.3
testservice.    600 IN  A   10.0.0.2

;; AUTHORITY SECTION:

;; ADDITIONAL SECTION:

;; Query time: 0 msec
;; SERVER: 127.0.0.11
;; WHEN: Thu Jul 20 19:20:49 2017
;; MSG SIZE  rcvd: 83

8) 验证容器是否可以互相 ping 通:

docker-machine ssh node1 "docker exec 4c7055b01479 ash -c 'ping -c2 10.0.0.3'"
PING 10.0.0.3 (10.0.0.3): 56 data bytes
64 bytes from 10.0.0.3: seq=0 ttl=64 time=0.539 ms
64 bytes from 10.0.0.3: seq=1 ttl=64 time=0.731 ms

--- 10.0.0.3 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.539/0.635/0.731 ms



docker-machine ssh node2 "docker exec 28da546aa0d5 ash -c 'ping -c2 10.0.0.2'"
PING 10.0.0.2 (10.0.0.2): 56 data bytes
64 bytes from 10.0.0.2: seq=0 ttl=64 time=0.579 ms
64 bytes from 10.0.0.2: seq=1 ttl=64 time=0.736 ms

--- 10.0.0.2 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.579/0.657/0.736 ms
于 2017-07-20T19:58:34.523 回答