1. 程式人生 > >阿里雲CentOS環境之-實戰docker叢集swarm(十五)

阿里雲CentOS環境之-實戰docker叢集swarm(十五)

前言

自行百度

docker1.12版本之前版本配置

準備工作

雲1:116.62.184.190(杭州)
雲2:139.196.123.97(上海)
2臺阿里雲不在同一地區

開始

拉取swarm

docker pull swarm

開放2375遠端訪問埠

不知道怎麼修改看Docker學習筆記 — 開啟Docker遠端訪問
如果這裡不使用2375埠,比較修改為9000,那下面的命令要做埠對映。

建立叢集的token

命令

docker run --rm swarm create

結果得到268a013b7515edfb3c7b3fa361e69661


token是叢集標誌,用於區別不同叢集。同時也是找到叢集的令牌,需要單獨儲存,目前沒法重寫。

向叢集裡新增結點

上面建立的是空叢集,需要把將結點主機新增到叢集裡。swarm join命令將結點主機新增到叢集,但要注意並不會去驗證主機的健康性。
雲1伺服器上執行命令

docker run -d swarm join --addr=116.62.184.190:2375 token://268a013b7515edfb3c7b3fa361e69661

116.62.184.190是雲1公網地址即docker主機ip,2375是開放埠,-d表示後臺執行,token即上面叢集標識。
命令意思是將116.62.184.190:2375docker主機新增到叢集裡。

如果本機沒開放2375,修改成9000,則命令變成 –addr=116.62.184.190:9000
同樣在雲2上執行新增叢集命令:

docker run -d swarm join --addr=139.196.123.97:2375 token://268a013b7515edfb3c7b3fa361e69661

檢視叢集裡有哪些結點

命令

docker run --rm swarm list token://268a013b7515edfb3c7b3fa361e69661

結果如下:

[root@izbp1hx8v6lzadot5plxh2z sysconfig]# docker run --rm swarm list token://268a013b7515edfb3c7b3fa361e69661
116.62.184.190:2375 139.196.123.97:2375

說明2臺docker主機都成功新增到叢集。

建立管理者容器

管理主機是對叢集的管理,它管理叢集下每臺主機。在任何一臺能上網的機器上通過連線管理者都能控制叢集。
同時建立管理都容器可以在任意一臺機器上建立,最好單獨的穩定的雲伺服器上。這裡在雲1上建立管理者容器。
命令:

docker run -d -p 8280:2375 swarm manage token://268a013b7515edfb3c7b3fa361e69661 

由於2375被使用過,這裡使用-p(小p)引數埠對映到雲主機的8280埠。

阿里雲安全組8280埠要開放

成功建立管理者容器就可以用下面命令檢視叢集裡容器資訊

//叢集資訊
docker -H 116.62.184.190:8280 info
//叢集裡容器執行資訊,類似單個docker主機上執行docker ps檢視主機上執行的容器,區別是它管理的叢集裡所有的。
docker -H 116.62.184.190:8280 ps
//檢視叢集映象
docker -H 116.62.184.190:8280 images

上面也說過,在任意一臺機器上執行上面命令都可以管理叢集。其中docker -H 116.62.184.190:8280 ps命令,現在執行是沒有任何資訊的,因為叢集裡沒有任意執行的
事實上-H引數表示連線的叢集地址,只要加上-H引數,就可以使用docker其它命令,比較kill,stop,rm,rmi等

使用叢集

向叢集裡執行一個映象,此命令在任何雲伺服器都可執行(當然要有docker環境)

docker -H 116.62.184.190:8280 run -d -p 8284:80 --name web1 nginx

116.62.184.190:8280是安裝管理者容器的ip。執行nginx映象,訪問http://116.62.184.190:8284/結果如下圖:
這裡寫圖片描述
那麼通過這樣的方式啟動起來的容器會通過一定的策略選擇一臺合適的主機作為真實的跑容器的平臺來執行容器

