1. 程式人生 > >Docker 三劍客之 Docker Swarm(基於 overlay 組網通訊)

Docker 三劍客之 Docker Swarm(基於 overlay 組網通訊)

這一篇主要是對 Docker Swarm 的完善,增加基於 overlay 組網通訊,以便 Docker 容器可以跨主機訪問。

不同主機間的容器之間通訊方式,大概有三種:

  • 使用埠對映:直接把容器的服務埠對映到主機上,主機直接通過映射出來的埠通訊。
  • 把容器放到主機所在的網段:修改 docker 的 ip 分配網段和主機一致,還要修改主機的網路結構。
  • 第三方專案:flannel,weave 或者 pipework 等,這些方案一般都是通過 SDN 搭建 overlay 網路達到容器通訊的。

在使用 overlay 組網通訊之前,我們先安裝 Docker,以及 Docker Machine(Linux 下):

$ sudo curl -L https://github.com/docker/machine/releases/download/v0.13.0/docker-machine-`uname -s`-`uname -m` > /usr/local/bin/docker-machine
$ sudo chmod +x /usr/local/bin/docker-machine

使用指令碼一鍵安裝(Docker 映象加速地址可以更換):

#!/bin/bash

set -e

create_kv() {
    echo Creating kvstore machine.
    docker-machine create -d virtualbox \
        --engine-opt="registry-mirror=https://kvo9moak.mirror.aliyuncs.com" \
        kvstore
    docker $(docker-machine config kvstore) run -d \
        -p "8500:8500" \
        progrium/consul --server -bootstrap-expect 1
}

create_master() {
    echo Creating cluster master
    kvip=$(docker-machine ip kvstore)

    docker-machine create -d virtualbox \
        --swarm --swarm-master \
        --swarm-discovery="consul://${kvip}:8500" \
        --engine-opt="cluster-store=consul://${kvip}:8500" \
        --engine-opt="cluster-advertise=eth1:2376" \
        --engine-opt="registry-mirror=https://kvo9moak.mirror.aliyuncs.com" \
        swarm-manager
}

create_nodes(){
    kvip=$(docker-machine ip kvstore)
    echo Creating cluster nodes
    for i in 1 2; do
        docker-machine create -d virtualbox \
            --swarm \
            --swarm-discovery="consul://${kvip}:8500" \
            --engine-opt="cluster-store=consul://${kvip}:8500" \
            --engine-opt="cluster-advertise=eth1:2376" \
            --engine-opt="registry-mirror=https://kvo9moak.mirror.aliyuncs.com" \
            swarm-node${i}
    done
}

teardown(){
    docker-machine rm kvstore -y
    docker-machine rm -y swarm-manager
    for i in 1 2; do
        docker-machine rm -y swarm-node${i}
    done
}

case $1 in
    up)
        create_kv
        create_master
        create_nodes
        ;;
    down)
        teardown
        ;;
    *)
        echo "Unknow command..."
        exit 1
        ;;
esac

執行./cluster.sh up,就能自動生成四臺主機:

  • 一臺 kvstore 執行 consul 服務。
  • 一臺 swarm master 機器,執行 swarm manager 服務。
  • 兩臺 swarm node 機器,都是運行了 swarm node 服務和 docker daemon 服務。

檢視四臺主機的具體資訊:

$ docker-machine ls
NAME            ACTIVE      DRIVER       STATE     URL                         SWARM                    DOCKER        ERRORS
kvstore         -           virtualbox   Running   tcp://192.168.99.100:2376                            v18.03.1-ce
swarm-manager   * (swarm)   virtualbox   Running   tcp://192.168.99.101:2376   swarm-manager (master)   v18.03.1-ce
swarm-node1     -           virtualbox   Running   tcp://192.168.99.102:2376   swarm-manager            v18.03.1-ce
swarm-node2     -           virtualbox   Running   tcp://192.168.99.103:2376   swarm-manager            v18.03.1-ce

接下來驗證叢集是否正確安裝?在主機上執行下面命令(主機,不是 Docker 主機):

$ eval $(docker-machine env --swarm swarm-manager)
$ docker info
Containers: 6
 Running: 6
 Paused: 0
 Stopped: 0
