1. 程式人生 > >搭建Docker Swarm叢集實戰(三)(swarm mode)

搭建Docker Swarm叢集實戰(三)(swarm mode)

前言

docker在1.12版本之後,把swarm的功能內建到docker engine本身,因此之前使用consul等第三方服務發現和鍵值服務的方法就可以作古了。

這篇就是用docker自帶的swarm mode來進行swarm的叢集搭建。

這篇實操的主要參考是docker官網的教程。

個人建立的Docker愛好者交流QQ群:472149402,歡迎大家來此交流經驗和問題,一起成長。

架構

總共三臺虛擬機器,每一臺虛擬機器上都有docker daemon。
* 1號機manager1,IP=192.168.99.105
* 2號機worker1, IP=192.168.99.106
* 3號機worker1, IP=192.168.99.107

開始

製作1號機

$ docker-machine create -d=virtualbox manager1
Running pre-create checks...
Creating machine...
(manager1) Copying /Users/jiandaojiao/.docker/machine/cache/boot2docker.iso to /Users/jiandaojiao/.docker/machine/machines/manager1/boot2docker.iso...
(manager1) Creating VirtualBox VM...
(manager1) Creating SSH key...
(manager1) Starting the VM... (manager1) Check network to re-create if needed... (manager1) Waiting for an IP... Waiting for machine to be running, this may take a few minutes... Detecting operating system of created instance... Waiting for SSH to be available... Detecting the provisioner... Provisioning with
boot2docker... Copying certs to the local machine directory... Copying certs to the remote machine... Setting Docker configuration on the remote daemon... Checking connection to Docker... Docker is up and running! To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env manager1 $ docker-machine ssh manager1 $ docker swarm init --advertise-addr 192.168.99.105 Swarm initialized: current node (yyqeur66jm8vdjem5701wjqc7) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-4buvs0ux86szv2e7gc2x5i0viccmrhspfcaa40byu1xvsrjchu-6208r1mz51g3mp3nb39wgjrhp 192.168.99.105:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions. $ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS yyqeur66jm8vdjem5701wjqc7 * manager1 Ready Active Leader

製作2號機

$ docker-machine create -d=virtualbox worker1
Running pre-create checks...
Creating machine...
(worker1) Copying /Users/jiandaojiao/.docker/machine/cache/boot2docker.iso to /Users/jiandaojiao/.docker/machine/machines/worker1/boot2docker.iso...
(worker1) Creating VirtualBox VM...
(worker1) Creating SSH key...
(worker1) Starting the VM...
(worker1) Check network to re-create if needed...
(worker1) Waiting for an IP...
Waiting for machine to be running, this may take a few minutes...
Detecting operating system of created instance...
Waiting for SSH to be available...
Detecting the provisioner...
Provisioning with boot2docker...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Checking connection to Docker...
Docker is up and running!
To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env worker1
$ docker swarm join --token SWMTKN-1-4buvs0ux86szv2e7gc2x5i0viccmrhspfcaa40byu1xvsrjchu-6208r1mz51g3mp3nb39wgjrhp 192.168.99.105:2377
This node joined a swarm as a worker.

下面在manager1上執行docker node ls

$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS
yyqeur66jm8vdjem5701wjqc7 *   manager1            Ready               Active              Leader
tlslvt7foadfrhzqsii8huzx6     worker1             Ready               Active  

製作3號機

3號機的方法和2號機一模一樣,只要把worker1全部換成worker2。

嘗試使用swarm

釋出一個容器到叢集

$ docker service create --replicas 1 --name helloworld alpine ping docker.com
r937aud3gi8wj8ozuxmewm48n
Since --detach=false was not specified, tasks will be created in the background.
In a future release, --detach=false will become the default.

alpine的一個例項,一直去ping docker.com,命名為helloworld

如果目標機器上沒有alpine的image的話,可能service會失敗並自動去下載,等下載完,service會在此嘗試啟動。

檢視所有的service

docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
r937aud3gi8w        helloworld          replicated          1/1                 alpine:latest       

檢視名字為helloworld的service

$ docker service ps helloworld
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR                              PORTS
y5xdhd678k0f        helloworld.1        alpine:latest       manager1            Running             Running 6 minutes ago                                       
mu92gmxr9l9w         \_ helloworld.1    alpine:latest       manager1            Shutdown            Rejected 8 minutes ago   "No such image: alpine:latest@…"   

這裡可以看到有兩個helloworld,一個是running的,一個是shutdown的,都在manager1節點。其實shutdown的就是一開始manager1這個節點沒有找到alpine的image,所以失敗了。等它自動pull完alpine後,在此啟動就成功了。

inspect helloworld

$ docker service inspect --pretty helloworld