離開叢集

docker swarm leave

如果是管理者,需要加--force,幫助 資訊

docker swarm leave --help

docker1.12版本之後版本配置

準備工作

雲1:116.62.184.190(杭州)
雲2:139.196.123.97(上海)
2臺阿里雲不在同一地區

開始

叢集初始化,在雲1上執行。

docker swarm init --listen-addr 127.0.0.1:8280 --advertise-addr 127.0.0.1

初始化叢集,–listen-addr指定開放的遠端呼叫APi對應的IP和埠,可以通過這個組合訪問到該節點的docker服務,預設埠2377,預設ip是區域網ip,–advertise-addr指定本機ip地址,廣播地址,也就是其他節點加入該swarm叢集時,需要訪問的IP,我建議不填。
建議命令

docker swarm init

得到結果:

[[email protected] sysconfig]# docker swarm init
Swarm initialized: current node (7o5bvjqtpnjjt2afajvf4aa3q) is now a manager.

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

    docker swarm join \
    --token SWMTKN-1-5pws5xth4op6w6ew2axlqk8j3lmakjg2z6mopc8k9zcqnabn24-88d8vu4qsa7ua6r5jj36eetg3 \
    172.16.78.165:2377

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

初始化完成,新增結點。注意命令中docker swarm join --token SWMTKN-1-5pws5xth4op6w6ew2axlqk8j3lmakjg2z6mopc8k9zcqnabn24-88d8vu4qsa7ua6r5jj36eetg3 172.16.78.165:2377,如果在公網上執行,172.16.78.165要換成公網ip。
在雲2上執行新增結點命令:

docker swarm join --token SWMTKN-1-5pws5xth4op6w6ew2axlqk8j3lmakjg2z6mopc8k9zcqnabn24-88d8vu4qsa7ua6r5jj36eetg3 116.62.184.190:2377

檢視結點

docker node ls

結果如下:

[root@izbp1hx8v6lzadot5plxh2z sysconfig]# docker node ls
ID                           HOSTNAME                 STATUS  AVAILABILITY  MANAGER STATUS
7o5bvjqtpnjjt2afajvf4aa3q *  izbp1hx8v6lzadot5plxh2z  Ready   Active        Leader
l2jxinvqnwm2kduf1g9r16exa    izuf6fob4dmcif0myqzjt1z  Ready   Active             
  1. 節點id後的星號據說表示的是你當前連線著的節點
  2. manager本身自動作為worker一員加入叢集

測試

在結點上建立服務

docker service create --replicas 2  --mode replicated --name test -p 8284:80 nginx

--replicas:引數指出希望保持這個服務始終有多少容器在執行。為2則雲1和雲2docker主機上都會執行一個nginx容器
--name:引數指定的是服務的名字。
--mode:replicated services 按照一定規則在各個工作節點上執行指定個數的任務。
global services 每個工作節點上執行一個任務
預設是replicated,建議不填
--network:在叢集上部署應用,就是在共享網路上部署服務(service),通過docker network ls可檢視叢集節點中的共享網路,預設的ingress共享網路。建議不填。
前面的docker service create --replicas 2 --name test基本固定,後面跟著執行容器需要的引數。

檢視建立的服務:

docker service ls

結果

[root@izbp1hx8v6lzadot5plxh2z sysconfig]# docker service ls
ID            NAME  MODE        REPLICAS  IMAGE
055ndsl7afu6  test  replicated  2/2       nginx:latest

訪問http://116.62.184.190:8284/能正常訪問頁面

檢視埠情況

命令

docker service inspect --pretty test

結果如下:
這裡寫圖片描述

注意不是使用docker ps,使用docker ps命令不能查出暴露的主機埠,展示的結果如下:

