Docker 入門(三)

關(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í)行以下操作:

  1. pull 鏡像
  2. 以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。
  3. 如果一個(gè)容器失敗,立即重啟它。
  4. 將主機(jī)上的4000端口映射到web的80端口。
  5. 通過一個(gè)稱為webnet的負(fù)載均衡網(wǎng)絡(luò),指示web的容器共享端口80。(在內(nèi)部,容器本身通過臨時(shí)端口發(fā)布到web的80端口。)
  6. 使用默認(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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容