1. 程式人生 > >Docker 三劍客之 Docker Swarm

Docker 三劍客之 Docker Swarm

閱讀目錄:

  • Docker Machine 建立 Docker 主機
  • Docker Swarm 配置叢集節點
  • Docker Service 部署單個叢集服務
  • Docker Stack 部署多個叢集服務,以及 GUI 管理頁面
  • docker-machine、docker swarm、docker node、docker service 和 docker stack 常用命令

Docker Swarm 和 Docker Compose 一樣,都是 Docker 官方容器編排專案,但不同的是,Docker Compose 是一個在單個伺服器或主機上建立多個容器的工具,而 Docker Swarm 則可以在多個伺服器或主機上建立容器叢集服務,對於微服務的部署,顯然 Docker Swarm 會更加適合。

從 Docker 1.12.0 版本開始,Docker Swarm 已經包含在 Docker 引擎中(docker swarm),並且已經內建了服務發現工具,我們就不需要像之前一樣,再配置 Etcd 或者 Consul 來進行服務發現配置了。

1. Docker Machine 建立 Docker 主機

在進行 Docker Swarm 配置之前,我們還需要說下 Docker 另外一個官方工具 Docker Machine(也是 Docker 三劍客之一),其作用就是快速幫助我們搭建 Docker 主機環境,比如我們要使用 Docker Swarm,就必須有很多的 Docker 主機來進行操作,Docker Machine 就是最理想的工具。

