Docker容器访问群集IP

时间:2015-05-13 21:48:28

标签: docker docker-swarm

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

如果您使用最新的Docker(1.13 +)和swam覆盖网络,您应该能够通过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)使用" global"在每个节点上创建一个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