Images: 5
Server Version: swarm/1.2.8
Role: primary
Strategy: spread
Filters: health, port, containerslots, dependency, affinity, constraint, whitelist
Nodes: 3
 swarm-manager: 192.168.99.101:2376
  └ ID: K6WX:ZYFT:UEHA:KM66:BYHD:ROBF:Z5KG:UHNE:U37V:4KX2:S5SV:YSCA|192.168.99.101:2376
  └ Status: Healthy
  └ Containers: 2 (2 Running, 0 Paused, 0 Stopped)
  └ Reserved CPUs: 0 / 1
  └ Reserved Memory: 0 B / 1.021 GiB
  └ Labels: kernelversion=4.9.93-boot2docker, operatingsystem=Boot2Docker 18.03.1-ce (TCL 8.2.1); HEAD : cb77972 - Thu Apr 26 16:40:36 UTC 2018, ostype=linux, provider=virtualbox, storagedriver=aufs
  └ UpdatedAt: 2018-05-08T10:20:39Z
  └ ServerVersion: 18.03.1-ce
 swarm-node1: 192.168.99.102:2376
  └ ID: RPRC:AVBX:7CBJ:HUTI:HI3B:RI6B:QI6O:M2UQ:ZT2I:HZ6J:33BL:HY76|192.168.99.102:2376
  └ Status: Healthy
  └ Containers: 2 (2 Running, 0 Paused, 0 Stopped)
  └ Reserved CPUs: 0 / 1
  └ Reserved Memory: 0 B / 1.021 GiB
  └ Labels: kernelversion=4.9.93-boot2docker, operatingsystem=Boot2Docker 18.03.1-ce (TCL 8.2.1); HEAD : cb77972 - Thu Apr 26 16:40:36 UTC 2018, ostype=linux, provider=virtualbox, storagedriver=aufs
  └ UpdatedAt: 2018-05-08T10:21:09Z
  └ ServerVersion: 18.03.1-ce
 swarm-node2: 192.168.99.103:2376
  └ ID: MKQ2:Y7EO:CKOJ:MGFH:B77S:3EWX:7YJT:2MBQ:CJSN:XENJ:BSKO:RAZP|192.168.99.103:2376
  └ Status: Healthy
  └ Containers: 2 (2 Running, 0 Paused, 0 Stopped)
  └ Reserved CPUs: 0 / 1
  └ Reserved Memory: 0 B / 1.021 GiB
  └ Labels: kernelversion=4.9.93-boot2docker, operatingsystem=Boot2Docker 18.03.1-ce (TCL 8.2.1); HEAD : cb77972 - Thu Apr 26 16:40:36 UTC 2018, ostype=linux, provider=virtualbox, storagedriver=aufs
  └ UpdatedAt: 2018-05-08T10:21:06Z
  └ ServerVersion: 18.03.1-ce
Plugins:
 Volume:
 Network:
 Log:
Swarm:
 NodeID:
 Is Manager: false
 Node Address:
Kernel Version: 4.9.93-boot2docker
Operating System: linux
Architecture: amd64
CPUs: 3
Total Memory: 3.063GiB
Name: 85be09a37044
Docker Root Dir:
Debug Mode (client): false
Debug Mode (server): false
Experimental: false
Live Restore Enabled: false

WARNING: No kernel memory limit support

可以看到叢集的具體資訊。

然後,接下來在主機上建立 overlay 網路,建立命令:

$ docker network create -d overlay net1
d6a8a22298485a044b19fcbb62033ff1b4c3d4bd6a8a2229848

然後我們檢視剛建立名稱為net1的 overlay 網路,命令:

$ docker network ls
NETWORK ID          NAME                          DRIVER              SCOPE
d6a8a2229848        net1                          overlay             global
9c7f0e793838        swarm-manager/bridge          bridge              local
93787d9ba7ed        swarm-manager/host            host                local
72fd1e63889e        swarm-manager/none            null                local
c73e00c4c76c        swarm-node1/bridge            bridge              local
95983d8f1ef1        swarm-node1/docker_gwbridge   bridge              local
a8a569d55cc9        swarm-node1/host              host                local
e7fa8403b226        swarm-node1/none              null                local
7f1d219b5c08        swarm-node2/bridge            bridge              local
e7463ae8c579        swarm-node2/docker_gwbridge   bridge              local
9a1f0d2bbdf5        swarm-node2/host              host                local
bea626348d6d        swarm-node2/none              null                local

接下來,我們建立兩個容器(主機上執行,使用 Docker Swarm 很方便),測試使用net1網路,是否可以相互訪問,建立命令:

$ docker run -d --net=net1 --name=c1 -e constraint:node==swarm-node1 busybox top
dab080b33e76af0e4c71c9365a6e57b2191b7aacd4f715ca11481403eccce12a
$ docker run -d --net=net1 --name=c2 -e constraint:node==swarm-node2 busybox top
583fde42182a7e8f27527d5c55163a32102dba566ebe1f13d1951ac214849c8d