[root@izbp1hx8v6lzadot5plxh2z target]# docker ps
CONTAINER ID        IMAGE                                                                           COMMAND                  CREATED              STATUS              PORTS               NAMES
eeafd18ed680        nginx@sha256:0fb320e2a1b1620b4905facb3447e3d84ad36da0b2c8aa8fe3a5a81d1187b884   "nginx -g 'daemon ..."   About a minute ago   Up About a minute   80/tcp              test.2.poz7jx7bjg6ksgb7dv3777vm9

檢視哪個節點在執行該服務

docker service ps test

結果如下:

6lmh2yw8q7qx  test  replicated  2/2       nginx:latest
[root@izbp1hx8v6lzadot5plxh2z sysconfig]# docker service ps test
ID            NAME    IMAGE         NODE                     DESIRED STATE  CURRENT STATE           ERROR  PORTS
780g50xskm5a  test.1  nginx:latest  izbp1hx8v6lzadot5plxh2z  Running        Running 15 minutes ago         
iju0bqiqmpqa  test.2  nginx:latest  izuf6fob4dmcif0myqzjt1z  Running        Running 15 minutes ago     

發現雲2主機上也有一個nginx容器在執行,試試http://139.196.123.97:8284/果然有訪問。
證明叢集起作用了。建立一個服務,指定執行2個容器,叢集根據演算法在雲1和雲2上都執行一個ngingx容器,每個服務下有多個服務結點。

滾動更新

我這裡想說的是主要目的就是為了在部署時服務不至於不可用。當映象提交到映象倉庫裡時需要更新服務上應用,一個容器更新完成後再更新另一個容器。
原理:
1. 停止第一個副本。
2. 排程任務,選擇 worker node。
3. 在 worker 上用新的映象啟動副本。
4. 如果副本(容器)執行成功,繼續更新下一個副本;如果失敗,暫停整個更新過程。
2步。
1. 建立服務時指定更新策略

docker service create --replicas 2 --name test  --update-delay 10s -p 8284:80 nginx

–update-delay 表示更新服務對應的任務或一組任務之間的時間間隔。時間間隔用數字和時間單位表示,m 表示分,h 表示時。
2. 執行更新命令

docker service update --image 映象名 服務名

如果映象內部沒變化,更新操作是不會有任何影響的,強制更新

docker service update --force --image 映象名 服務名

更新操作根據倉庫裡TAG標籤來更新,如果TAG沒更新,但倉庫裡IMAGE ID變了,也是不會更新操作了的。

上面操作是建立時操作,如果服務已經建立好了,我們可以在update命令上下功夫。
如下:

docker service update  --update-delay 10s --image 映象名 服務名

一些其它操作。
--replicas:擴充套件副本數量為6,相當於docker service scale test=6
--update-parallelism:同時更新的副本數量
--update-delay:更新間隔
例如

docker service update --replicas 6 --update-parallelism 2 --update-delay 1m30s --image 映象名 服務名

service 增加到六個副本,每次更新兩個副本,間隔時間一分半鐘。

命令

下面的test是服務名。

叢集

初始化一個叢集:docker swarm init
強制刪除叢集,如果是manager,需要加–force:docker swarm leave --force
檢視新增到worker的token:docker swarm join-token worker
檢視新增到manager的token:docker swarm join-token manager
使舊令牌無效並生成新令牌:docker swarm join-token --rotate
加入worker/manager:docker swarm join --token SWMTKN-1-5d2ipwo8jqdsiesv6ixze20w2toclys76gyu4zdoiaf038voxj-8sbxe79rx5qt14ol14gxxa3wf 公網ip:2377
將節點升級為manager:docker node promote 結點名
將節點降級為worker:docker node demote 結點名

結點

檢視結點列表:docker node ls
刪除結點:docker node rm 結點名
檢視結點資訊:docker node inspect 結點名 --pretty
下線某結點上任務(容器):docker node update --availability drain 結點HOSTNAME名(通過docker node ls)。結點下容器執行狀態變成Shutdown,結點狀態為Drain,同時在其它結點上建立被關閉數量任務副本(如果建立服務時–replicas 指定的容器數量超過1的話)
上線某結點狀態:docker node update --availability active 結點HOSTNAME名
暫停某結點,不影響現有任務執行,但不會分配任務:docker node update --availability pause 結點HOSTNAME名

