docker 1.12 的服務自動發現

介紹

docker 1.12 的swarm 集羣的自動發現有兩種方式, virtual IP address (VIP) 與 DNS round-robin, 本文使用的是VIP的方式html

準備

  1. 安裝docker 1.12 以上版本nginx

  2. 初始化swarm集羣web

  3. 建立一個名爲docker-net 的overlay網絡docker

  4. 開放7946 TCP/UDP , 4789 UDP 端口shell

初始化swarm集羣部份可看我以前的博客使用docker 1.12 搭建多主機docker swarm集羣網絡

建立overlay網絡

查看當前的網絡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

在swarm上用overlay 網絡建立一個服務

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}]

演示使用服務名訪問nginx

先建立一個一樣使用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)互相訪問

個人博客: docker 1.12 的服務自動發現

相關文章
相關標籤/搜索