1. 程式人生 > >16、CentOS7 安裝Docker之擴充套件(docker叢集管理叢集之swram)

16、CentOS7 安裝Docker之擴充套件(docker叢集管理叢集之swram)

docker叢集管理之swarm

一、前言

實踐中會發現,生產環境中使用單個 Docker 節點是遠遠不夠的,搭建 Docker 叢集勢在必行。然而,面對 Kubernetes, Mesos 以及 Swarm 等眾多容器集群系統,我們該如何選擇呢?它們之中,Swarm 是 Docker 原生的,同時也是最簡單,最易學,最節省資源的,比較適合中小型公司使用。

Docker Swarm 介紹

Swarm 在 Docker 1.12 版本之前屬於一個獨立的專案,在 Docker 1.12 版本釋出之後,該專案合併到了 Docker 中,成為 Docker 的一個子命令。目前,Swarm 是 Docker 社群提供的唯一一個原生支援 Docker 叢集管理的工具。它可以把多個 Docker 主機組成的系統轉換為單一的虛擬 Docker 主機,使得容器可以組成跨主機的子網網路。

Docker Swarm 是一個為 IT 運維團隊提供叢集和排程能力的編排工具。使用者可以把叢集中所有 Docker Engine 整合進一個「虛擬 Engine」的資源池,通過執行命令與單一的主 Swarm 進行溝通,而不必分別和每個 Docker Engine 溝通。在靈活的排程策略下,IT 團隊可以更好地管理可用的主機資源,保證應用容器的高效執行。

Docker Swarm 優點

任何規模都有高效能表現

對於企業級的 Docker Engine 叢集和容器排程而言,可拓展性是關鍵。任何規模的公司——不論是擁有五個還是上千個伺服器——都能在其環境下有效使用 Swarm。 經過測試,Swarm 可拓展性的極限是在 1000 個節點上執行 50000 個部署容器,每個容器的啟動時間為亞秒級,同時效能無減損。

靈活的容器排程

Swarm 幫助 IT 運維團隊在有限條件下將效能表現和資源利用最優化。Swarm 的內建排程器(scheduler)支援多種過濾器,包括:節點標籤,親和性和多種容器部策略如 binpack、spread、random 等等。

服務的持續可用性

Docker Swarm 由 Swarm Manager 提供高可用性,通過建立多個 Swarm master 節點和制定主 master 節點宕機時的備選策略。如果一個 master 節點宕機,那麼一個 slave 節點就會被升格為 master 節點,直到原來的 master 節點恢復正常。 此外,如果某個節點無法加入叢集,Swarm 會繼續嘗試加入,並提供錯誤警報和日誌。在節點出錯時,Swarm 現在可以嘗試把容器重新排程到正常的節點上去。

和 Docker API 及整合支援的相容性Swarm 對 Docker API 完全支援,這意味著它能為使用不同 Docker 工具(如 Docker CLI,Compose,Trusted Registry,Hub 和 UCP)的使用者提供無縫銜接的使用體驗。

Docker Swarm 為 Docker 化應用的核心功能(諸如多主機網路和儲存卷管理)提供原生支援。開發的 Compose 檔案能(通過 docker-compose up )輕易地部署到測試伺服器或 Swarm 叢集上。Docker Swarm 還可以從 Docker Trusted Registry 或 Hub 裡 pull 並 run 映象。

綜上所述,Docker Swarm 提供了一套高可用 Docker 叢集管理的解決方案,完全支援標準的 Docker API,方便管理排程叢集 Docker 容器,合理充分利用叢集主機資源。

* 並非所有服務都應該部署在Swarm叢集內。資料庫以及其它有狀態服務就不適合部署在Swarm叢集內。*

相關概念

節點

執行 Docker 的主機可以主動初始化一個 Swarm 叢集或者加入一個已存在的 Swarm 叢集,這樣這個執行 Docker 的主機就成為一個 Swarm 叢集的節點 (node) 。節點分為管理 (manager) 節點和工作 (worker) 節點。