服務

檢視服務列表:docker service ls
檢視單個服務詳情:docker service inspect --pretty test
檢視服務下容器具體資訊:docker service ps test
伸縮服務結點:docker service scale test=5
刪除服務:docker service rm test,服務刪除,所有結點也跟著刪除

問題

Error response from daemon: node izuf6fob4dmcif0myqzjt1z is ambiguous (2 matches found)

是因為有2個hostname一樣但id不一樣的結點,可能是一個結點離開叢集又重新加入導致同名不同id,在執行命令時不知道啟用哪個結點,這種情況就不用hostname,換成id即可。
比如:

docker node update --availability active l2jxinvqnwm2kduf1g9r16exa(ID)

同時刪除同名的另一個結點

docker node rm mgdob3pudnbtf5d1zpmwx9gmz

相關推薦

阿里CentOS環境-實戰docker叢集swarm()

前言 自行百度 docker1.12版本之前版本配置 準備工作 雲1:116.62.184.190(杭州) 雲2:139.196.123.97(上海) 2臺阿里雲不在同一地區 開始 拉取swarm docker

阿里CentOS環境docker安裝,啟動,加速器,docker-compose(四)

阿里雲CentOS環境之docker安裝,啟動,加速器(十四) 介紹 Docker從1.13版本之後採用時間線的方式作為版本號,分為社群版CE和企業版EE。 社群版是免費提供給個人開發者和小型團體使用的,企業版會提供額外的收費服務,比如經過官方測試認證過的基礎

阿里CentOS環境RabbitMq安裝及環境配置《十三》

第一、Erlang安裝 因為是erlant語言編寫的,故需要安裝erlang環境 下載 在/usr/local/目錄下建立rabbitMQ目錄,mkdir rabbitMQ.進入目錄。 erlant官方網址,下載原始碼版,因linux只能下

阿里centos環境java安裝

阿里雲centos配置之java安裝<一> 一、 java配置 新建立的阿里雲實例是預設不安裝java開發環境的,需要自己安裝。 由於各Linux開發廠商的不同,因此不同開發廠商的Linux版本操作細節也不一樣,這裡是在centos環

阿里CentOS 7.3 裸機搭建 Apache、MySql、PHP、Node環境、並繫結域名

阿里雲CentOS 7.3 裸機搭建 Apache、MySql、PHP、Node境、並繫結域名 最近一直想在阿里雲申請一個伺服器,可以在上面跑一些服務,輸入域名訪問,那種感覺肯定很不一樣。所以就花學生價買了一年,還是挺划算的。 域名備案花了挺長時間,又上傳照片又打電話核實的挺麻煩的,不過

阿里centosdocker的搭建

  由於docker在17之後的版本分成了docker EE(企業版)和docker CE(社群版),那麼我們在安裝的時候就要開始糾結的選擇了,這裡我推薦了docker CE(社群版)。   實際上這兩個版本是沒有什麼本質的區別的,只是企業版多了一些收費的高階選項,然而針對個人或小型企業並沒有這個需要,所以

阿里Centos配置Java mysql環境

解除安裝一安裝的mysql 檢視 yum list installed | grep mysql 解除安裝 yum -y remove mysql-libs.x86_64 下載MYSQL的YUM源:wget http://repo.mysql.com/mysql57-communit

阿里CentOS伺服器環境搭建php+nginx+mysql+java+git+nodejs

阿里雲CentOS伺服器環境搭建 CentOS 安裝php 1. 下載php 7.2.11 wget http://sg2.php.net/distributions/php-7.2.11.tar.gz

阿里 Centos 7.2 環境配置 LNMP

