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)互相访问