在分布式應用程序中,應用程序的不同部分被稱為“服務”。例如,如果有一個視頻共享網站,它可能包括一個用於將應用程序數據存儲在數據庫中的服務,一個在用戶上傳東西后在后台進行視頻轉碼的服務,一個用於前端頁面的服務等等。
服務實際上只是“生產中的容器”。每個服務只運行一個映像,但它編碼了鏡像的運行方式 - 應該使用哪個端口,容器應運行多少個副本以滿足性能要求等等。 伸縮服務可以更改運行該軟件的容器實例的數量,從而為進程中的服務分配更多計算資源。
定義、運行和伸縮 Docker 平台的服務很簡單,只需要寫一個 docker-compose.yml 文件。
Swarm services使用聲明性模型,這意味着你可以定義服務的理想狀態,並依靠Docker保持狀態。狀態信息如下:
- 運行服務容器所依賴的鏡像名稱和tag
- 該服務包含多少容器
- 是否有任何端口暴露在swarm集群的客戶端上
- 當docker服務啟動時,service是否自動啟動
- 重新啟動服務時發生的特定行為(例如是否使用回滾重新啟動)
- 服務可以運行的節點的特性(如資源約束和位置偏好
一、docker service常用命令
docker service logs [OPTIONS] SERVICE,用於獲取服務的日志。docker服務記錄命令批量檢索執行時存在的日志。
當我們在啟動服務,發現服務未啟動有異常的時候,使用 docker service logs 命令去查看服務的錯誤日志,就可以發現異常問題,根據問題找到解決方案。 —— 是一個很實用的命令
常用命令我們主要看docker官網文檔:docker service —— https://docs.docker.com/engine/reference/commandline/service_create/
// 1、docker service create 創建一個服務 // replicas 參數是指運行實例個數 // name 參數指定服務名稱 // alpine 指的是使用的鏡像名稱 // ping docker.com 指的是容器運行的bash
docker service create --replicas 5 --name myhelloworld alpine ping docker.com // 2、查看創建出來的服務
docker service ls // 3、docker service update更新服務 // --publish-add參數指添加或者更新一個對外端口 // --image參數指更新鏡像 // --hostname 更新或指定容器名稱 // --force 指強制更新,即使本次更新沒有任何改變
docker service update --publish-add 80 my_web docker service update --image test_modb_front --force test_emcs-front // 4、docker service inspect查看服務詳情
docker service inspect my_web // 5、docker service ps 搜索服務命令
docker service ps my_web // 6、docker service rm刪除服務
docker service rm my_web // 7、docker service scale 擴展一個或多個服務
docker service scale webtier_nginx=5
二、docker service更新流程
serive更新其實並不是簡單的更新,在swarm模式下的service都是在運行中的,是正在運行的時候進行更新。swarm用在生產環境,我們不想因為更新版本中斷咱們的業務,想的是不影響正常的業務開展。在現實生產環境進行不宕機的更新遠比現在咱們這種要復雜的多的多,咱們這次演示可能稍微簡單,只是讓大家明白一個思路。
我們測試的具體步驟如下:先創建一個service,從hub中拉取1.0版本,然后擴展service里面的容器數量為2,通過shell腳本的方式訪問容器返回結果,然后將拉取1.0的版本升級為2.0版本,查看shell訪問的返回是否中斷。
1、必須創建overlay的network —— 創建名為 demo 的 overlay 網絡
sudo docker network create -d overlay demo
2、創建servie
(1)拉取 1.0 版本,創建 python-flask-demo:1.0 服務,映射本地的 8080 端口 到 容器的 5000 端口
docker service create --name web -p 8080:5000 --network demo python-flask-demo:1.0 docker service ls docker service ps web
(2)橫向擴展容器數量
docker service scale web=2 docker service ls docker service ps web
3、shell 循環請求 web —— 我們為了在測試更新過程中,查看更新時服務中不中斷,所以寫一個 shell 腳本一直訪問
sh -c "while true;do curl 127.0.0.1:8080&&sleep 1;done"
4、開始更新為2.0版本 —— 更新過程中服務沒有中斷
docker service update --image python-flask-demo:2.0 web // 1.0已經shutdown了,啟動了2.0
docker service ps web
5、更新端口 —— 端口更新可能存在業務中斷的情況
更新 service 端口映射 —— 將 外部訪問端口 8080 變換為 8888
docker service update --publish-rm 8080:5000 --publish-add 8088:5000 web docker service ps web
更新流程部分來源於這篇博客的學習筆記:https://blog.csdn.net/zhugeaming2018/article/details/8237922