Part 3: Services

介紹

在第3部分中,咱們將擴展應用程序並啓用負載平衡。爲此,咱們必須在分佈式應用程序的層次結構中提高一個級別:服務。前端

  1. Stackweb

  2. Services (你在這裏)docker

  3. Container (涵蓋在第2部分中)數據庫

關於服務

在分佈式應用程序中,應用程序的不一樣部分被稱爲「服務」。例如,若是你想象一個視頻分享網站,它可能包括一個用於在數據庫中存儲應用程序數據的服務,一個在用戶上傳某個東西后在後臺進行視頻轉換的服務,一個爲前端服務的服務,等等。瀏覽器

服務實際上只是「生產中的容器」。一個服務只運行一個鏡像,但它將以鏡像的方式運行——它應該使用的端口,容器應該運行多少個副本,這樣服務具備它須要的容量等等——的方式進行了編碼。擴展服務會改變運行該軟件的容器實例的數量,爲流程中的服務分配更多的計算資源。網絡

幸運的是,使用Docker平臺定義、運行和擴展服務很容易——只需編寫docker-compose.yml文件。app

你的第一個docker-compose.yml文件

docker-compose.yml文件是一個YAML文件,它定義了Docker容器在生產中的行爲。負載均衡

docker-compose.yml

將此文件保存爲docker-compose.yml不管什麼位置。確保您已經將在第2部分中建立的鏡像推送到註冊中心,更新這個yml文件,用你鏡像中的內容替換username/repo:tagcurl

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:

docker-compose.yml告訴Docker作下面的事情:分佈式

  • 從註冊表中提取第2步中上傳的圖像。

  • 將該映像的5個實例做爲web服務運行,限制每一個CPU使用最多10%的CPU(跨全部內核)和50MB RAM。

  • 若是失敗,當即從新啓動容器。

  • 將端口80映射到web的端口80。

  • 指示web容器經過一個名爲webnet的負載均衡網絡共享端口80。(在內部,容器自己將在臨時端口上發佈到web的端口80。)

  • 用默認設置定義webnet網絡(這是一個負載均衡的覆蓋網絡)。

運行您的新負載平衡應用程序

在咱們使用docker stack deploy命令以前,咱們先運行:

docker swarm init

注意:咱們將在第4部分中瞭解該命令的含義。若是你不運行docker swarm init,你會獲得一個錯誤,「這個節點不是一個羣集管理器。」

如今,讓咱們來運行它。你必須給你的應用一個名字。在這裏,它被設置爲getstartedlab

docker stack deploy -c docker-compose.yml getstartedlab

咱們的單一服務堆棧在一個主機上運行咱們部署映像的5個容器實例。讓咱們調查。
在咱們的應用程序中得到一個服務的服務ID:

docker service ls

您將看到web服務的輸出,並以您的應用程序名稱爲前提。若是您將其命名爲與本例中顯示的相同,則名稱將爲getstartedlab_web。服務ID也被列出,以及複製的數量、圖像名稱和暴露的端口。
在服務中運行的單個容器稱爲任務。任務被賦予獨特的id,replicas遞增,知道達到您在docker-compose.yml中定義的副本數量。列出服務的任務:

docker service ps getstartedlab_web

若是您將系統上全部的容器列表列出,但這些任務也不會被服務過濾:

docker container ls -q

您能夠屢次運行curl -4 http://localhost,或者在瀏覽器中訪問該URL並點擊刷新幾回。

clipboard.png

不管如何,您將看到容器ID的更改,顯示負載平衡;在每一個請求中,選擇一個循環模式的5個任務中的一個來響應。容器id將與前面的命令(docker container ls -q)匹配。

擴大app的規模

您能夠經過在docker-compose.yml中更改replicas來擴展應用程序,保存更改,並從新運行docker stack deploy命令:

docker stack deploy -c docker-compose.yml getstartedlab

Docker將作一個就地更新,不須要先拆下堆棧,也不須要殺死任何容器。
如今,從新運行docker container ls -q,以查看已部署的實例從新配置。若是您將副本按比例放大,就會有更多的任務,所以會有更多的容器。

拿下應用程序和swarm

  • 拿下應用程序,用docker stack rm

    docker stack rm getstartedlab
  • 拿下swarm

    docker swarm leave --force

這就像站起來,和Docker一塊兒擴展你的應用同樣簡單。您已經向學習如何在生產中運行容器邁出了一大步。接下來,您將學習如何在Docker機器集羣上運行這個應用程序。

相關文章
相關標籤/搜索