管理節點用於 Swarm 叢集的管理,docker swarm 命令基本只能在管理節點執行(節點退出叢集命令 docker swarm leave 可以在工作節點執行)。一個 Swarm 叢集可以有多個管理節點,但只有一個管理節點可以成為 leader,leader 通過 raft 協議實現。

工作節點是任務執行節點,管理節點將服務 (service) 下發至工作節點執行。管理節點預設也作為工作節點。你也可以通過配置讓服務只執行在管理節點。下圖展示了叢集中管理節點與工作節點的關係。

服務和任務

任務 (Task)是 Swarm 中的最小的排程單位,目前來說就是一個單一的容器。 服務 (Services) 是指一組任務的集合,服務定義了任務的屬性。服務有兩種模式:

replicated services 按照一定規則在各個工作節點上執行指定個數的任務。global services 每個工作節點上執行一個任務兩種模式通過 docker service create 的 --mode 引數指定。下圖展示了容器、任務、服務的關係。

建立 Swarm 叢集

我們知道 Swarm 叢集由管理節點和工作節點組成。我們來建立一個包含一個管理節點和兩個工作節點的最小 Swarm 叢集。

 

 

二、準備環境CentOS 7下使用 yum 安裝)

主機名稱

IP地址

作業系統

軟體

linux-node1.server.com

192.168.10.101

CentOS7.2

Docker

linux-node2.server.com

192.168.10.102

CentOS7.2

Docker

linux-node3.server.com

192.168.10.103

CentOS7.2

Docker

將主機名為linux-node1.server.com的機器作為manager節點,也就是管理節點,而linux-node2.server.com和linux-node3.server.com作為工作節點。

Docker 要求 CentOS 系統的核心版本高於 3.10 ,檢視本頁面的前提條件來驗證你的CentOS 版本是否支援 Docker 。

1、關閉防火牆\關閉SeLinux\設定時間同步(在node1、node2、node3上操作):

systemctl stop firewalld.service && systemctl disable firewalld.service

sed -i "s/SELINUX=enforcing/SELINUX=disabled/"   /etc/selinux/config

setenforce 0

yum -y install wget net-tools ntp ntpdate lrzsz

systemctl restart ntpdate.service ntpd.service && systemctl enable ntpd.service ntpdate.service

 

2、配置主機對映/etc/hosts(在node1、node2、node3上操作):

echo 192.168.10.101  linux-node1.server.com  >> /etc/hosts

echo 192.168.10.102  linux-node2.server.com  >> /etc/hosts

echo 192.168.10.103  linux-node3.server.com  >> /etc/hosts

hostnamectl --static set-hostname linux-node1.server.com

bash

 

3、安裝 Docker(在node1、node2、node3上操作)

Docker 軟體包和依賴包已經包含在預設的 CentOS-Extras 軟體源裡,安裝命令如下:

yum -y install docker-io

 yum list installed | grep docker

docker.x86_64                        2:1.13.1-68.gitdded712.el7.centos @extras  

docker-client.x86_64                 2:1.13.1-68.gitdded712.el7.centos @extras  

docker-common.x86_64                 2:1.13.1-68.gitdded712.el7.centos @extras

 

4.映象加速(在node1、node2、node3上操作):

鑑於國內網路問題,後續拉取 Docker 映象十分緩慢,我們可以需要配置加速器來解決,我使用的是阿里的映象地址:

在/etc/docker/daemon.json檔案中新增如下內容.

{

  "registry-mirrors": ["https://wghlmi3i.mirror.aliyuncs.com"]

}

或者使用如下地址

{

  "registry-mirrors": ["https://registry.docker-cn.com"]

}

 

5、啟動 Docker 後臺服務(在node1、node2、node3上操作):

systemctl start docker.service

到此,docker 在 CentOS 系統的安裝完成。

 

 

三、建立swarm叢集:

1、初始化叢集(在node1上操作)

