1. 程式人生 > >docker集群部署:第3部分:服務

docker集群部署:第3部分:服務

註意 sources 計算 error compose image 共享端口 port url

docker集群部署:第3部分:服務

  1. 介紹
    在第3部分中,我們將擴展應用程序並實現負載平衡。
  2. 關於服務
    在分布式應用程序中,應用程序的不同部分被稱為“服務”。例如,一個視頻共享站點,它可能包括一個用於將應用程序數據存儲在數據庫中的服務,後面的視頻轉碼服務用戶上傳東西,為前端服務等等。
    服務實際上只是“生產中的容器”。服務只運行一個鏡像,但它定義鏡像運行的方式 - 應該使用哪個端口,容器應該運行多少個實例,以便服務具有所需的容量,以及等等。縮放服務會更改運行該軟件的容器實例的數量,從而為流程中的服務分配更多的計算資源。
    幸運的是,使用Docker平臺定義,運行和擴展服務非常簡單 - 只需編寫一個docker-compose.yml文件即可。
  3. 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。(我未使用)

    (3)如果一個失敗,立即重新啟動容器。
    (4)指示Web容器通過稱為webnet的負載均衡網絡共享端口80。 (在內部,容器本身將在臨時端口上發布到網站的端口80)。
    (5)定義webnet網絡使用默認設置(這是一個負載均衡覆蓋網絡)。

  4. 運行新的負載均衡應用程序
    在我們使用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)的輸出。

  5. 縮放應用程序
    你可以通過更改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
  6. 關閉應用服務堆棧(stack)
    #docker stack rm getstartedlab    ##stack 堆
    Removing service getstartedlab_web
    Removing network getstartedlab_default
    Removing network getstartedlab_webnet
  7. 刪除集群(swarm)
    #docker swarm leave --force

docker集群部署:第3部分:服務