因為我是在 Mac OS 上進行操作的,並且 Docker for Mac 已經包含了 Docker Machine(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 Machine 建立四個 Docker 主機,命令:

$ docker-machine create -d virtualbox manager1 && 
docker-machine create -d virtualbox manager2 && 
docker-machine create -d virtualbox worker1 && 
docker-machine create -d virtualbox worker2

Running pre-create checks...
(worker1) No default Boot2Docker ISO found locally, downloading the latest release...
(worker1) Latest release for github.com/boot2docker/boot2docker is v17.11.0-ce
(worker1) Downloading /Users/xishuai/.docker/machine/cache/boot2docker.iso from https://github.com/boot2docker/boot2docker/releases/download/v17.11.0-ce/boot2docker.iso...

執行上面命令,你會發現速度巨慢(如上),原因是從 GitHub 上下載一個boot2docker.iso檔案(國內網路沒辦法),怎麼解決呢?很簡單,我們使用翻X的瀏覽器手動下載boot2docker.iso檔案,然後拷貝到對應目錄下(我電腦的目錄/Users/xishuai/.docker/machine/cache/),然後再執行上面的命令,發現速度快的一批。

我們可以檢視下建立的 Docker 主機資訊,命令:

$ docker-machine ls
NAME       ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS
manager1   -        virtualbox   Running   tcp://192.168.99.100:2376           v17.11.0-ce   
manager2   -        virtualbox   Running   tcp://192.168.99.101:2376           v17.11.0-ce   
worker1    -        virtualbox   Running   tcp://192.168.99.102:2376           v17.11.0-ce   
worker2    -        virtualbox   Running   tcp://192.168.99.103:2376           v17.11.0-ce   

可以看到,我們建立了四個 Docker 主機(兩個 Manager 和兩個 Worker),我們還可以連線到任何一臺伺服器進行操作,命令:

$ docker-machine ssh manager1
                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/
 _                 _   ____     _            _
| |__   ___   ___ | |_|___ \ __| | ___   ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__|   <  __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
Boot2Docker version 17.11.0-ce, build HEAD : e620608 - Tue Nov 21 18:11:40 UTC 2017
Docker version 17.11.0-ce, build 1caf76c

2. Docker Swarm 配置叢集節點

我們執行下面命令:

$ docker-machine ssh manager1 "docker swarm init --advertise-addr 192.168.99.100"
Swarm initialized: current node (n0ub7dpn90rxjq97dr0g8we0w) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-5uwpqibnvmho1png8zmhcw8274yanohee32jyrcjlait9djhsk-envtxo4dl6df2ar3qldcccfdg 192.168.99.100:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

上面是在manager1主機上,建立一個 Docker Swarm 管理節點(初始化叢集的時候,會自動把當前節點設定為管理節點)。

接著,我們在worker1worker2主機上,建立兩個工作節點,並加入到叢集中,命令:

$ docker-machine ssh worker1 "docker swarm join --token SWMTKN-1-5uwpqibnvmho1png8zmhcw8274yanohee32jyrcjlait9djhsk-envtxo4dl6df2ar3qldcccfdg 192.168.99.100:2377"
This node joined a swarm as a worker.

$ docker-machine ssh worker2 "docker swarm join --token SWMTKN-1-5uwpqibnvmho1png8zmhcw8274yanohee32jyrcjlait9djhsk-envtxo4dl6df2ar3qldcccfdg 192.168.99.100:2377"
This node joined a swarm as a worker.

還有另外一個manager2主機,需要配置為管理節點,我們需要先在manager1主機上,獲取管理節點對應的token,然後再配置為管理節點,命令:

$ docker-machine ssh manager1 "docker swarm join-token manager"
To add a manager to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-5uwpqibnvmho1png8zmhcw8274yanohee32jyrcjlait9djhsk-0koz1b98sco8r5cn3g61eahnu 192.168.99.100:2377

$ docker-machine ssh manager2 "docker swarm join --token SWMTKN-1-5uwpqibnvmho1png8zmhcw8274yanohee32jyrcjlait9djhsk-0koz1b98sco8r5cn3g61eahnu 192.168.99.100:2377"
This node joined a swarm as a manager.

配置好之後,我們進入manager1主機內(上面的命令也可以在主機內執行),然後檢視叢集節點的資訊,命令:

$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS
n0ub7dpn90rxjq97dr0g8we0w *   manager1            Ready               Active              Leader
t4cy67qp0bf2spgabsutwxnzt     manager2            Ready               Active              Reachable
if0kmzp4ww3oy57y7cha7v36t     worker1             Ready               Active              
jgg61cujzaeb3du5796fm0x2g     worker2             Ready               Active       

Leader表示當然叢集的頭,Reachable可以理解為頭的候選人,頭一掛掉它就頂上去了。

需要注意的是,我當天配置好之後,把所有的 Docker 主機都stop了,然後隔天重新start之後,出現了下面問題:

docker node ls
Error response from daemon: rpc error: code = Unknown desc = The swarm does not have a leader. It's possible that too few managers are online. Make sure more than half of the managers are online.
$ docker swarm init --force-new-cluster
Error response from daemon: could not choose an IP address to advertise since this system has multiple addresses on different interfaces (10.0.2.15 on eth0 and 192.168.99.102 on eth1) - specify one with --advertise-addr
$ docker swarm init --force-new-cluster --advertise-addr 192.168.99.102
Error response from daemon: This node is not a swarm manager. Worker nodes can't be used to view or modify cluster state. Please run this command on a manager node or promote the current node to a manager.
$ docker node ls
卡死
$ docker-machine restart manager1 
重啟不了,一直轉圈

沒辦法,後來我只能刪掉四個 Docker 主機,重新進行建立了。

3. Docker Service 部署單個叢集服務

在部署叢集服務之前,我們需要做些準備工作,因為 Docker 主機中沒有配置 Docker 映象加速地址,所以在拉取官方映象的時候,肯定會非常慢,除了配置 Docker 映象加速地址之外,我們還可以使用 Docker 私有映象倉庫,來解決這個問題。

這邊,我再簡單說明下配置步驟,首先,在 Mac OS 上執行下面命令:

$ docker run -d -v /Users/xishuai/Documents/Docker:/var/lib/registry -p 5000:5000 --restart=always --name registry registry

$ docker tag nginx 192.168.99.1:5000/nginx:latest && 
docker push 192.168.99.1:5000/nginx:latest && 
docker pull 192.168.99.1:5000/nginx:latest

$ curl http://192.168.99.1:5000/v2/_catalog
{"repositories":["nginx"]}

我們在 Mac OS 上建立了一個私有倉庫容器,並把nginx映象放到私有倉庫中,因為沒有使用 Https,所以在拉取和推送映象的時候,會報如下錯誤(Mac OS 和 Docker 主機都會報錯):

$ docker pull 192.168.99.1:5000/nginx:latest
The push refers to a repository [192.168.99.1:5000/nginx]
Get https://192.168.99.1:5000/v1/_ping: http: server gave HTTP response to HTTPS client

解決方式,我們需要分別在四個 Docker 主機中新增配置(Docker for Mac 在管理介面配置即可),命令:

$ sudo touch /etc/docker/daemon.json && 
sudo chmod 777 /etc/docker/daemon.json && 
sudo echo '{ "insecure-registries":    ["192.168.99.1:5000"] }' > /etc/docker/daemon.json

然後重啟四個 Docker 主機(Docker for Mac 也需要重啟),命令:

$ docker-machine restart manager1 && 
docker-machine restart manager2 && 
docker-machine restart worker1 && 
docker-machine restart worker2

上面比較囉嗦,我們接下來正式部署叢集服務,還是拿nginx映象做為示例,命令(docker service create命令詳細說明):

$ docker service create --replicas 4 -p 8088:80 --name nginx 192.168.99.1:5000/nginx:latest
ap8h8srb8yh3mni0h2nz61njz
overall progress: 4 out of 4 tasks 
1/4: running   [==================================================>] 
2/4: running   [==================================================>] 
3/4: running   [==================================================>] 
4/4: running   [==================================================>] 
verify: Service converged 

需要注意的是,--replicas 4表示建立服務的例項個數(預設是一個),啥意思?比如4,就是在四個 Docker 主機上,分別建立一個nginx服務,如果是3,那就是三個 Docker 主機,或者你可以理解為 Docker 主機的個數,另外,REPLICAS會有進度顯示,並且執行是非同步的。

我們也可以手動設定例項個數,命令:

$ docker service scale nginx=4

部署好服務後,我們就可以進行查看了,命令:

$ docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE                            PORTS
ap8h8srb8yh3        nginx               replicated          4/4                 192.168.99.1:5000/nginx:latest   *:8080->8080/tcp

$ docker service ps nginx
ID                  NAME                IMAGE                            NODE                DESIRED STATE       CURRENT STATE                ERROR               PORTS
l2rdrwzs5zog        nginx.1             192.168.99.1:5000/nginx:latest   manager1            Running             Running about a minute ago                       
vsfczzbwanx3        nginx.2             192.168.99.1:5000/nginx:latest   manager2            Running             Running about a minute ago                           
qtbgw5h6dsi9        nginx.3             192.168.99.1:5000/nginx:latest   worker              Running             Running about a minute ago                           
za2ejnvb3n6z        nginx.4             192.168.99.1:5000/nginx:latest   worker2             Running             Running about a minute ago

4. Docker Stack 部署多個叢集服務,以及 GUI 管理頁面

docker service部署的是單個服務,我們可以使用docker stack進行多服務編排部署,使用的同樣是docker-compose.yml配置檔案,示例:

version: "3"

services:
  nginx:
    image: 192.168.99.1:5000/nginx:latest
    ports:
      - 8088:80
    deploy:
      mode: replicated
      replicas: 4

  visualizer:
    image: 192.168.99.1:5000/dockersamples/visualizer:latest
    ports:
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      replicas: 1
      placement:
        constraints: [node.role == manager]

  portainer:
    image: 192.168.99.1:5000/portainer/portainer:latest
    ports:
      - "9000:9000"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      replicas: 1
      placement:
        constraints: [node.role == manager]

如上所示,我們總共需要部署三個服務,出了nginx服務作為示例之外,visualizer官方地址)和portainer官方地址)都是叢集 GUI 管理服務。

