docker 入門3 - 服務 【翻譯】

入門,第 3 部分:服務

先決條件

  • 安裝 Docker 版本 1.13 或更高版本。前端

  • 獲取 Docker Compose。在適用於 Mac 和 Docker 桌面的 Windows 上,它已預安裝,所以您能夠good-to-go。在 Linux 系統上,您須要直接安裝它。在 Windows 10 系統以前上,沒有 Hyper-V,請使用 Docker Toolbox。node

  • 閱讀第 1 部分中的方向。web

  • 瞭解如何在第 2 部分中建立容器。docker

  • 確保經過將friendlyhello鏡像推送到registry來發布您建立的鏡像。咱們在這裏使用共享鏡像。數據庫

  • 確保鏡像用做已部署的容器。運行此命令,在信息中鍵入usernamerepotag:docker run -p 4000:80 username/repo:tag,而後訪問http://localhost:4000/瀏覽器

介紹

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

  • Stackapp

  • Services(您在這裏)curl

  • Container(第 2 部分涵蓋)tcp

關於服務

在分佈式應用程序中,應用程序的不一樣部分稱爲"服務"。例如,若是您想象一個視頻共享站點,它大概包括用於在數據庫中存儲應用程序數據的服務、用戶上傳內容後在後臺進行視頻轉碼的服務、前端服務等。

服務實際上只是"生產環境中的容器"。服務只運行一個鏡像,但它編碼了鏡像的運行方式 - 它應該使用什麼端口,容器應運行多少個副本,以便服務具備所需的容量,等等。縮放服務會更改運行該軟件的容器實例數,從而將更多的計算資源分配給進程中的服務。

幸運的是,使用 Docker 平臺定義、運行和擴展服務很是簡單 — 只需編寫一個 docker-compose.yml 文件便可。

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

docker-compose.yml 文件是一個 YAML 文件,用於定義 Docker 容器在生產中應如何操做。

docker-compose.yml

將此文件保存爲 docker-compose.yml,不管您須要。請確保將第 2 部分中建立的鏡像推送到registry,並經過將username/repo:tag 替換爲鏡像詳細信息來更新此 .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:
      - "4000:80"
    networks:
      - webnet
networks:
  webnet:

 

此 docker-compose.yml 文件告訴 Docker 執行如下操做:

  • 從registry中提取咱們在步驟 2 中上傳的圖像。

  • 將該鏡像的 5 個實例做爲稱爲 web 的服務運行,限制每一個實例最多使用單個 CPU 時間 10%(這也能夠例如,"1.5"表示每一個內存爲 1 和半內核),而且限制 50MB 的 RAM。

  • 若是容器發生故障,當即重啓容器。

  • 將主機上的端口 4000 映射到 Web 的端口 80。

  • 指示 web 的容器經過稱爲 webnet 的負載平衡網絡共享端口 80。(在內部,容器自己在臨時端口發佈到 Web 的端口 80。

  • 使用默認設置(負載平衡覆蓋網絡)定義 webnet 網絡。

運行新的負載平衡應用

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

 
docker swarm init

 

注意:咱們進入第 4 部分中該命令的含義。若是不運行 docker swarm init,則會收到一個錯誤,即"this node is not a swarm manager."。

如今讓咱們運行它。您須要爲應用指定名稱。在這裏,它叫getstartedlab:

 
docker stack deploy -c docker-compose.yml getstartedlab

 

咱們的單個服務堆棧在一臺主機上運行部署鏡像的 5 個容器實例。讓咱們來調查一下。

獲取咱們應用程序中一個服務的服務 ID:

 
docker service ls

 

查找 web 服務的輸出,並預置應用名稱。若是將其命名爲與本示例中所示相同,則名稱爲 getinitlab_web。服務 ID 以及副本、鏡像名稱和公開端口的數量也列出。

或者,您能夠運行 docker stack services,而後是堆棧的名稱。如下示例命令容許您查看與 getstartedlab 堆棧關聯的全部服務:

 
docker stack services getstartedlab
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
bqpve1djnk0x        getstartedlab_web   replicated          5/5                 username/repo:tag   *:4000->80/tcp

 

在服務中運行的單個容器稱爲任務。任務被賦予以數字遞增的方式得到的惟一標識,最多於您在 docker-compose.yml 中定義的複製replicas數。列出服務的任務:

 
docker service ps getstartedlab_web

 

若是隻是列出系統上的全部容器,任務也會顯示,儘管未按服務進行篩選:

 
docker container ls -q

 

您能夠連續運行curl -4 http://localhost:4000幾回,或者轉到瀏覽器中的該 URL 並點擊刷新幾回。

不管哪一種方式,容器 ID 都發生更改,演示負載平衡;在每一個請求中,以循環方式選擇 5 個任務之一以響應。容器 ID們 與上面的命令(docker container ls -q)的輸出匹配。

要查看堆棧的全部任務,能夠運行 docker stack ps 後跟應用名稱,如如下示例所示:

 
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

 

正在運行 Windows 10?

Windows 10 PowerShell 應該已經有捲曲可用, 但若是沒有,你能夠抓住一個Linux終端模擬器,如Git BASH, 或下載 wget for Windows這是很是相似的.

響應時間慢?

根據環境的網絡配置,容器最多可能須要 30 秒才能響應 HTTP 請求。這不是 Docker 或羣性能的指示,而是本教程後面討論未知足的 Redis 依賴項。目前,訪問者計數器因爲一樣的緣由沒法工做;咱們還沒有添加用於保留數據的服務。

縮放應用

您能夠經過更改 docker-compose.yml 中的replicas值、保存更改並從新運行 docker stack deploy命令來縮放應用:

 
docker stack deploy -c docker-compose.yml getstartedlab

 

Docker 執行就地更新,無需先將堆棧撕下或終止任何容器。

如今,從新運行 docker container ls -q 以查看已部署的實例從新配置。若是放大了replicas,將啓動更多任務,從而啓動更多容器。

下掉應用程序和swarm

使用 docker stack rm 將應用下掉:

 
docker stack rm getstartedlab

 

下掉swarm:

 
docker swarm leave --force

 

使用 Docker 創建並擴展應用很是簡單。您在學習如何在生產環境中運行容器邁出了一大步。接下來,您將學習如何在 Docker 計算機羣集上以真正的羣形式運行此應用程序。

注意:像這樣的Compose文件用於使用 Docker 定義應用程序,而且可使用 Docker Cloud 上載到雲提供商,也能夠上載到使用 Docker 企業版選擇的任何硬件或雲提供商。

回顧和備忘單(可選)

歸納地說,雖然鍵入 docker run很是簡單,但生產中的容器的真正實現是做爲服務運行它。服務在 Compose 文件中編纂容器的行爲,而且此文件可用於擴展、限制和從新部署咱們的應用。

在此階段要探索的一些命令:

 
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
相關文章
相關標籤/搜索