關(guān)于服務(wù)
一個(gè)分布式系統(tǒng)一般被拆分成多個(gè)服務(wù),服務(wù)實(shí)際上只是“生產(chǎn)中的容器”?!耙粋€(gè)服務(wù)只運(yùn)行一個(gè)鏡像,但是它將鏡像運(yùn)行的方式進(jìn)行了編碼——應(yīng)該使用什么端口,應(yīng)該運(yùn)行多少個(gè)容器副本,以便服務(wù)具有所需的容量,等等。擴(kuò)展服務(wù)可以改變運(yùn)行該軟件的容器實(shí)例的數(shù)量,從而為流程中的服務(wù)分配更多的計(jì)算資源。
使用Docker平臺(tái)很容易定義、運(yùn)行和擴(kuò)展服務(wù)——只需編寫一個(gè)docker-compose.yml文件。
你的第一個(gè) docker-compose.yml文件
docker-compose.yml文件是一個(gè)YAML文件,它定義了Docker容器在生產(chǎn)環(huán)境中的行為。
先要把你的鏡像推到注冊(cè)中心,然后編寫docker-compose.yml文件,內(nèi)容如下:
將username/repo:tag 替換為你的鏡像名稱
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:
- "4000:80"
networks:
- webnet
networks:
webnet:
docker-compose.yml文件告訴docker 執(zhí)行以下操作:
- pull 鏡像
- 以web服務(wù)的形式運(yùn)行該鏡像的5個(gè)實(shí)例,限制每個(gè)實(shí)例最多只能使用CPU單個(gè)內(nèi)核時(shí)間的10%(也可以是“1.5”,表示每個(gè)實(shí)例只能使用1.5個(gè)內(nèi)核)和50MB RAM。
- 如果一個(gè)容器失敗,立即重啟它。
- 將主機(jī)上的4000端口映射到web的80端口。
- 通過一個(gè)稱為webnet的負(fù)載均衡網(wǎng)絡(luò),指示web的容器共享端口80。(在內(nèi)部,容器本身通過臨時(shí)端口發(fā)布到web的80端口。)
- 使用默認(rèn)設(shè)置定義webnet網(wǎng)絡(luò)(這是一個(gè)負(fù)載平衡的覆蓋網(wǎng)絡(luò))。
運(yùn)行新的負(fù)載均衡應(yīng)用程序
在使用docker stack deploy命令之前,我們首先運(yùn)行:
docker swarm init
現(xiàn)在讓我們運(yùn)行它。你需要給你的應(yīng)用命名。這里,它被設(shè)置為getstartedlab:
docker stack deploy -c docker-compose.yml getstartedlab
我們的單個(gè)服務(wù)堆棧在一臺(tái)主機(jī)上運(yùn)行已部署鏡像的5個(gè)容器實(shí)例。讓我們看看。
獲取我們的應(yīng)用程序中的一個(gè)服務(wù)的服務(wù)ID:
docker service ls
查找web服務(wù)的輸出,以您的應(yīng)用程序名稱作為前綴。如果您將其命名為與本例相同的名稱,則其名稱為getstartedlab_web。還列出了服務(wù)ID,以及副本數(shù)量、映像名稱和公開端口。
或者,您可以運(yùn)行docker stack services,然后是堆棧的名稱。下面的示例命令允許您查看與getstartedlab堆棧關(guān)聯(lián)的所有服務(wù):
docker stack services getstartedlab
ID NAME MODE REPLICAS IMAGE PORTS
bqpve1djnk0x getstartedlab_web replicated 5/5 username/repo:tag *:4000->80/tcp
在服務(wù)中運(yùn)行的單個(gè)容器稱為任務(wù)。任務(wù)被賦予惟一的id,該id以數(shù)字遞增,直到您在docker- composition .yml中定義的replicas數(shù)量為止。列出你的服務(wù)任務(wù):
docker service ps getstartedlab_web
如果你只列出系統(tǒng)上的所有容器,任務(wù)也會(huì)顯示出來,這并不會(huì)被服務(wù)過濾:
docker container ls -q
您可以連續(xù)運(yùn)行curl -4 http://localhost:4000幾次,或者在瀏覽器中訪問該URL并單擊refresh幾次。
無論哪種方式,容器ID都會(huì)發(fā)生變化,以顯示負(fù)載平衡;對(duì)于每個(gè)請(qǐng)求,以循環(huán)方式選擇5個(gè)任務(wù)中的一個(gè)來響應(yīng)。容器id匹配上一個(gè)命令(docker container ls -q)的輸出。
要查看一個(gè)棧的所有任務(wù),可以運(yùn)行docker stack ps,后面跟著你的app名,如下例所示:
docker stack ps getstartedlab
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
uwiaw67sc0eh getstartedlab_web.1 username/repo:tag docker-desktop Running Running 9 minutes ago
sk50xbhmcae7 getstartedlab_web.2 username/repo:tag docker-desktop Running Running 9 minutes ago
c4uuw5i6h02j getstartedlab_web.3 username/repo:tag docker-desktop Running Running 9 minutes ago
0dyb70ixu25s getstartedlab_web.4 username/repo:tag docker-desktop Running Running 9 minutes ago
aocrb88ap8b0 getstartedlab_web.5 username/repo:tag docker-desktop Running Running 9 minutes ago
windows10
Windows 10 PowerShell應(yīng)該已經(jīng)有curl可用,但如果沒有,您可以獲取一個(gè)類似于Git BASH的Linux終端模擬器,或者為Windows下載wget,兩者非常相似。
響應(yīng)緩慢
根據(jù)環(huán)境的網(wǎng)絡(luò)配置,容器響應(yīng)HTTP請(qǐng)求可能需要30秒。這并不表示Docker或集群性能,而是一個(gè)未滿足的Redis依賴關(guān)系,我們將在本教程的后面介紹。目前,訪客柜臺(tái)還不能正常工作;我們還沒有添加一個(gè)服務(wù)來持久化數(shù)據(jù)。
應(yīng)用規(guī)模
您可以通過更改docker-compose.yml中的replicas值來擴(kuò)展應(yīng)用程序。保存更改,并重新運(yùn)行docker stack deploy命令:
docker stack deploy -c docker-compose.yml getstartedlab
Docker執(zhí)行就地更新,不需要先拆下堆?;驓⑺廊魏稳萜?。
現(xiàn)在,重新運(yùn)行docker container ls -q,查看重新配置的已部署實(shí)例。如果您放大副本,就會(huì)啟動(dòng)更多的任務(wù),從而啟動(dòng)更多的容器。
卸載應(yīng)用程序和集群
- 用
docker stack rm卸載應(yīng)用:
docker stack rm getstartedlab
- 卸載集群:
docker swarm leave --force
本節(jié)命令:
docker stack ls # List stacks or apps
docker stack deploy -c <composefile> <appname> # Run the specified Compose file
docker service ls # List running services associated with an app
docker service ps <service> # List tasks associated with an app
docker inspect <task or container> # Inspect task or container
docker container ls -q # List container IDs
docker stack rm <appname> # Tear down an application
docker swarm leave --force # Take down a single node swarm from the manager