ID:     r937aud3gi8wj8ozuxmewm48n
Name:       helloworld
Service Mode:   Replicated
 Replicas:  1
Placement:
UpdateConfig:
 Parallelism:   1
 On failure:    pause
 Monitoring Period: 5s
 Max failure ratio: 0
 Update order:      stop-first
RollbackConfig:
 Parallelism:   1
 On failure:    pause
 Monitoring Period: 5s
 Max failure ratio: 0
 Rollback order:    stop-first
ContainerSpec:
 Image:     alpine:[email protected]:f006ecbb824d87947d0b51ab8488634bf69fe4094959d935c0c103f4820a417d
 Args:      ping docker.com 
Resources:
Endpoint Mode:  vip

提升helloworld服務的個數

$ docker service scale helloworld=2
helloworld scaled to 2
Since --detach=false was not specified, tasks will be scaled in the background.
In a future release, --detach=false will become the default.
$ docker service ps helloworld
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE                  ERROR                              PORTS
y5xdhd678k0f        helloworld.1        alpine:latest       manager1            Running             Running 15 minutes ago                                            
mu92gmxr9l9w         \_ helloworld.1    alpine:latest       manager1            Shutdown            Rejected 17 minutes ago        "No such image: alpine:latest@…"   
x9mimsah73qk        helloworld.2        alpine:latest       worker1             Running             Preparing about a minute ago   

刪除helloworld服務

一直ping docker.com會壓垮docker公司的吧,那麼我們把helloworld服務刪除了吧

$ docker service rm helloworld
helloworld
$ docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS

drain一個node

把worker1從active的狀態撤下來。這裡假設manager1和worker1和worker2都執行著helloworld的容器。

$ docker node update --availability drain worker1
worker1
$ docker service ps helloworld
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
u28niq3x2az8        helloworld.1        alpine:latest       manager1            Running             Running 5 seconds ago                        
sokgxqe620st         \_ helloworld.1    alpine:latest       worker1             Shutdown            Shutdown 5 seconds ago                       
59ps3v4t58i5        helloworld.2        alpine:latest       worker2             Running             Running 7 minutes ago                        
y2ll90r60def        helloworld.3        alpine:latest       manager1            Running             Running 9 minutes ago                        
$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS
yyqeur66jm8vdjem5701wjqc7 *   manager1            Ready               Active              Leader
tlslvt7foadfrhzqsii8huzx6     worker1             Ready               Drain               
lnlcz1ec90vwzxw0p9e2ojtp4     worker2             Ready               Active  

可以發現幾件事情:
* worker1的helloworld的容器停止,並且manager1又新啟動了一個helloworld容器
* worker1的node節點狀態變成drain,從此不再接受容器任務
* 執行docker node update –availability active worker1可以使它重新回到active狀態

相關推薦

搭建Docker Swarm叢集實戰()swarm mode

前言 docker在1.12版本之後,把swarm的功能內建到docker engine本身,因此之前使用consul等第三方服務發現和鍵值服務的方法就可以作古了。 這篇就是用docker自帶的swarm mode來進行swarm的叢集搭建。 這篇實操的主

搭建Docker Swarm叢集實戰(一)服務發現使用consul

