一、 DNS服务发现
1. 实现功能
在同一个overlay网络network下,在swarm集群上面启动docker service服务,docker引擎会自动创建一个DNS服务。使每一个服务对应一个虚拟IP,此时通过docker服务名即可以访问该服务。无论该服务今后如何拓展,虚拟网络ip是不会变化的。
2.发现服务框架
![](https://i-blog.csdnimg.cn/blog_migrate/bdee5ee8d5b49d489233cf2587b7690e.png)
二、实例
1.创建demo的overlay网络
docker network create -d overlay demo
2.创建whoami服务
[vagrant@swarm-manager ~]$ docker service create --name whoami -p 8000:8000 -d --network demo jwilder/whoami
knns4nhln5ten8cvnxmwcg868
3.查看whoami服务启动状态
(1)查看启动服务
[vagrant@swarm-manager ~]$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
qwr4cuyrr86a client replicated 1/1 busybox:latest
knns4nhln5te whoami replicated 1/1 jwilder/whoami:latest *:8000->8000/tcp
(2)查看运行地点
[vagrant@swarm-manager ~]$ docker service ps whoami
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
damei4u1ihx7 whoami.1 jwilder/whoami:latest swarm-worker2 Running Running 45 seconds ago
(3)查看whoami服务运行的worker2节点,服务运行状态
[vagrant@swarm-worker2 ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
31b30e072daa jwilder/whoami:latest "/app/http" 2 minutes ago Up 2 minutes 8000/tcp whoami.1.damei4u1ihx7hgrg7rufievaf
[vagrant@swarm-worker2 ~]$ curl 127.0.0.1:8000
I'm 31b30e072daa
4.创建busy box客户端service服务
vagrant@swarm-manager ~]$ docker service create --name client -d --network demo busybox sh -c "while true; do sleep 3600; done"
qwr4cuyrr86avmgq6q8xp18ig
5.查看busybox服务service信息
(1)查看整体状态
[vagrant@swarm-manager ~]$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
qwr4cuyrr86a client replicated 1/1 busybox:latest
knns4nhln5te whoami replicated 1/1 jwilder/whoami:latest *:8000->8000/tcp
[vagrant@swarm-
[vagrant@swarm-manager ~]$ docker service ps client
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
ywnrazvemzij client.1 busybox:latest swarm-worker1 Running Running 7 minutes ago
(2)进入worker1查看运行进程
[vagrant@swarm-worker1 ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5e41a868d69d busybox:latest "sh -c 'while true; …" 9 minutes ago Up 9 minutes client.1.ywnrazvemzijjch7ust01tf34
(3)进入busybox,运行shell
[vagrant@swarm-worker1 ~]$ docker exec -it 5e41a sh
/ #
(4)ping whoami
[vagrant@swarm-worker1 ~]$ docker exec -it 5e41a sh
/ # ping whoami
PING whoami (10.0.0.11): 56 data bytes
64 bytes from 10.0.0.11: seq=0 ttl=64 time=0.237 ms
64 bytes from 10.0.0.11: seq=1 ttl=64 time=0.096 ms
64 bytes from 10.0.0.11: seq=2 ttl=64 time=0.074 ms
64 bytes from 10.0.0.11: seq=3 ttl=64 time=0.071 ms
^C
--- whoami ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.071/0.119/0.237 ms
/ #
(5)但是这个10.0.0.11地址不是whoami所在容器的真实地址!
三、虚拟ip概念(10.0.0.11)
1.扩展whoami为两个服务
[vagrant@swarm-manager ~]$ docker service scale whoami=2
whoami scaled to 2
overall progress: 2 out of 2 tasks
1/2: running
2/2: running
verify: Service converged
2.查看whoami服务
(1)总体详细状态
[vagrant@swarm-manager ~]$ docker service ps whoami
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
damei4u1ihx7 whoami.1 jwilder/whoami:latest swarm-worker2 Running Running 10 minutes ago
vus1yw9b4i51 whoami.2 jwilder/whoami:latest swarm-manager Running Running 52 seconds ago
(2)进入manager查看进程
[vagrant@swarm-manager ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d780c8fa2031 jwilder/whoami:latest "/app/http" About a minute ago Up About a minute 8000/tcp whoami.2.vus1yw9b4i519crs3h1zi48ln
(3)回到busybox的内容部接着ping whoami,whoami地址不变
[vagrant@swarm-worker1 ~]$ docker exec -it 5e41a sh
/ # ping whoami
PING whoami (10.0.0.11): 56 data bytes
64 bytes from 10.0.0.11: seq=0 ttl=64 time=0.237 ms
64 bytes from 10.0.0.11: seq=1 ttl=64 time=0.096 ms
64 bytes from 10.0.0.11: seq=2 ttl=64 time=0.074 ms
64 bytes from 10.0.0.11: seq=3 ttl=64 time=0.071 ms
^C
--- whoami ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.071/0.119/0.237 ms
/ # ping whoami
PING whoami (10.0.0.11): 56 data bytes
64 bytes from 10.0.0.11: seq=0 ttl=64 time=0.056 ms
64 bytes from 10.0.0.11: seq=1 ttl=64 time=0.091 ms
64 bytes from 10.0.0.11: seq=2 ttl=64 time=0.109 ms
^C
3.解释:这个ip是个vip,即虚拟ip,并非是真实ip。
查看dns的域名映射,在busybox容器中
(1)进入worker1的busybox中运行shell
[vagrant@swarm-worker1 ~]$ docker exec -it 5e41a sh
/ #
(2)查询whoami的真实ip
/ # nslookup whoami
或者
/ # nslookup tasks.whoami
(3)在whoami服务上运行ip a查看网址,是没有10.0.0.11的虚拟网络的
[vagrant@swarm-manager ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d780c8fa2031 jwilder/whoami:latest "/app/http" About a minute ago Up About a minute 8000/tcp whoami.2.vus1yw9b4i519crs3h1zi48ln
[vagrant@swarm-manager ~]$ docker exec d780 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
28: eth1@if29: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue state UP
link/ether 02:42:0a:ff:00:09 brd ff:ff:ff:ff:ff:ff
inet 10.255.0.9/16 brd 10.255.255.255 scope global eth1
valid_lft forever preferred_lft forever
30: eth2@if31: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:12:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.3/16 brd 172.18.255.255 scope global eth2
valid_lft forever preferred_lft forever
32: eth0@if33: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue state UP
link/ether 02:42:0a:00:00:0e brd ff:ff:ff:ff:ff:ff
inet 10.0.0.14/24 brd 10.0.0.255 scope global eth0
valid_lft forever preferred_lft forever
4.检查访问虚拟网络
(1)进入busybox client容器
/etc # wget whoami:8000
Connecting to whoami:8000 (10.0.0.11:8000)
saving to 'index.html'
index.html 100% |*********************************************| 17 0:00:00 ETA
'index.html' saved
查看
/etc # more index.html
I'm a0aeae5814f5
(2)第二次访问,hostname变了
删除之前index.html
/etc # mv index.html index.html.1
/etc # wget whoami:8000
Connecting to whoami:8000 (10.0.0.11:8000)
saving to 'index.html'
index.html 100% |*********************************************| 17 0:00:00 ETA
'index.html' saved
/etc # more index.html
I'm d780c8fa2031
【备注:d780c8fa2031是manager上docker whoami容器的hostname!上面的同理。】
(3)因为每次访问10.0.0.11(whoami),返回是每个不同的地址对应的主机名。做负载均衡。