一. 概念剖析
1. docker compose
docker compose是一個編排多容器分布式部署的工具,提供命令集管理容器化應用的完整開發周期,包括服務構建,啟動和停止。它主要是通過docker-compose.yml文件進行相關容器的配置,然后通過一些簡單的指令可以操作該配置文件所包含的容器,常見的操作有:創建容器並啟動、關閉容器、刪除容器等等。(詳見:https://www.cnblogs.com/yaopengfei/p/13672708.html)
注:docker compose相關指令主要是對一個docker-compose.yml文件進行管理,所以它的指令主要服務於單服務器,不適用於集群環境。
另外,一個docker-compose.yml可以管理一組容器,也就是一組任務的集合,這個也叫作services。
2. swarm
(1). 定義
Swarm 是 Docker 官方提供的一款集群管理工具,其主要作用是把若干台 Docker 主機抽象為一個整體,並且通過一個入口統一管理這些 Docker 主機上的各種 Docker 資源。Swarm 和 K8s 比較類似,但是更加輕,具有的功能也較 kubernetes 更少一些。
Swarm內部主要是通過節點(node)進行集群管理的,節點分為:管理節點和工作節點。
簡單的說:swarm就是用來創建管理docker集群的。
(2). 節點概念
運行 Docker 的主機可以主動初始化一個 Swarm 集群或者加入一個已存在的 Swarm 集群,這樣這個運行 Docker 的主機就成為一個 Swarm 集群的節點 (node) ,節點分為管理 (manager) 節點和工作 (worker) 節點。
A. 管理節點:
用於 Swarm 集群的管理,docker swarm 命令基本只能在管理節點執行(節點退出集群命令 docker swarm leave 可以在工作節點執行)。一個 Swarm 集群可以有多個管理節點,但只有一個管理節點可以成為 leader,leader 通過 raft 協議實現。
B. 工作節點
是任務執行節點,管理節點將服務 (service)下發至工作節點執行。管理節點默認也作為工作節點。你也可以通過配置讓服務只運行在管理節點。
3. services
services是指一組任務的集合,服務定義了任務的屬性,服務有兩種模式,如下,兩種模式通過 docker service create 的 --mode 參數指定。
(1). replicated services 按照一定規則在各個工作節點上運行指定個數的任務。
(2). global services 每個工作節點上運行一個任務
簡單的說:services就是在swarm構建好的集群的基礎上進行 “ 單容器創建等容器相關的管理工作 ”。(這里的單容器是指一條指令只能操作一個容器,但這條指令可以在集群的每個節點上生效)
4. stack
Stack 是基於 Docker Swarm 之上來完成應用的部署,Stack 能夠在單個聲明文件中定義復雜的多服務應用。Stack 還提供了簡單的方式來部署應用並管理其完整的生命周期:初始化部署 -> 健康檢查 -> 擴容 -> 更新 -> 回滾,以及其他功能!它可以通過一個docker-compose.yml文件進行多個容器的管理。
簡單的說:stack就是在swarm構建好的集群的基礎上進行“ 多容器創建等容器相關的管理工作 ”。(這里的多容器是指基於docker-compose.yml可以操作多個容器,這條指令可以在集群的每個節點上生效)
換句話說:stack可以同時操作多個services。
5. 總結
Dockerfile、docker compose 、service、node、 swarm、stack
(1). Dockerfile是用來構建鏡像的,一個Dockerfile只能構建一個鏡像
(2). docker compose可以在單機上構建一組任務,可以管理多個容器
(3). service 是一組任務,包含多個鏡像和容器,通常用於在集群的基礎上管理容器
(4). node是swarm中的節點概念,一個節點對應一台服務器。
(5). swarm是用來構建集群
(6). stack是在集群的基礎上管理容器,他可以操作多個service
二. swarm+service集群容器管理
1. 環境准備
(1). 兩台centos服務器:192.168.137.201 和 192.168.137.202
(2). 每個服務器事先准備好兩個webapi鏡像:ypfwebapi1(暴露端口9001) 和 ypfwebapi2(暴露端口9002)
(3). 服務器的防火牆要關閉,相關指令如下:
#查看防火牆服務
systemctl status firewalld.service
#關閉防火牆
systemctl stop firewalld.service
#永久關閉防火牆(可能不好用)
systemctl disable firewalld.service
2. 搭建集群的步驟
(1). 選擇192.168.137.201作為管理(manager)節點,運行下面指令
docker swarm init --advertise-addr 192.168.137.201
(2). 在192.168.137.202主機上執行下面指令,加入工作節點(worker)這個集群
docker swarm join --token SWMTKN-1-254wexmq8blkpmi2ujs8o6job51u6e1jjy3k44pyngwjzx3my2-anldosyr1a9wbww4lriycuaxw 192.168.137.201:2377
PS:出現下面錯誤,說明201服務器的防火牆沒關:(指令見上)
然后重新執行加入集群的命令,執行成功
3. 構建容器的步驟
(1). 在管理(manager)節點上執行下面指令: (201服務器)
# 基於鏡像ypfwebapi1構建service_con1容器 docker service create --replicas 2 --name service_con1 --publish 8201:9001 ypfwebapi1 # 基於鏡像ypfwebapi2構建service_con2容器 docker service create --replicas 2 --name service_con2 --publish 8202:9002 ypfwebapi2
參數說明:
A. - -replicas 2 : 代表在2個任務,即在兩台主機上執行上述指令
B. -- publish:端口映射,8201為容器的端口,9001是鏡像的端口。
注:程序的端口必須寫死在程序中或dockerfile中,因為這里不能動態傳參。
運行如圖:
(2). 查看相應信息
A. 在管理節點服務器上: 用指令【docker service ls】查看集群中的容器情況 , 【docker node ls】查看節點情況。
B. 在工作節點服務器上,用指令【docker ps】查看
4. 測試
經測試,以下4個地址均可以正常訪問。
http://192.168.137.201:8201/weatherforecast http://192.168.137.201:8202/weatherforecast http://192.168.137.202:8201/weatherforecast http://192.168.137.202:8202/weatherforecast
5. 指令總結
二. swarm+stack進行集群容器管理
1. 環境准備
同上。
2. 搭建集群
同上。
3. stack構建容器步驟
(1). 在管理節點服務器上(201服務器)進行操作
在工作目錄上新建一個文件夾 【mkdir mystack】,然后新建一個docker-compose.yml文件【vi docker-compose.yml】,復制下面內容進去並保存。
內容如下:
{ "version": "3.8", "services": { "api1": {
"image": "ypfwebapi1", "ports": [ "8301:9001" ], "deploy": { "mode": "replicated", "replicas": 2 } }, "api2": {
"image": "ypfwebapi2", "ports": [ "8302:9002" ], "deploy": { "mode": "replicated", "replicas": 2 } } } }
PS: 這里個人傾向使用json格式,縮進的那種格式非常容易出錯。 參數介紹詳見:https://www.cnblogs.com/yaopengfei/p/13672708.html
(2). 進入mystack文件下,運行下面指令進行發布,其中ypfstack1是 stack的名稱。
docker stack deploy -c docker-compose.yml ypfstack1
(3). 查看相關信息
A. 查看所有的stack 【docker stack ls】
B. 查看所有的service 【docker service ls】
4. 測試
以下4個地址均能訪問
http://192.168.137.201:8301/weatherforecast http://192.168.137.201:8302/weatherforecast http://192.168.137.202:8301/weatherforecast http://192.168.137.202:8302/weatherforecast
5. 其他
!
- 作 者 : Yaopengfei(姚鵬飛)
- 博客地址 : http://www.cnblogs.com/yaopengfei/
- 聲 明1 : 如有錯誤,歡迎討論,請勿謾罵^_^。
- 聲 明2 : 原創博客請在轉載時保留原文鏈接或在文章開頭加上本人博客地址,否則保留追究法律責任的權利。