1.容器編排
容器編排:就是針對(duì)容器生命周期的管理,對(duì)容器的生命周期進(jìn)行更快速方便的方式進(jìn)行管理。
實(shí)例:一個(gè)java程序,依賴了mysql,redis,要想把 java 程序運(yùn)行起來,則必須要先啟動(dòng) mysql、redis。那么這三者這件就存在了依賴關(guān)聯(lián)。
?
容器編排存在的意義:
- 依賴管理,當(dāng)一個(gè)容器必須在另一個(gè)容器運(yùn)行完成后,才能運(yùn)行時(shí),就需要進(jìn)行依賴管理
- 副本數(shù)控制,容器有時(shí)候也需要集群,快速的對(duì)容器集群進(jìn)行彈性伸縮
- 配置共享,通過配置文件統(tǒng)一描述需要運(yùn)行的服務(wù)相關(guān)信息,自動(dòng)化的解析配置內(nèi)容,并構(gòu)建對(duì)應(yīng)的服務(wù)
?容器編排的出現(xiàn),就是讓開發(fā)者可以更簡(jiǎn)單的使用容器,省去頻繁的寫各種命令,docker 容器編排的出現(xiàn),就類似 shell 腳本,一鍵搞定!
容器編排,主要有兩種模式:
- 基于Docker Compose(單機(jī))
- 基于Swarm(集群)
2.Docker Compose
??Docker Compose 是單機(jī)環(huán)境下的容器編排。
?
??有的時(shí)候我們會(huì)需要涉及到在一臺(tái)機(jī)器部署多個(gè)容器,那么此時(shí)再手動(dòng)的每次輸入相關(guān)的一堆配置命令再來啟動(dòng)容器,還是產(chǎn)生了很多無意義的重復(fù)性勞動(dòng)。針對(duì)單機(jī)的多容器部署的情況,Docker 為我們提供了一個(gè)單機(jī)版本的服務(wù)編排工具 docker-compose
?
??Docker-Compose 可以高效便捷的管理單機(jī)上運(yùn)行的所有容器,它通過 yaml 配置文件的方式完成之前執(zhí)行 docker run 命令所設(shè)置的所有參數(shù),你可以先針對(duì)單機(jī)上的所有容器進(jìn)行相關(guān)配置,配置完成后即可使用 docker-compose 對(duì)單機(jī)多容器進(jìn)行高效的管理
?
??docker compose 容器編排,就是基于docker-compose.yml
配置文件進(jìn)行的容器編排。只要學(xué)會(huì)如何編寫這個(gè)配置文件,就會(huì)用這個(gè)玩意了。
1.Docker Compose 安裝
注意:需要注意的是,docker-compose 與docker有版本對(duì)應(yīng)關(guān)系,因此在使用docker-compose時(shí)需要選擇與已安裝的docker版本相對(duì)應(yīng)的docker-compose版本,否則可能會(huì)出現(xiàn)不兼容或無法正常工作的問題。但是!我在官網(wǎng)一致沒有找到 docker 和 docker-compose 的對(duì)應(yīng)關(guān)系表啊,有知道的小伙伴能評(píng)論發(fā)我一下嗎??我只找到個(gè) docker compose 發(fā)行版本,依賴的 docker 需要升級(jí)的版本,docker compose 發(fā)行版本地址:https://docs.docker.com/compose/release-notes。如下圖所示:
?
因?yàn)?docker 使用的是最新版本:24.0.6
,所以 docker compose 也使用了最新版本2.21.0
?
還有一個(gè)對(duì)應(yīng)關(guān)系表,在這里,也沒有太看懂。地址:
- https://docs.docker.com/compose/compose-file/compose-file-v2
- https://docs.docker.com/compose/compose-file/compose-file-v3
Docker Compose 下載地址:https://github.com/docker/compose/releases/download/v2.21.0/docker-compose-linux-x86_64
?
# step 1:下載 docker compose 最新版本
curl -L "https://github.com/docker/compose/releases/download/v2.21.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# $(uname -s) 系統(tǒng)內(nèi)核,即:linux
# $(uname -m) 系統(tǒng)架構(gòu),即:x86_64
# step 2:將可執(zhí)行權(quán)限應(yīng)用于二進(jìn)制文件
sudo chmod +x /usr/local/bin/docker-compose
# step 3:創(chuàng)建軟鏈
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# step 4:測(cè)試是否安裝成功
docker-compose --version
2.Docker Compose 示例
# docker 啟動(dòng) nginx命令:
docker run -d --restart=always --network xxx -v /www/abc:/usr/share/nginx/html -e APP_ENV=dev -p 80:80 --name nginx-compose nginx
# 命令解釋:
# -d 后臺(tái)運(yùn)行
# --restart=always 出現(xiàn)異常后總是自動(dòng)重啟
# --network xxx 自定義網(wǎng)絡(luò)
# -v /www/abc:/usr/share/nginx/html 將[本地目錄/www/abc]與[容器目錄/usr/share/nginx/html] 進(jìn)行數(shù)據(jù)卷綁定
# -e APP_ENV=dev 添加環(huán)境變量
# -p 80:80 端口映射
# --name 容器名稱
# nginx 鏡像名
上述命令,就可以在 docker 中啟動(dòng)一個(gè) nginx 容器了。
- 在不使用來回復(fù)制、粘貼的方式,如何將這條命令復(fù)用呢?
- 這個(gè)命令還不算太長,如果命令更長的怎么辦呢?
?這樣就需要用到 docker compose 了。
1.使用 docker-compose 啟動(dòng) nginx
創(chuàng)建一個(gè)
/opt/docker/nginx
文件夾,在nginx文件夾下創(chuàng)建一個(gè)docker-compose.yml
文件,進(jìn)入文件,就可以編寫 docker compose了
參考官網(wǎng)進(jìn)行編寫docker compose即可。因?yàn)閐ocker compose的配置項(xiàng)太多了。截至
2023-09-14
,使用的docker 24.0.6
和docker compose 2.21.0
,所以此處直接使用 Compose V3版本。地址:https://docs.docker.com/compose/compose-file/compose-file-v3
?
配置超級(jí)多,根本記不住。所以參考官網(wǎng)來寫就好了。
?
如果是一個(gè)普通的鏡像,更多的關(guān)注【服務(wù)services】、【網(wǎng)絡(luò)networks】、【數(shù)據(jù)卷volumes】這三個(gè)配置項(xiàng)就可以了
?
# docker 啟動(dòng) nginx命令:
docker run -d --restart=always --network xxx -v /www/abc:/usr/share/nginx/html -e APP_ENV=dev -p 80:80 --name nginx-compose nginx
上面的命令,轉(zhuǎn)成 nginx compose 如下:
version: "3.8"
services:
nginx-demo-compose:
contianer_name: "nginx-compose"
image: nginx
restart: always
networks: nginx_net
volumes:
- /www/abc:/usr/share/nginx/html
environment:
- APP_ENV=dev
ports:
- 80:80
networks:
nginx_net:
ipam:
driver: default
config:
- subnet: "172.16.238.0/24"
2.docker compose 常用命令
命令 | 說明 |
---|---|
build | 先構(gòu)建完鏡像,然后構(gòu)建一個(gè)docker服務(wù)(如果開始就已經(jīng)是個(gè)鏡像了,則會(huì)跳過,命令不生效) |
config | 規(guī)范、驗(yàn)證并查看 compose 文件,驗(yàn)證通過后,控制臺(tái)會(huì)返回 compose 文件內(nèi)容 |
cp | 在容器和本地文件系統(tǒng)之間復(fù)制文件/文件夾 |
create | 為 compose 中的 service 服務(wù)創(chuàng)建容器。 |
down | 停止并刪除容器、網(wǎng)絡(luò) |
events | 從容器接收實(shí)時(shí)事件 |
exec | 在運(yùn)行中的容器中執(zhí)行命令 |
images | 列出創(chuàng)建的容器使用的鏡像 |
kill | 強(qiáng)制停止服務(wù)容器 |
logs | 查看容器的日志輸出 |
ls | 列出正在運(yùn)行的 compose 項(xiàng)目 |
pause | 暫停 service 服務(wù) |
port | 輸出端口綁定的公共端口 |
ps | 列出容器 |
pull | 拉取 service 服務(wù)鏡像 |
push | 推送 service 服務(wù)鏡像 |
restart | 重啟 service 服務(wù)容器 |
rm | 刪除停止的服務(wù)容器 |
run | 在服務(wù)上運(yùn)行一次性命令 |
start | 啟動(dòng)服務(wù) |
stop | 停止服務(wù) |
top | 顯示正在運(yùn)行的進(jìn)程 |
unpause | 取消暫停服務(wù) |
up | 創(chuàng)建并啟動(dòng)一個(gè)容器 |
version | 顯示 Docker Compose 版本信息 |
wait | 等待阻塞直到第一個(gè)服務(wù)容器停止 |
提示: 更詳細(xì)命令說明,使用
docker compose [命令] --help
了解。比如:docker compose up --help
擴(kuò)縮容命令:
命令 | 說明 |
---|---|
docker compose up --scale 服務(wù)名=num | 擴(kuò)容/縮容,服務(wù)名為compose文件服務(wù)名,num 為數(shù)量 |
3.校驗(yàn) docker-compose.yml 是否有錯(cuò)誤
# 進(jìn)入/opt/docker/nginx 目錄,在docker-compose.yml同級(jí)下,執(zhí)行如下命令
docker compose config
4.創(chuàng)建服務(wù),啟動(dòng)容器
進(jìn)入
/opt/docker/nginx
目錄下,在docker-compose.yml
同級(jí)目錄下,開始操作
# step 1:創(chuàng)建服務(wù)(此處也可以啟動(dòng)compose中的特定服務(wù):docker compose create 服務(wù)名)
docker compose create
# step 2:查看服務(wù)是否創(chuàng)建成功
docker compose ps -a
# step 3:后臺(tái)啟動(dòng)容器
docker compose up -d
如圖所示:
5.彈性伸縮<擴(kuò)縮容>
擴(kuò)縮容命令,如下:
docker compose up -d --scale 服務(wù)名=num
擴(kuò)縮容注意:
- 需要?jiǎng)h除 container_name (docker 不允許多個(gè)容器具有相同的名稱)
- 修改 port 端口映射(一個(gè)服務(wù)只能一個(gè)端口,會(huì)提示端口占用問題)
修改后的 docker-compose.yaml 如下:
version: "3.8"
services:
nginx-demo:
image: nginx
restart: always
networks:
- nginx_net
volumes:
- /www/abc:/usr/share/nginx/html
environment:
- APP_ENV=dev
ports:
- 80 # 此處80代表容器中的80端口,映射到本地的隨機(jī)端口
networks:
nginx_net:
ipam:
driver: default
config:
- subnet: "172.16.238.0/24"
修改配置信息后,執(zhí)行
docker compose up -d
,便會(huì)重新讀取compose配置,啟動(dòng)容器
3.Docker Swarm
Swarm 也是需要提前安裝好 Docker Compose ?。?!
?
??Swarm 是 Docker 公司推出的用來管理 docker 集群的平臺(tái),幾乎全部用GO語言來完成的開發(fā)的, 它是將一群 Docker 宿主機(jī)變成一個(gè)單一的虛擬主機(jī),Swarm 使用標(biāo)準(zhǔn)的 Docker API 接口作為其前端的訪問入口,換言之,各種形式的DockerClient(compose, docker-py 等) 均可以直接與 Swarm 通信,甚至 Docker 本身都可以很容易的與 Swarm 集成,這大大方便了用戶將原本基于單節(jié)點(diǎn)的系統(tǒng)移植到 Swarm 上,同時(shí)Swarm 內(nèi)置了對(duì) Docker 網(wǎng)絡(luò)插件的支持,用戶也很容易的部署跨主機(jī)的容器集群服務(wù)。
?
??Docker Swarm 和 Docker Compose 一樣,都是 Docker 官方容器編排項(xiàng)目,但不同的是,Docker Compose 是一個(gè)在單個(gè)服務(wù)器或主機(jī)上創(chuàng)建多個(gè)容器的工具,而 Docker Swarm 則可以在多個(gè)服務(wù)器或主機(jī)上創(chuàng)建容器集群服務(wù),對(duì)于微服務(wù)的部署,顯然 Docker Swarm 會(huì)更加適合。
?
??從 Docker 1.12.0 版本開始,Docker Swarm 已經(jīng)包含在 Docker 引擎中(docker swarm),并且已經(jīng)內(nèi)置了服務(wù)發(fā)現(xiàn)工具,所以 swarm 我們無需手動(dòng)安裝。
?
??Swarm deamon只是一個(gè)調(diào)度器(Scheduler) + 路由器(router),Swarm自己不運(yùn)行容器,它只是接受Docker客戶端發(fā)來的請(qǐng)求,調(diào)度適合的節(jié)點(diǎn)來運(yùn)行容器,這就意味著,即使Swarm由于某些原因掛掉了,集群中的節(jié)點(diǎn)也會(huì)照常運(yùn)行,放Swarm重新恢復(fù)運(yùn)行之后,他會(huì)收集重建集群信息。https://github.com/docker/swarm
?
??k8s 的出現(xiàn)早于 swarm,所以 swarm 的誕生,就是為了與 k8s 競(jìng)爭(zhēng),k8s 已經(jīng)很成熟了,所以目前市場(chǎng)上用的 k8s 的還是挺多的,swarm 相對(duì)來說用的還不是提多。
1.Swarm 架構(gòu)圖
2.Swarm 節(jié)點(diǎn)說明
??運(yùn)行 Docker 的主機(jī)可以主動(dòng)初始化一個(gè) Swarm 集群或者加入一個(gè)已存在的 Swarm 集群,這樣這個(gè)運(yùn)行 Docker 的主機(jī)就成為一個(gè) Swarm 集群的節(jié)點(diǎn) (node) 。
?
??Swarm節(jié)點(diǎn)分為管理 (manager) 節(jié)點(diǎn)和工作 (worker) 節(jié)點(diǎn)。
?
??管理節(jié)點(diǎn)用于 Swarm 集群的管理,docker swarm 命令基本只能在管理節(jié)點(diǎn)執(zhí)行(節(jié)點(diǎn)退出集群命令 docker swarm leave 可以在工作節(jié)點(diǎn)執(zhí)行)。一個(gè) Swarm 集群可以有多個(gè)管理節(jié)點(diǎn),但只有一個(gè)管理節(jié)點(diǎn)可以成為 leader,leader 通過 raft 協(xié)議實(shí)現(xiàn)。通常,第一個(gè)啟用docker swarm的節(jié)點(diǎn)將成為leader,后來加入的都是follower。當(dāng)前的leader如果掛掉,剩余的節(jié)點(diǎn)將重新選舉出一個(gè)新的leader。每一個(gè)manager都有一個(gè)完整的當(dāng)前集群狀態(tài)的副本,可以保證manager的高可用。
?
??工作節(jié)點(diǎn)是任務(wù)執(zhí)行節(jié)點(diǎn),管理節(jié)點(diǎn)將服務(wù) (service) 下發(fā)至工作節(jié)點(diǎn)執(zhí)行。管理節(jié)點(diǎn)默認(rèn)也作為工作節(jié)點(diǎn)。你也可以通過配置讓服務(wù)只運(yùn)行在管理節(jié)點(diǎn)。worker節(jié)點(diǎn)之間,通過control plane進(jìn)行通信,這種通信使用gossip協(xié)議,并且是異步的。
?
??來自 Docker 官網(wǎng)的這張圖片形象的展示了集群中管理節(jié)點(diǎn)與工作節(jié)點(diǎn)的關(guān)系。
3.Swarm 集群部署
三臺(tái)機(jī)器如下:每臺(tái)機(jī)器都安裝好 docker
和 docker-compose
IP | 角色 |
---|---|
192.168.204.101 | manager 管理節(jié)點(diǎn) |
192.168.204.102 | worker 工作節(jié)點(diǎn) |
192.168.204.103 | worker 工作節(jié)點(diǎn) |
1.了解docker swarm 命令
# 查看docker swarm 命令
docker swarm --help
[root@localhost ~]# docker swarm --help
Usage: docker swarm COMMAND
Manage Swarm
Commands:
init Initialize a swarm
join Join a swarm as a node and/or manager
Run 'docker swarm COMMAND --help' for more information on a command.
# 查看 swarm 集群狀態(tài)
docker info
# 查看 swarm 集群節(jié)點(diǎn)信息
docker node ls
2.初始化集群
# 登錄管理節(jié)點(diǎn),并執(zhí)行如下命令
docker swarm init --advertise-addr 192.168.204.101
# 返回如下信息
[root@localhost ~]# docker swarm init --advertise-addr 192.168.204.101
Swarm initialized: current node (2tlpn6ywqh9kms9ymgndpoinc) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-3gcmbp3voxo05kw0q4lfe972a1uy7bbch59aabu55i3dnb2eeo-3a26jdpdkmdmvjuj54ki9c14h 192.168.204.101:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
3.work節(jié)點(diǎn)加入集群
復(fù)制初始化集群返回的命令,分別在 兩個(gè)work 節(jié)點(diǎn)執(zhí)行,將work節(jié)點(diǎn)加入 swarm 集群。
?
記得:關(guān)閉防火墻,或者開放端口 2377!??!
先關(guān)閉防火墻:systemctl stop firewalld
然后永久關(guān)閉防火墻:systemctl disable firewalld
# 加入swarm集群命令
docker swarm join --token SWMTKN-1-3gcmbp3voxo05kw0q4lfe972a1uy7bbch59aabu55i3dnb2eeo-3a26jdpdkmdmvjuj54ki9c14h 192.168.204.101:2377
加入成功如圖所示:
4.查看swarm集群節(jié)點(diǎn)信息
進(jìn)入 manager 管理節(jié)點(diǎn),通過
docker node ls
查看集群節(jié)點(diǎn)信息。work 節(jié)點(diǎn)無法查看哦!
4.部署服務(wù)命令
在管理節(jié)點(diǎn),通過命令 docker service 部署服務(wù),通過
docker service --help
查看詳細(xì)命令
命令 | 說明 |
---|---|
create | 創(chuàng)建一個(gè)新的服務(wù) |
inspect | 展示一個(gè)/多個(gè)服務(wù)的詳細(xì)信息 |
logs | 查看服務(wù)/任務(wù)的日志 |
ls | 顯示所有service服務(wù) |
ps | 顯示一個(gè)/多個(gè)服務(wù)的所有task |
rm | 刪除一個(gè)/多個(gè)服務(wù) |
rollback | 恢復(fù)service服務(wù)的配置信息 |
scale | 彈性擴(kuò)縮容service服務(wù) |
update | 更新service服務(wù) |
5.部署服務(wù)
在管理節(jié)點(diǎn),通過命令 docker service 部署服務(wù),此處來部署一個(gè) nginx 服務(wù)
# 部署一個(gè)nginx服務(wù)
docker service create --replicas 1 -p 80:80 --name nginx_swarm nginx
# --replicas 1 一個(gè)副本
# -p 80:80 端口映射
# --name 自定義名稱
# manager管理節(jié)點(diǎn), 查看所有service服務(wù)
docker service ls
# 在 manager 和 work 節(jié)點(diǎn),都執(zhí)行 docker ps 命令,查看服務(wù)是否啟動(dòng)成功
docker ps
# 訪問服務(wù)
curl 192.168.204.101
如果要想在管理端去訪問 curl 192.168.204.202 和 192.168.204.203,也顯示服務(wù)正常。
需要先擴(kuò)容至副本數(shù)為 3,即可。
?
提示:另一種情況:副本數(shù)為3后,現(xiàn)在指定節(jié)點(diǎn)203退出swarm集群,此時(shí) 3 個(gè)副本就會(huì)重新分配(比如:201機(jī)器2個(gè)副本,202機(jī)器1個(gè)副本,如果此時(shí)203節(jié)點(diǎn)重新加入后,即使203這個(gè)節(jié)點(diǎn)上沒有這個(gè)副本,集群會(huì)幫我們自動(dòng)分發(fā)服務(wù),你同樣還是可以訪問curl 192.168.204.203 成功)
6.彈性伸縮<擴(kuò)縮容>
以下命令,在
manager 管理節(jié)點(diǎn)
執(zhí)行操作
# 副本數(shù)擴(kuò)容(nginx_swarm:服務(wù)名)
docker service update --replicas 3 nginx_swarm
錯(cuò)誤提示:error creating external connectivity network: Failed to Setup IP tables: U
解決方案:關(guān)閉防火墻后,需要重啟 docker 服務(wù)
命令:service docker restart
縮容
修改 --replicas 的個(gè)數(shù)即可。
7.節(jié)點(diǎn)離開swarm集群
# 哪個(gè)節(jié)點(diǎn)要離開集群,在指定節(jié)點(diǎn)執(zhí)行如下命令
docker swarm leave
管理節(jié)點(diǎn)查看節(jié)點(diǎn)信息,可以看到有個(gè)節(jié)點(diǎn)已經(jīng)Down
了
8.刪除離開的節(jié)點(diǎn)
以下命令,在
manager 管理節(jié)點(diǎn)
執(zhí)行操作
# 刪除節(jié)點(diǎn)(nodeId 通過 docker node ls 查看)
docker node rm [nodeId]
9.離開的節(jié)點(diǎn),再次加入swarm集群
在要加入集群的節(jié)點(diǎn)執(zhí)行如下命令:
# 查看加入woker的命令
docker swarm join-token worker
# 再次執(zhí)行剛才的,加入swarm集群命令即可
docker swarm join --token SWMTKN-1-3gcmbp3voxo05kw0q4lfe972a1uy7bbch59aabu55i3dnb2eeo-3a26jdpdkmdmvjuj54ki9c14h 192.168.204.101:2377
附:join token其他常見命令:
docker swarm join-token worker:查看加入woker的命令。
docker swarm join-token manager:查看加入manager的命令
docker swarm join-token --rotate worker:重置woker的Token。
docker swarm join-token -q worker:僅打印Token。文章來源:http://www.zghlxwxcb.cn/news/detail-772275.html
10.退出 docker swarm 集群
# work 節(jié)點(diǎn):
docker swarm leave
# manager節(jié)點(diǎn):
docker swarm leave -f
本文結(jié)束,謝謝文章來源地址http://www.zghlxwxcb.cn/news/detail-772275.html
到了這里,關(guān)于4.docker容器編排(docker compose 與 docker swarm)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!