[[email protected] ~]# docker swarm init --advertise-addr 192.168.10.101

Swarm initialized: current node (xxkq6mhnilt0lulmhwrwrtfrr) is now a manager.

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

    docker swarm join \

    --token SWMTKN-1-1m7l3vepkees60zh321bssfdlqo36vjvoy5b1mlm0mcypcq13e-58azd8nskaixhbxjh1mvcx8jt \

    192.168.10.101:2377

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

 

2、檢視叢集狀態(在node1上操作)

[[email protected] ~]# docker info | grep -i swarm

Swarm: active   #啟用狀態

 

3、檢視埠狀態(在node1上操作)

[[email protected] ~]# netstat -tunlp | grep docker (預設監聽兩個埠,tcp2377埠為叢集的管理埠,tcp7946為節點之間的通訊埠)

tcp6       0      0 :::2377                 :::*                    LISTEN      3979/dockerd-curren

tcp6       0      0 :::7946                 :::*                    LISTEN      3979/dockerd-curren

 

4、檢視預設建立網路(在node1上操作)

(預設會建立一個overlay的網路ingress,還會建立一個橋接的網路docker_gwbridge)

[[email protected] ~]# docker network ls

NETWORK ID          NAME                DRIVER              SCOPE

c3f9bacc7a27        bridge              bridge              local

169aedb818b9        docker_gwbridge     bridge              local

6488efd3fa8a        host                host                local

squcqnplf4gz        ingress             overlay             swarm

b044056e55bd        none                null                local

 

 

5、檢視叢集節點(在node1上操作)

[[email protected] ~]# docker node ls

ID                           HOSTNAME                STATUS  AVAILABILITY  MANAGER STATUS

xxkq6mhnilt0lulmhwrwrtfrr *  linux-node1.server.com  Ready   Active        Leader

 

6、檢視swarm配置檔案(在node1上操作)

[[email protected] ~]# ll /var/lib/docker/swarm/

drwxr-xr-x 2 root root  72 Sep 27 09:14 certificates (使用的tls來進行安全通訊)

-rw------- 1 root root 112 Sep 27 09:14 docker-state.json(用來記錄通訊的地址和埠,也會記錄本地的地址和埠)

drwx------ 4 root root  53 Sep 27 09:14 raft(raft協議)

-rw------- 1 root root  70 Sep 27 09:14 state.json (manager的ip和埠)

drwxr-xr-x 2 root root  21 Sep 27 09:14 worker (記錄工作節點下發的任務資訊)

 

 

  1. 將其他節點接入swarm叢集(在node2、node3上操作)

[[email protected] ~]# docker swarm join --token SWMTKN-1-1m7l3vepkees60zh321bssfdlqo36vjvoy5b1mlm0mcypcq13e-58azd8nskaixhbxjh1mvcx8jt 192.168.10.101:2377

[[email protected] ~]#  docker swarm join --token SWMTKN-1-1m7l3vepkees60zh321bssfdlqo36vjvoy5b1mlm0mcypcq13e-58azd8nskaixhbxjh1mvcx8jt 192.168.10.101:2377

 注:當忘記了加入叢集的token的時候,可以使用如下的指令找到token,然後在node節點上直接執行,就可以加入worker節點或者是manager節點。

[[email protected] ~]# docker swarm join-token worker

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

    docker swarm join \

    --token SWMTKN-1-1m7l3vepkees60zh321bssfdlqo36vjvoy5b1mlm0mcypcq13e-58azd8nskaixhbxjh1mvcx8jt \

    192.168.10.101:2377

 

 

8、檢視叢集狀態(在node1上操作)

[[email protected] ~]# docker node ls

ID                           HOSTNAME                STATUS  AVAILABILITY  MANAGER STATUS

ibrkg91oq7ezcqtr9b25e2ook    linux-node2.server.com  Ready   Active        

uzvohbfv7ta440px57b4o7bn6    linux-node3.server.com  Ready   Active        