注意: docker在版本1.12之後,已經將swarm的部分整合在docker裡面了,所以也就不需要依賴第三方的東西了。 所以如果不是為了有趣瞭解一下的話,請直接轉到本系列的第三篇開始=》搭建Docker Swarm叢集實戰(三)(swarm

Shell指令碼實現---Swarm叢集部署例項Swarm Cluster

Shell指令碼實現---Swarm叢集部署例項(Swarm Cluster) 一、機器環境(均是centos7.8) IP hostname 角色 192.168.10.200 manager-swarm manager節點 192.168.10.201 nod

機器學習實戰Naive Bayes

需要 blog bag puts list tps foo 實戰 簡單的 機器學習實戰三(Naive Bayes) 前兩章的兩種分類算法,是確定的分類器,但是有時會產生一些錯誤的分類結果,這時可以要求分類器給出一個最優的猜測結果,估計概率。樸素貝葉斯就是其中一種。 學過概率

FastDFS安裝使用實戰使用篇

Keywords:FastDFS、分散式檔案系統、Ubuntu Author:soartju 轉載請註明出處:http://soartju.iteye.com/blog/803548 經過前面的安裝、配置、啟動,馬上就可以看到FastDFS的效果了,我們先上傳一

Docker 1.12 Swarm叢集實戰(第五章)

補充一些遺漏的問題. 本章主要內容: 使用 constraints 指定 service 約束.service 掛載使用本地volume.ELK日誌平臺使用GELF日誌驅動收集日誌. 1. 指定service約束 在前幾章中, 我們建立的 registry 服務,是由

Docker 實戰容器操作命令

目錄 Docker 容器 Docker 容器的基本操作命令(介紹常用的) docker ps : 列出所有的容器 docker run: 建立一個新的容器並執行一個命令 docker start/stop/restart  docker 進入容器之後退出 d

ElasticSearch實戰分詞和對映

    ElasticSearch的文件對映機制(mapping)用於進行欄位的型別確認,將每一個欄位匹配為一種確定的資料型別。 1  ES欄位型別     ① 基本欄位型別     字串:te

機器學習筆記十一: TensorFlow實戰MNIST數字識別問題

1 - MNIST數字識別問題 前面介紹了這樣用TensorFlow訓練一個神經網路模型和主要考慮的問題及解決這些問題的常用方法。下面我們用一個實際的問題來驗證之前的解決方法。 我們使用的是MNIST手寫數字識別資料集。在很多深度學習教程中,這個資料集都會被當做一個案例。 1.1

Redis高可用叢集-哨兵模式Redis-Sentinel搭建配置教程【Windows環境】

No cross,no crown . 不經歷風雨,怎麼見彩虹。 Redis哨兵模式,用現在流行的話可以說就是一個“哨兵機器人”,給“哨兵機器人”進行相應的配置之後,這個”機器人”可以7*24小時工作,它能能夠自動幫助你做一些事情,如監控,提醒,自動處

搭建Hadoop分散式叢集------修改臺機器的配置檔案

該篇文章,繼續ssh免密登入之後進行講解操作! Step_1:修改Master主機的core-site.xml檔案: 修改前: 修改後: Step_2:把修改Master主機的core-site.

unity網路實戰開發叢林戰爭-正式開發階段015-遊戲場景及開始介面UI搭建

使用工具:VS2017,unity3d使用語言:c#作者:Gemini_xujian參考:siki老師-《叢林戰爭》視訊教程上一篇文章中,我已經完成了遊戲客戶端與伺服器端的初步連線,接下來將開始進行遊戲場景與開始介面UI的搭建。01-控制場景的視野漫遊動畫作為選單介面背景首先

php搭建mvc框架路由類

在這裡補充一下:“大家可以先把目錄建一下,”; 首先呢在mvc下面建立.htaccess 內容: <IfModule mod_rewrite.c> Options +FollowS

從零開始搭建hadoop分散式叢集環境:新建hadoop使用者以及使用者組

      搭建hadoop叢集環境不僅master和slaves安裝的hadoop路徑要完全一樣,也要求使用者和組也要完全一致。因此第一步就是新建使用者以及使用者組。對於新手來言,新建使用者使用者組,並賦予適當的許可權無疑是最大的問題。下面請跟隨我來新建使用者以及使用者組

unity網路實戰開發叢林戰爭-正式開發階段013-遊戲伺服器端框架搭建

使用工具:VS2015使用語言:c#作者:Gemini_xujian參考:siki老師-《叢林戰爭》視訊教程繼上一篇文章內容,這節課講解一下游戲伺服器端的開發。01-專案目錄結構建立:首先開啟VS並建立一個c#控制檯應用程式專案,起名為“遊戲伺服器端”,建立好後,右鍵專案-&

Docker最全教程之使用Node.js搭建團隊技術文件站二十三

前言               各種程式語言均有其優勢和生態,有興趣的朋友完全可以涉獵多門語言。在平常的工作之中,也可以嘗試選擇相對適合的程式語言來完成相關的工作。 在團隊技術文件站搭建這塊,筆者嘗試了許多框架,最

TeamViewer遠程喚醒主機實戰教程多圖

驗證 技術分享 家裏 這臺電腦 data- 屏幕 自己的 post 梳理 前言:首先感謝大家來到這裏。這篇文章事實上算是一個教程,文章中涉及到了TeamViewer,Mac OS X,TP-Link家用路由器,以及花生殼DDNS,對於新手而言內容可能略微有些多,但我

eclipse搭建maven的web項目SSM框架

get tput ron oca sse 輸入 group 類型 jre 1.File -> New -> Other,在New窗口中選擇 Maven -> Maven Project;點擊next 選擇項目路徑 Usedefault Workspac

git 學習筆記 windows環境

clas 環境 check pre div nbsp windows name cnblogs 分支管理 查看分支 git branch 創建dev分支 git branch <name> 切換到dev分支 git checkout <name&

基於開源項目搭建完整RTMP視頻直播基礎入門

搭建視頻直播利用nginx搭建RTMP視頻點播、直播、HLS服務器 http://blog.csdn.net/kingroc/article/details/50839994http://www.jianshu.com/p/099c2c875524 如何開發出一款仿映客直播APP項目實踐篇 -【采集篇 】基