部署命令:

$ docker stack deploy -c docker-compose.yml deploy-demo
Creating service deploy-demo_nginx
Creating service deploy-demo_visualizer
Creating service deploy-demo_portainer

部署成功之後,我們可以檢視具體詳情,命令:

$ docker stack ls
NAME                SERVICES
deploy-demo         3

可以看到,portainervisualizer強大太多了,甚至我們所有的操作都可以在portainer上完成。

5. docker-machine、docker swarm、docker node、docker service 和 docker stack 常用命令

docker-machine 常用命令

命令 說明
docker-machine create 建立一個 Docker 主機(常用-d virtualbox
docker-machine ls 檢視所有的 Docker 主機
docker-machine ssh SSH 到主機上執行命令
docker-machine env 顯示連線到某個主機需要的環境變數
docker-machine inspect 輸出主機更多資訊
docker-machine kill 停止某個主機
docker-machine restart 重啟某臺主機
docker-machine rm 刪除某臺主機
docker-machine scp 在主機之間複製檔案
docker-machine start 啟動一個主機
docker-machine status 檢視主機狀態
docker-machine stop 停止一個主機

docker swarm 常用命令

命令 說明
docker swarm init 初始化叢集
docker swarm join-token worker 檢視工作節點的 token
docker swarm join-token manager 檢視管理節點的 token
docker swarm join 加入叢集中

docker node 常用命令

命令 說明
docker node ls 檢視所有叢集節點
docker node rm 刪除某個節點(-f強制刪除)
docker node inspect 檢視節點詳情
docker node demote 節點降級,由管理節點降級為工作節點
docker node promote 節點升級,由工作節點升級為管理節點
docker node update 更新節點
docker node ps 檢視節點中的 Task 任務

docker service 常用命令

命令 說明
docker service create 部署服務
docker service inspect 檢視服務詳情
docker service logs 產看某個服務日誌
docker service ls 檢視所有服務詳情
docker service rm 刪除某個服務(-f強制刪除)
docker service scale 設定某個服務個數
docker service update 更新某個服務

docker stack 常用命令

命令 說明
docker stack deploy 部署新的堆疊或更新現有堆疊
docker stack ls 列出現有堆疊
docker stack ps 列出堆疊中的任務
docker stack rm 刪除堆疊
docker stack services 列出堆疊中的服務
docker stack down 移除某個堆疊(不會刪除資料)

參考資料:

相關推薦

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 Swarm(基於 overlay 組網通訊)

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

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 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(記官方案例)

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

Docker 三劍客 Docker Compose

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

docker三劍客之一docker compose

http 定義 mpat com dir 服務 stopped start 包括 compose有兩個重要的概念: 服務(service):一個應用的容器,實際上可以包括若幹運行相同鏡像的容器實例 項目(project):由一組關聯的應用容器組成的一個完整業務單元,在d

Docker學習Docker容器基本使用

rest 刪除 圖片 -c 容器 run bcd user git Docker學習之Docker容器基本使用 新建容器並啟動 命令格式:docker run --options repository:tag 後臺運行 命令格式:-d 已存在的容器相關操作 啟動:docke

docker 系列 docker安裝

fss color 目前 ram 依賴包 san attribute -i 後臺服務 Docker支持以下的CentOS版本 CentOS 7 (64-bit) CentOS 6.5 (64-bit) 或更高的版本 前提條件 目前,CentOS 僅發行版本中的內核支持

Docker入門docker的安裝

Docker初體驗 Docker 簡介 Docker有兩個版本: 社群版(CE) 企業版(EE) Docker Community Edition(CE)非常適合希望開始使用Docker並嘗試使用基於容器的應用程式的個人開發人員和小型團隊。 Docker企業版(EE)專為企業

Docker $ Docker 三劍客Docker-Compose

一.Docker-Compose 簡介 簡介 1.Docker官方三劍客專案之一。 2.負責快速部署分散式應用。 3.定義和執行多個Docker容器應用。 4.微服務一般有多個例項,為了提高效率,使用Compose管理容器,無需每個微服務都要手動啟停。 功能

Docker $ Docker三劍客Docker-Compose

一.Docker-Compose 簡介 簡介 1.Docker官方三劍客專案之一。 2.負責快速部署分散式應用。 3.定義和執行多個Docker容器應用。 功能 1.有時候,我們的一個專案由多個服

docker命令 docker commit

1.檢視現有的映象 ➜ cicdApidoc sudo docker images REPOSITORY TAG IMAGE ID