xxkq6mhnilt0lulmhwrwrtfrr *  linux-node1.server.com  Ready   Active        Leader

 

9、節點之間的角色可以隨時進行切換,使用update(在node1上操作)

[[email protected] ~]# docker node update --role manager linux-node3.server.com

linux-node3.server.com

[[email protected] ~]# docker node ls

ID                           HOSTNAME                STATUS  AVAILABILITY  MANAGER STATUS

ibrkg91oq7ezcqtr9b25e2ook    linux-node2.server.com  Ready   Active        

uzvohbfv7ta440px57b4o7bn6    linux-node3.server.com  Ready   Active        Reachable

xxkq6mhnilt0lulmhwrwrtfrr *  linux-node1.server.com  Ready   Active        Leader

[[email protected] ~]# docker node update --role worker linux-node3.server.com

linux-node3.server.com

[[email protected] ~]# docker node ls

ID                           HOSTNAME                STATUS  AVAILABILITY  MANAGER STATUS

ibrkg91oq7ezcqtr9b25e2ook    linux-node2.server.com  Ready   Active        

uzvohbfv7ta440px57b4o7bn6    linux-node3.server.com  Ready   Active        

xxkq6mhnilt0lulmhwrwrtfrr *  linux-node1.server.com  Ready   Active        Leader

 

四、執行服務(都是在node1上操作):

1、服務為service,也就是一組task的集合,而一個task則表示為一個容器,從基本概念來說,執行一個service,可能有幾個task,例如執行幾個nginx的服務,從而會拆解為幾個nginx的容器在各個節點上進行執行。

[[email protected] ~]# docker service create --name web nginx

sn3lxly6d272l0fgxk7gkuebq

 

2、建立一個名稱問frontweb的服務,模式為global,映象為nginx:

[[email protected] ~]# docker service create --name web2 --mode global nginx

z4rkquh3byqglxw4wa0p6j9vt

 

3、檢視執行的服務:

[[email protected] ~]# docker service ls

ID            NAME  MODE        REPLICAS  IMAGE

sn3lxly6d272  web   replicated  1/1       nginx:latest

z4rkquh3byqg  web2  global      3/3       nginx:latest

 

 

4、檢視執行服務的詳細資訊,預設情況下manager也可以執行服務:

[[email protected] ~]# docker service ps web

ID            NAME   IMAGE         NODE                    DESIRED STATE  CURRENT STATE          ERROR  PORTS

gxm5271mckck  web.1  nginx:latest  linux-node2.server.com  Running

 

[[email protected] ~]# docker service ps web2

ID            NAME                            IMAGE         NODE                    DESIRED STATE  CURRENT STATE               ERROR  PORTS

j1crkmli5pr0  web2.xxkq6mhnilt0lulmhwrwrtfrr  nginx:latest  linux-node1.server.com  Running        Running about a minute ago         

lkxl8b4njuc2  web2.uzvohbfv7ta440px57b4o7bn6  nginx:latest  linux-node3.server.com  Running        Running about a minute ago         

qy96s6g9gpq0  web2.ibrkg91oq7ezcqtr9b25e2ook  nginx:latest  linux-node2.server.com  Running        Running 3 minutes ago     

說明:在建立服務的時候,會經過幾個狀態,一個是prepared,表示準備,主要是從倉庫拉取映象,然後啟動容器,也就是starting,最後會進行驗證容器狀態,從而最後變成running狀態。

    在檢視服務的時候,會出現一個mode,也就是服務的型別,可以分為兩種,一種replicated,表示副本,預設情況下是使用replicated模式,並且預設情況只會建立一個副本,主要使用的目的是為了高可用;另外一種為global,也就是必須在每個機器上執行一個task也就是容器,可以看到在使用global的模式的時候建立了三個容器。

 

[[email protected] ~]# docker service inspect web2 --pretty

ID:             z4rkquh3byqglxw4wa0p6j9vt

Name:           web2

Service Mode:   Global

Placement:

UpdateConfig:

 Parallelism:   1

 On failure:    pause

 Max failure ratio: 0

ContainerSpec:

 Image:         nginx:[email protected]:e8ab8d42e0c34c104ac60b43ba60b19af08e19a0e6d50396bdfd4cef0347ba83

Resources:

Endpoint Mode:  vip

 

 

 

五、服務擴容:

在使用服務的時候,由於是叢集,那麼就必然會涉及到高可用,從而會有服務的擴容和縮容,在swarm中還是很容易的。

1、將擴容web服務為4個(在node1上操作)

[[email protected] ~]# docker service scale web=4

web scaled to 4

 

2、檢視服務(在node1上操作)

[[email protected] ~]# docker service ls

ID            NAME  MODE        REPLICAS  IMAGE

sn3lxly6d272  web   replicated  4/4       nginx:latest

z4rkquh3byqg  web2  global      3/3       nginx:latest

 

[[email protected] ~]# docker service ps web

ID            NAME   IMAGE         NODE                    DESIRED STATE  CURRENT STATE               ERROR  PORTS

gxm5271mckck  web.1  nginx:latest  linux-node2.server.com  Running        Running 14 minutes ago             

3y0qu5gdbvy7  web.2  nginx:latest  linux-node1.server.com  Running        Running about a minute ago         

l30ado91q5ue  web.3  nginx:latest  linux-node3.server.com  Running        Running about a minute ago         

o14b8xwy4tx0  web.4  nginx:latest  linux-node3.server.com  Running        Running about a minute ago  

 

3、服務縮容(在node1上操作)

[[email protected] ~]# docker service scale web=2

web scaled to 2

 

4、檢視服務(在node1上操作)

[[email protected] ~]# docker service ls

ID            NAME  MODE        REPLICAS  IMAGE

sn3lxly6d272  web   replicated  2/2       nginx:latest

z4rkquh3byqg  web2  global      3/3       nginx:latest

 

[[email protected] ~]# docker service ps web

ID            NAME   IMAGE         NODE                    DESIRED STATE  CURRENT STATE           ERROR  PORTS

gxm5271mckck  web.1  nginx:latest  linux-node2.server.com  Running        Running 17 minutes ago         

3y0qu5gdbvy7  web.2  nginx:latest  linux-node1.server.com  Running        Running 4 minutes ago

 

 

Manager不執行容器:

注意:當要讓swarm的manager節點不執行容器的時候,只要更改節點的狀態,從Active變成Drain即可,如果在manager上執行容器,那麼當manager宕機的時候,如果不是多節點的manager,會導致此服務無法進行排程。

 

5、將manager節點的狀態修改為drain狀態,從而不會執行相關的task任務(在node1上操作)

[[email protected] ~]# docker node update --availability drain linux-node1.server.com

linux-node1.server.com

 

 

 

6、檢視節點的狀態從active變成drain(在node1上操作)

[[email protected] ~]# docker node ls

ID                           HOSTNAME                STATUS  AVAILABILITY  MANAGER STATUS

ibrkg91oq7ezcqtr9b25e2ook    linux-node2.server.com  Ready   Active        

uzvohbfv7ta440px57b4o7bn6    linux-node3.server.com  Ready   Active        

xxkq6mhnilt0lulmhwrwrtfrr *  linux-node1.server.com  Ready   Drain         Leader

 

 

7、本來執行在docker-ce上的容器會被關閉,然後自動遷移到其他的worker節點上(在node1上操作)

[[email protected] ~]# docker service ps web

ID            NAME       IMAGE         NODE                    DESIRED STATE  CURRENT STATE                ERROR  PORTS

gxm5271mckck  web.1      nginx:latest  linux-node2.server.com  Running        Running 24 minutes ago              

rnde0zdcpnyl  web.2      nginx:latest  linux-node3.server.com  Running        Running about a minute ago          

3y0qu5gdbvy7   \_ web.2  nginx:latest  linux-node1.server.com  Shutdown       Shutdown about a minute ago

 

 

 

