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 管理節點(初始化叢集的時候,會自動把當前節點設定為管理節點)。
接著,我們在worker1
和worker2
主機上,建立兩個工作節點,並加入到叢集中,命令:
$ 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
可以看到,portainer
比visualizer
強大太多了,甚至我們所有的操作都可以在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