docker集群部署:第3部分:服務
阿新 • • 發佈:2018-01-23
註意 sources 計算 error compose image 共享端口 port url docker集群部署:第3部分:服務
- 介紹
在第3部分中,我們將擴展應用程序並實現負載平衡。 - 關於服務
在分布式應用程序中,應用程序的不同部分被稱為“服務”。例如,一個視頻共享站點,它可能包括一個用於將應用程序數據存儲在數據庫中的服務,後面的視頻轉碼服務用戶上傳東西,為前端服務等等。
服務實際上只是“生產中的容器”。服務只運行一個鏡像,但它定義鏡像運行的方式 - 應該使用哪個端口,容器應該運行多少個實例,以便服務具有所需的容量,以及等等。縮放服務會更改運行該軟件的容器實例的數量,從而為流程中的服務分配更多的計算資源。
幸運的是,使用Docker平臺定義,運行和擴展服務非常簡單 - 只需編寫一個docker-compose.yml文件即可。 - docker-compose.yml文件
docker-compose.yml文件是一個YAML文件,它定義了Docker容器在生產中的行為方式。#cat docker-compose.yml version: "3" services: web: #replace username/repo:tag with your name and image details image: username/repo:tag deploy: replicas: 5 resources: limits: cpus: "0.1" memory: 50M restart_policy: condition: on-failure ports: - "80:80" networks: - webnet networks: webnet:
說明:我在vmware虛擬機測試時,使用的是如下腳本:
version: "3" services: web: image: friendlyhello:latest deploy: replicas: 5 restart_policy: condition: on-failure ports: - "80:80" networks: - webnet networks: webnet:
這個docker-compose.yml文件告訴Docker執行以下操作:
(1)從註冊表中取出我們在第2部分:容器中上傳的鏡像。
(2)運行該鏡像的5個實例作為一個服務調用web,限制每個使用,最多10%的CPU(跨所有核心)和50MB的RAM。(我未使用)
(4)指示Web容器通過稱為webnet的負載均衡網絡共享端口80。 (在內部,容器本身將在臨時端口上發布到網站的端口80)。
(5)定義webnet網絡使用默認設置(這是一個負載均衡覆蓋網絡)。 - 運行新的負載均衡應用程序
在我們使用docker stack deploy命令之前,我們先運行: #docker swarm init
註意:我們將在第4部分中介紹該命令的含義。如果不運行docker swarm init,則會顯示“此節點不是swarm manager”的錯誤。
現在讓我們來運行它。你必須給你的應用程序起個名稱。在這裏,它被命名為getstartedlab。 #docker stack deploy -c docker-compose.yml getstartedlab
我們的單個服務堆棧在一臺主機上運行了5個部署映像的容器實例。讓我們來查看下。
在我們的應用程序中獲取一項服務的服務ID: #docker service ls (或docker ps)
將看到Web服務的輸出,並以你的應用程序名稱作為前綴。如果你將其命名為與此示例中所示的相同,則名稱將為getstartedlab_web。還列出了服務ID以及實例數量,鏡像名稱和暴露端口。
在服務中運行的單個容器稱為任務。任務會被賦予唯一的數字增加的ID,可以在docker-compose.yml中定義的實例數量。列出你的服務的任務:#docker service ps getstartedlab_web ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS pyjg9hjmiubl getstartedlab_web.1 friendlyhello:latest swarm1 Running Running 2 hours ago l4dze4ykna53 getstartedlab_web.2 friendlyhello:latest swarm1 Running Running 2 hours ago wv49dwr41uyt getstartedlab_web.3 friendlyhello:latest swarm1 Running Running 2 hours ago eten7ue4sace getstartedlab_web.4 friendlyhello:latest swarm1 Running Running 2 hours ago djtvjvv0012q getstartedlab_web.5 friendlyhello:latest swarm1 Running Running 2 hours ago
如果你只列出系統上的所有容器,也會顯示任務,但不會被服務過濾:
#``docker container ls -q 552750f13021 f0709bdbbca2 913c2ead1b86 9b3874094b67 c51e8021f0ee feddb2fff6c5
你可以連續多次運行curl -4 http:// localhost,或者在瀏覽器中轉到該URL並點擊幾次刷新。
無論哪種方式,你將看到容器ID更改,演示負載均衡;在每個請求中,以循環方式選擇5個任務中的一個來響應。容器ID將匹配您以前的命令(docker container ls -q)的輸出。 - 縮放應用程序
你可以通過更改docker-compose.yml中的實例值,保存更改並重新運行docker stack deploy命令來擴展應用程序:如將 replicas(實例): 5 更改為3 #docker stack deploy -c docker-compose.yml getstartedlab Updating service getstartedlab_web (id: f4pqg1x8eznhxu6bb897t6l3v)`` Docker會立即更新,不需要拆除原有集群或殺死任何容器。
現在,重新運行docker container ls -q來查看重新配置的已部署實例。
#docker container ls -q abc6e8347046 99e75109a749 03ddf96a5934
- 關閉應用服務堆棧(stack)
#docker stack rm getstartedlab ##stack 堆 Removing service getstartedlab_web Removing network getstartedlab_default Removing network getstartedlab_webnet
- 刪除集群(swarm)
#docker swarm leave --force
docker集群部署:第3部分:服務