docker 1.12 的swarm 集羣的自動發現有兩種方式, virtual IP address (VIP) 與 DNS round-robin, 本文使用的是VIP的方式html
安裝docker 1.12 以上版本nginx
初始化swarm集羣web
建立一個名爲docker-net
的overlay網絡docker
開放7946 TCP/UDP
, 4789 UDP
端口shell
初始化swarm集羣部份可看我以前的博客使用docker 1.12 搭建多主機docker swarm集羣網絡
查看當前的網絡ui
[root@swarm-manager ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 376f5b337bfc bridge bridge local 166bd71f7d0e host host local 9gr6bfff1rv9 ingress overlay swarm
ingress
也是一個overlay網絡, 能夠跨主機通訊, 本教程會建立一個新的this
建立網絡加密
docker network create \ --driver overlay \ --opt encrypted \ ## 是否使用加密 my-network
查看.net
[root@swarm-manager ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 376f5b337bfc bridge bridge local 166bd71f7d0e host host local 9gr6bfff1rv9 ingress overlay swarm aoqs3p835s5g docker-net overlay swarm
docker service create \ --replicas 3 \ --name my-web \ # 服務名爲my-web --network docker-net \ daocloud.io/nginx:alpine # 使用國內的鏡像, alpine版的體積很小,下載會快點
查看服務
# 本次只起了一個manager節點, 因此容器都跑在這臺機器上了 [root@swarm-manager ~]# docker service ps my-web ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR bavjn0xhxi35nx6n9kn33yfga my-web.1 daocloud.io/nginx:alpine swarm-manager Running Running 31 minutes ago cibuo8zqp78z1xb8cu3v4pkmj my-web.2 daocloud.io/nginx:alpine swarm-manager Running Running 31 minutes ago 0pkg1eoa0onku71cbp1hqtcv5 my-web.3 daocloud.io/nginx:alpine swarm-manager Running Running 31 minutes ago
在一個網絡上有哪些容器能夠在network inspect的Containers節點看到
[root@swarm-manager ~]# docker network inspect docker-net [ { "Name": "docker-net", "Id": "aoqs3p835s5glx69hi46ou2dw", .... "Containers": { "1c87aae81449b448983924017fc4037b7b1e9e1eaa03bc55745b0167ab4e495b": { "Name": "my-web.1.bavjn0xhxi35nx6n9kn33yfga", "EndpointID": "2ab6c7e698ce69ec318a211dd0386533de1a0d8f2070bd4ee6cdc43cb94dcd0a", "MacAddress": "02:42:0a:00:09:03", "IPv4Address": "10.0.9.3/24", "IPv6Address": "" }, ..... }, ..... } ]
查看服務使用的vip
[root@swarm-manager ~]# docker service inspect --format='{{.Endpoint.VirtualIPs}}' my-web [{aoqs3p835s5glx69hi46ou2dw 10.0.9.2/24}]
先建立一個一樣使用docker-net的overlay網絡 的服務
docker service create \ --name my-busybox \ --network docker-net \ busybox \ sleep 3000
等待服務啓動後, 用docker exec 鏈接進busybox的容器裏
[root@swarm-manager ~]# docker service ps my-busybox ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR 7ftv4wj1g3vu8g7mfghx8du65 my-busybox.1 busybox swarm-manager Running Running about a minute ago [root@swarm-manager ~]# docker exec -ti my-busybox.1.7ftv4wj1g3vu8g7mfghx8du65 sh
在busybox容器. 向DNS查詢nginx服務的vip
[root@swarm-manager ~]# docker exec -ti my-busybox.1.7ftv4wj1g3vu8g7mfghx8du65 sh / # nslookup my-web Server: 127.0.0.11 Address 1: 127.0.0.11 Name: my-web Address 1: 10.0.9.2 10.0.9.2 # 和在外面看到的同樣
在busybox容器. 向DNS查詢nginx服務全部容器的ip地址
/ # nslookup tasks.my-web Server: 127.0.0.11 Address 1: 127.0.0.11 Name: tasks.my-web Address 1: 10.0.9.5 my-web.3.0pkg1eoa0onku71cbp1hqtcv5.docker-net Address 2: 10.0.9.4 my-web.2.cibuo8zqp78z1xb8cu3v4pkmj.docker-net Address 3: 10.0.9.3 my-web.1.bavjn0xhxi35nx6n9kn33yfga.docker-net
在busybox容器, 經過服務名訪問nginx
/ # wget -O- my-web Connecting to my-web (10.0.9.2:80) <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> .....
經過實驗能夠看出, 在swarm集羣中使用overlay網絡時, 不一樣服務之間能夠使用服務名(docker service name)互相訪問