首先更新系統軟體 $ yum update   安裝nginx 1.安裝nginx源 $ yum localinstall http://nginx.org/packages/centos/7/noarch/RPMS/n

阿里Linux環境安裝JDK

1:首先檢視系統有沒有自帶jdk rpm -qa | grep java1 2:將存在的一一解除安裝 rpm -ev 引數這些內容 //一個一個解除安裝直到一個不剩1 3、判斷是否解除安裝成功 java -version //檢視安裝的jdk版本1 4、然後開

阿里Ubuntu環境搭建Docker服務

經過昨天和今天的不斷奮戰,在阿里雲裡面搭建Docker並不容易。所以我覺得有必要記錄下來,以供後人學習。以及我自己的回顧。 首先,檢視我們的系統版本: cat /etc/issue的到的輸出是 Ubuntu 12.04.1 LTS \n \l我們順便看一下核心版本,

阿里centos+java環境搭建

目錄 1、準備 2、安裝jdk 3、安裝tomcat 4、安裝mysql 1、準備 購買阿里雲伺服器,我買的是Centos 6.5。 因為是linux,在window下管理我使用XManager,這個軟體可以使用ssh、sftp圖形操作,缺點就是需要money。 2、安裝j

阿里centOS配置lamp環境

第一步:進入伺服器,下載Apache 第二步:啟動服務和測試服務 第三步:下載mysql 第四步:啟動mysql 第五步:進入mysql 第六步:修改mysql密碼,最好設定複雜點 第七步:下載php 第八步:檢查php是否與Apache繫結 第九步:重啟A

linux伺服器部署nodejs環境(阿里centOS)

最近搞了一個阿里雲伺服器,搞node執行環境搞得很是頭大不過終於還是搞好了,今天就把詳細的步驟寫出來,希望大家能快速在linux伺服器成功搭建我們的node環境,直接進入正題: 步驟: 我們先在windows上安裝xshell(直接百度xshell即可) 開啟xshe

阿里 centos 7.2 部署python flask 環境

首先需要買一個阿里雲伺服器,我使用的是mac 所以 買的是centos 的環境,買的是最便宜的,有優惠折扣9.9 半年。 首先連結遠端伺服器                    ssh [email protected](阿里雲實例的共有IP)        

阿里centos安裝java環境

一、上傳 將本機上的jdk檔案通過Xftp上傳到伺服器,建議/tmp 路徑下。  開啟xshell(別的也行)遠端連線到伺服器上。 二、配置目錄 mkdir /usr/java cd /usr/java tar zxvf jdk-8u171-linux-x64.t

阿里centos伺服器部署java-web環境

主要任務 使用ssh工具,在阿里雲伺服器配置jdk,tomcat,mysql,並部署專案。 所需工具 Xshell,Xftp,jdk1.8(linux版)、tomcat7(linux版)、mysql5.5(linux版) 所有工具下載地址: 密

.netcore centos環境搭建實戰

sta 遇到 nbsp ocean cti net 防火墻 ins web 步驟 1. 安裝VMware Workstation 下載地址:https://my.vmware.com/cn/web/vmware/info/slug/desktop_end_user_co

阿里CentOS搭建SVN伺服器及許可權管理

  linux(centos)下SVN伺服器如何搭建?說到SVN伺服器,想必大家都知道,可以是在LINUX下如何搭建SVN伺服器呢?那麼今天給大家分享一下linux(centos)搭建SVN伺服器的思路!    雖然在windows上搭建SVN很簡單,但是效能卻不高,

Django2.0+uwsgi+Nginx+阿里centos部署網站問題總結

部署過程中主要發生一下幾個事情,個人認為也是經常出現的問題難點,所以這裡以問題的形式程序說明。 1. centos系統的python3-mysql-虛擬環境的安裝及相關配置 這個就不再詳細說明,具體參考之前寫的文章: 阿里雲Linux系統配置python3-虛擬環境-mysql --踩坑實踐(Ubuntu