六、故障自動轉移:

   在叢集中,當有機器發生宕機了咋辦,swarm可以做到自動遷移,但是在生產環境中需要考慮的一個問題就是,如果出現了自動的failover,那麼其他的機器是否有足夠的資源來建立這些容器,所以,在進行執行容器的時候,就要考慮剩餘資源的問題,例如cpu和記憶體。

1、檢視服務(在node1上操作)

[[email protected] ~]# docker service ps web

ID            NAME   IMAGE         NODE                    DESIRED STATE  CURRENT STATE           ERROR  PORTS

gxm5271mckck  web.1  nginx:latest  linux-node2.server.com  Running        Running 35 minutes ago         

shlloll6mog5  web.2  nginx:latest  linux-node3.server.com  Running        Running 2 seconds ago          

[[email protected] ~]#

 

2、關閉node3的docker服務,模擬機器宕機(在node3上操作)

[[email protected] ~]# systemctl stop docker.service

 

3、檢視node資訊,發現dockernode3主機標記為down(在node1上操作)

[[email protected] ~]# docker node ls

ID                           HOSTNAME                STATUS  AVAILABILITY  MANAGER STATUS

ibrkg91oq7ezcqtr9b25e2ook    linux-node2.server.com  Ready   Active        

uzvohbfv7ta440px57b4o7bn6    linux-node3.server.com  Down    Active        

xxkq6mhnilt0lulmhwrwrtfrr *  linux-node1.server.com  Ready   Drain         Leader

 

4、檢視自動遷移後的服務,會將宕機的服務全部標記為shutdown關閉(在node1上操作)

[[email protected] ~]# docker service ps web

ID            NAME       IMAGE         NODE                    DESIRED STATE  CURRENT STATE           ERROR  PORTS

gxm5271mckck  web.1      nginx:latest  linux-node2.server.com  Running        Running 40 minutes ago         

zvfgn8bi2mf6  web.2      nginx:latest  linux-node2.server.com  Running        Running 2 minutes ago          

shlloll6mog5   \_ web.2  nginx:latest  linux-node3.server.com  Shutdown       Running 2 minutes ago      

 

5、將node3的docker服務上線(在node3上操作)

[[email protected] ~]# systemctl start docker.service

 

6、檢視服務(在node1上操作)

[[email protected] ~]# docker node ls #主機狀態變成ready,表示可執行task任務

ID                           HOSTNAME                STATUS  AVAILABILITY  MANAGER STATUS

ibrkg91oq7ezcqtr9b25e2ook    linux-node2.server.com  Ready   Active        

uzvohbfv7ta440px57b4o7bn6    linux-node3.server.com  Ready   Active        

xxkq6mhnilt0lulmhwrwrtfrr *  linux-node1.server.com  Ready   Drain         Leader

 

7、再次檢視服務的分佈,服務不會再次進行遷移到不同的機器上,維持原狀(在node1上操作)

[[email protected] ~]# docker service ps web

ID            NAME       IMAGE         NODE                    DESIRED STATE  CURRENT STATE           ERROR                             PORTS

gxm5271mckck  web.1      nginx:latest  linux-node2.server.com  Running        Running 45 minutes ago                                    

zvfgn8bi2mf6  web.2      nginx:latest  linux-node2.server.com  Running        Running 7 minutes ago                                     

shlloll6mog5   \_ web.2  nginx:latest  linux-node3.server.com  Shutdown       Failed 4 minutes ago    "No such container: web.2.shll…"  

 

七、訪問服務:

訪問服務的時候,主要分為兩種,一種是內部訪問的服務,也就是不對外開放埠,一種是對外的服務,會向外開放埠,也就是主機對映埠。

1、建立兩個副本的http服務(在node1上操作)

[[email protected] ~]# docker service create --name web3 --replicas=2 httpd

hzfom5zyswu5lds4bfi8g3kdo

 