檢視剛建立的容器執行情況:

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
583fde42182a        busybox             "top"               3 seconds ago       Up 2 seconds                            swarm-node2/c2
dab080b33e76        busybox             "top"               18 seconds ago      Up 18 seconds                           swarm-node1/c1

接下來,我們檢視net1網路的具體詳情:

$ docker network inspect net1
[
    {
        "Name": "net1",
        "Id": "d6a8a2229848d40ce446f8f850a0e713a6c88a9b43583cc463f437f306724f28",
        "Created": "2018-05-08T09:21:42.408840755Z",
        "Scope": "global",
        "Driver": "overlay",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "10.0.0.0/24",
                    "Gateway": "10.0.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "583fde42182a7e8f27527d5c55163a32102dba566ebe1f13d1951ac214849c8d": {
                "Name": "c2",
                "EndpointID": "b7fcb0039ab21ff06b36ef9ba008c324fabf24badfe45dfa6a30db6763716962",
                "MacAddress": "",
                "IPv4Address": "10.0.0.3/24",
                "IPv6Address": ""
            },
            "dab080b33e76af0e4c71c9365a6e57b2191b7aacd4f715ca11481403eccce12a": {
                "Name": "c1",
                "EndpointID": "8a80a83230edfdd9921357f08130fa19ef0b917bc4426aa49cb8083af9edb7f6",
                "MacAddress": "",
                "IPv4Address": "10.0.0.2/24",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

可以看到,我們剛剛建立的兩個容器資訊(包含 IP 地址),也在裡面。

然後我們測試下兩個容器是否可以相互訪問(直接 ping 容器名稱,也可以訪問):

$ docker exec c1 ping -c 3 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.903 ms
64 bytes from 10.0.0.3: seq=1 ttl=64 time=0.668 ms
64 bytes from 10.0.0.3: seq=2 ttl=64 time=0.754 ms

--- 10.0.0.3 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.668/0.775/0.903 ms

$ docker exec c2 ping -c 3 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.827 ms
64 bytes from 10.0.0.2: seq=1 ttl=64 time=0.702 ms
64 bytes from 10.0.0.2: seq=2 ttl=64 time=0.676 ms

--- 10.0.0.2 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.676/0.735/0.827 ms

$ docker exec c2 ping -c 3 c1
PING c1 (10.0.0.2): 56 data bytes
64 bytes from 10.0.0.2: seq=0 ttl=64 time=1.358 ms
64 bytes from 10.0.0.2: seq=1 ttl=64 time=0.663 ms
64 bytes from 10.0.0.2: seq=2 ttl=64 time=0.761 ms

--- c1 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.663/0.927/1.358 ms

另附 Docker Swarm 架構圖:

參考資料:

相關推薦

Docker 三劍客 Docker Swarm基於 overlay 組網通訊

這一篇主要是對 Docker Swarm 的完善,增加基於 overlay 組網通訊,以便 Docker 容器可以跨主機訪問。 不同主機間的容器之間通訊方式,大概有三種: 使用埠對映:直接把容器的服務埠對映到主機上,主機直接通過映射出來的埠通訊。 把容器放到主機所在的網段:修改 docker 的 ip 分

docker三劍客docker swarm

sock war unix 發現 p地址 replica 機制 工作 behavior Swarm是什麽 Swarm這個項目名稱特別貼切。在Wiki的解釋中,Swarm behavior是指動物的群集行為。比如我們常見的蜂群,魚群,秋天往南飛的雁群都可以稱作Swarm b

Docker(六):Docker 三劍客 Docker Swarm

lib ini 節點數 box 流量 虛擬 .html 刪除 解釋 實踐中會發現,生產環境中使用單個 Docker 節點是遠遠不夠的,搭建 Docker 集群勢在必行。然而,面對 Kubernetes, Mesos 以及 Swarm 等眾多容器集群系統,我們該如何選擇呢?它

Docker 三劍客Docker Swarm

ons type src cati word rpm man mtp break Docker Swarm 介紹創建Docker Swarm集群1、使用docker machine ssh連接到想要成為manager node的那臺docker宿主機上。$ docker-m

docker三劍客docker-compose記官方案例

簡介 Compose專案來源於之前的fig專案,使用python語言編寫,與docker/swarm配合度很高。 Compose 是 Docker 容器進行編排的工具,定義和執行多容器的應

Docker 三劍客 Docker Swarm

閱讀目錄: Docker Machine 建立 Docker 主機 Docker Swarm 配置叢集節點 Docker Service 部署單個叢集服務 Docker Stack 部署多個叢集服務,以及 GUI 管理頁面 docker-machine、docker swarm、docker node、d

docker三劍客docker-machine

eval source grub info mod machine directory document driver #安裝docker-machine [email protected]/* */:~$ pwd /home/cupid [email

容器技術|Docker三劍客docker-compose

stopped fig gecko osi epo 項目 tor html gen 三劍客簡介 docker-machine docker技術是基於Linux內核的cgroup技術實現的,那麽問題來了,在非Linux平臺上是否就不能使用docker技術了呢?答案是可以的,不

docker筆記資料持久化即開即用

資料卷: 將宿主機目錄掛載到容器目錄 資料卷特點: 在容器啟動初始化時,如果容器使用的宿主機掛載點有資料,這些資料會拷貝到容器中 資料卷可以在容器直接共享和使用 可以直接對資料卷裡的內容進行修改 資料卷的變化不會影響映象的更新 卷會一直存在

Docker上部署FTP伺服器基於stilliard/pure-ftpd

Docker Pure-ftpd Server Pull down with docker: 拉取FTP映象: docker pull stilliard/pure-ftpd:hardened Often needing to run as sudo, e.g. 

docker——三劍客Docker Machine

Docker Machine是Docker官方三劍客專案之一,負責使用Docker的第一步,在多種平臺上快速安裝Docker環境。它支援多種平臺,讓使用者在很短時間內搭建一套Docker主機叢集。Machine專案是Docker官方的開源專案,負責實現對Docker主機本身進行管理。Machine專案主要由G

docker——三劍客Docker Compose

編排(Orchestration)功能是複雜系統實現靈活可操作性的關鍵。特別是在Docker應用場景中,編排意味著使用者可以靈活的對各種容器資源實現定義和管理。作為Docker官方編排工具,Compose的重要性不言而喻,它可以讓使用者通過編寫一個簡單模板檔案,快速地建立和管理基於Docker容器地應用叢集。

Docker(五):Docker 三劍客 Docker Machine

Docker Machine 介紹 Docker Machine 是 Docker 官方編排(Orchestration)專案之一,負責在多種平臺上快速安裝 Docker 環境。 Docker Machine 是一個工具,它允許你在虛擬宿主機上安裝 Docker Engine ,並使用 docker-mac

Docker(四):Docker 三劍客 Docker Compose

前兩篇文章我們介紹了 Dockerfile 的使用Docker(二):Dockerfile 使用介紹,我們知道使用一個 Dockerfile 模板檔案可以定義一個單獨的應用容器,如果需要定義多個容器就需要服務編排。服務編排有很多種技術方案,今天給大家介紹 Docker 官方產品 Docker Compose

Docker 三劍客 Docker Compose

Docker Compose 專案是 Docker 官方的開源專案,負責實現對 Docker 容器叢集的快速編排,開源地址:https://github.com/docker/compose Docker Compose 中的兩個重要概念: 服務 (service):一個應用容器,實際上可以執行多個相同映象

資料科學個人筆記:推薦系統推薦演算法基於圖+隱語義

一、隱語義模型(LFM演算法) (一)基礎演算法 隱語義分析採取基於使用者行為統計的自動聚類,計算出使用者和隱類的關係和物品和隱類的關係。 此處使用LFM演算法,通過如下公式計算使用者u對物品i的興趣: Preference(u,i)=r(ui)=sum(p(u,k)

docker筆記初體驗容器管理

容器基本操作: 建立一個容器 [[email protected] ~]# docker run -itd ubuntu 3635f4dd3ae30a4377fc4f2eafc191b7890bbe5873bb4e5f9e5077f794466ec4 檢視容器

centos7安裝docker基於vm的centos

1、Docker 要求 CentOS 系統的核心版本高於 3.10 ,檢視本頁面的前提條件來驗證你的CentOS 版本是否支援 Docker 。 通過 uname -r 命令檢視你當前的核心版本 $ uname -r 2、使用 root 許可權登

Docker上部署Ftp伺服器基於bogem/ftp

Simple ftp server based on vsftpd. Minimalistic clone of fauria/vsftpd. Usage $ docker run -d -v <host folder>:/home/vsftpd \

Docker 資料卷Data Volumes

當容器(Container)停止並被刪除,則容器中的資料也會隨之刪除。 那有沒有一種獨立於容器、提供持久化並能服務於多個容器的東西呢? Docker 資料卷(Data Volumes) 一、 資料卷 資料卷 : 是