2、檢視執行容器的主機(在node1上操作)

[[email protected] ~]# docker service ps web3

ID            NAME    IMAGE         NODE                    DESIRED STATE  CURRENT STATE             ERROR  PORTS

mtkxm1sy5pc1  web3.1  httpd:latest  linux-node2.server.com  Running        Preparing 28 seconds ago         

0rvvrjep52wf  web3.2  httpd:latest  linux-node3.server.com  Running        Preparing 28 seconds ago         

[[email protected] ~]#

 

3、登入本地主機,檢視執行的容器(在node1上操作)

[[email protected] ~]# docker pull httpd

[[email protected] ~]# docker run -d httpd

[[email protected] ~]# docker ps

CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS               NAMES

99ad19a1c221        httpd               "httpd-foreground"   16 seconds ago      Up 15 seconds       80/tcp              hardcore_poitras

 

4、檢視執行容器的ip地址(在node1上操作)

[[email protected] ~]# docker exec 99ad19a1c221 ip addr show

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

       valid_lft forever preferred_lft forever

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

11: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default

    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff

    inet 172.17.0.2/16 scope global eth0

       valid_lft forever preferred_lft forever

    inet6 fe80::42:acff:fe11:2/64 scope link

       valid_lft forever preferred_lft forever

 

 

5、根據ip地址訪問,只能在本節點上進行訪問,屬於內部網路,也就是docker_gwbrige網路(在node1上操作)

[[email protected] ~]# curl 172.17.0.2

<html><body><h1>It works!</h1></body></html>

 

6、新增主機對映埠,從而將服務對外放開,從而外部能訪問此服務(在node1上操作)

[[email protected] ~]# docker service update --publish-add 8888:80 web3

web3

 

7、新增外部能訪問後,將原來的容器關閉,重新執行容器(在node1上操作)

[[email protected] ~]# docker service ps web3

ID            NAME        IMAGE         NODE                    DESIRED STATE  CURRENT STATE            ERROR  PORTS

xsa9jv3zz01h  web3.1      httpd:latest  linux-node2.server.com  Running        Running 24 seconds ago          

mtkxm1sy5pc1   \_ web3.1  httpd:latest  linux-node2.server.com  Shutdown       Shutdown 25 seconds ago         

n4rforlcng54  web3.2      httpd:latest  linux-node3.server.com  Running        Running 26 seconds ago          

0rvvrjep52wf   \_ web3.2  httpd:latest  linux-node3.server.com  Shutdown       Shutdown 27 seconds ago         

 

8、無論是manager節點還是worker節點,均監聽了8000埠,均可以訪問(在node1、node2、node3上操作)

netstat -tunlp | grep 8888

tcp6       0      0 :::8888                 :::*                    LISTEN      2664/dockerd-curren

[[email protected] ~]# curl 192.168.10.101:8888

<html><body><h1>It works!</h1></body></html>

[[email protected] ~]# curl 192.168.10.102:8888

<html><body><h1>It works!</h1></body></html>

[[email protected] ~]# curl 192.168.10.103:8888

<html><body><h1>It works!</h1></body></html>

說明:在這裡主要使用了routing mesh的功能,在swarm內部實現了負載均衡,使用的網路為swarm自動建立的overlay網路。    當使用publish埠的時候,最大的壞處就是對外暴露了埠號,而且在使用的時候,如果進行了故障轉移,那麼多個服務執行在同一個主機上面,會造成端口占用衝突。

 

 

八、服務發現:

 在使用叢集的時候,如果進行了自動轉移,那麼ip地址會發生變化,如果指定了ip地址,那麼就會影響其他服務的使用,從而需要服務發現的功能,也就是自動將服務進行dns的解析,然後負載到正確的服務中。

1、建立overlay網路,預設的ingress網路未實現服務發現的功能(在node1上操作)

[[email protected] ~]# docker network create --driver overlay yanyb

wkm7had2ydek5wqwg1z04fiv4

 

2、將服務