docker 入門5 - 棧 【翻譯】

入門,第 5 部分:堆棧

先決條件

  • 安裝 Docker 版本 1.13 或更高版本。 node

  • 獲取第 3 部分先決條件中所述的 Docker Compose。web

  • 獲取 Docker Machine,如第 4 部分先決條件中所述。redis

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

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

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

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

  • 請從第 3 部分得到 docker-compose.yml 的副本。ssh

  • 確保第 4 部分中設置的機器已運行並準備就緒。運行 docker-machine ls 來驗證這一點。若是machines中止,則運行 docker-machine start myvm1 以啓動管理器,而後運行 docker-machine start myvm2 以啓動輔助角色。tcp

  • 讓你在第4部分建立的羣運行並準備就緒。運行 docker-machine ssh myvm1 "docker node ls" 來驗證這一點。若是羣已啓動,則兩個節點都會報告ready。若是沒有,請從新初始化羣並加入工做人員,如設置羣中所述。編輯器

介紹

在第 4 部分中,您學習瞭如何設置一個swarm,即運行 Docker 的machines羣集,並將應用程序部署到該swarm,容器在多臺計算機上協同運行。

在第 5 部分中,您將到達分佈式應用程序的層次結構的頂部: stack。stack是一組共享依賴項的相互關聯的服務,能夠一塊兒編排和縮放。單個stack可以定義和協調整個應用程序的功能(儘管很是複雜的應用程序可能但願使用多個stack)。

一些好消息是,自第 3 部分以來,您一直在使用stack,此時您建立了一個Compose文件並使用 docker stack deploy。可是,這是在單個主機上運行的單個服務stack,這一般不是生產環境中發生的狀況。在這裏,您能夠獲取所學知識,使多個服務彼此相關,並在多臺計算機上運行它們。

你作得很好,這是the home stretch!

添加新服務並從新部署

很容易將服務添加到咱們的 docker-compose.yml 文件中。首先,讓咱們添加一個免費的可視化工具服務,讓咱們看看咱們的羣是如何調度容器的。

  1. 在編輯器中打開 docker-compose.yml,並將其內容替換爲如下內容。請務必將username/repo:tag替換爲image詳細信息。

     
    version: "3"
    services:
      web:
        # replace username/repo:tag with your name and image details
        image: username/repo:tag
        deploy:
          replicas: 5
          restart_policy:
            condition: on-failure
          resources:
            limits:
              cpus: "0.1"
              memory: 50M
        ports:
          - "80:80"
        networks:
          - webnet
      visualizer:
        image: dockersamples/visualizer:stable
        ports:
          - "8080:8080"
        volumes:
          - "/var/run/docker.sock:/var/run/docker.sock"
        deploy:
          placement:
            constraints: [node.role == manager]
        networks:
          - webnet
    networks:
      webnet:

     

    這裏惟一的新東西是對Web的平級服務,名爲visualizer。請注意兩個新內容: volumes關鍵字,容許可視化工具訪問 Docker 的主機套接字文件,以及placement關鍵字,確保此服務僅在swarm manager上運行 - 從不爲worker運行。這是由於此容器由 Docker 建立的開源項目構建,顯示在關係圖中的swarm上運行的 Docker 服務。

    咱們立刻就更多地討論placement constraints和volumes。

  2. 確保shell配置爲與 myvm1 對話(完整示例在此處)。

    • 運行 docker-machine ls 列出計算機並確保已鏈接到 myvm1,如其旁邊的星號所示。

    • 若是須要,請從新運行 docker-machine env myvm1,而後運行給定的命令來配置 shell。

      在 Mac 或 Linux 上,命令是:

      eval $(docker-machine env myvm1)
       在 Windows 上,命令是:
       
      & "C:\Program Files\Docker\Docker\Resources\bin\docker-machine.exe" env myvm1 | Invoke-Expression

       

  3. 在manager上從新運行 docker stack deploy命令,而且須要更新的任何服務都獲得更新:

     
    $ docker stack deploy -c docker-compose.yml getstartedlab
    Updating service getstartedlab_web (id: angi1bf5e4to03qu9f93trnxm)
    Creating service getstartedlab_visualizer (id: l9mnwkeq2jiononb5ihz9u7a4)

     

  4. 看看visualizer可視化工具。

    您在Compose文件中看到可視化工具visualizer在端口 8080 上運行。經過運行 docker-machine ls 獲取其中一個節點的 IP 地址。轉到端口 8080 中的任一 IP 地址,您能夠看到可視化工具正在運行:

    可視化工具visualizer的單個副本正按預期在manager上運行,而且 Web 的 5 個實例分佈在swarm中。您能夠經過運行 docker stack ps <stack> 來證明此可視化效果:

     
    docker stack ps getstartedlab

     

    可視化工具visualizer是一個獨立的服務,能夠在包含它在stack中的任何應用中運行。它不依賴於任何其餘內容。如今,讓咱們建立一個確實具備依賴項的服務:提供訪問者計數器的 Redis 服務。

保留數據

讓咱們再次經過相同的工做流來添加用於存儲應用數據的 Redis 數據庫。

  1. 保存此新的 docker-compose.yml 文件,該文件最終添加了 Redis 服務。請務必將username/repo:tag替換爲鏡像詳細信息。

     
    version: "3"
    services:
      web:
        # replace username/repo:tag with your name and image details
        image: username/repo:tag
        deploy:
          replicas: 5
          restart_policy:
            condition: on-failure
          resources:
            limits:
              cpus: "0.1"
              memory: 50M
        ports:
          - "80:80"
        networks:
          - webnet
      visualizer:
        image: dockersamples/visualizer:stable
        ports:
          - "8080:8080"
        volumes:
          - "/var/run/docker.sock:/var/run/docker.sock"
        deploy:
          placement:
            constraints: [node.role == manager]
        networks:
          - webnet
      redis:
        image: redis
        ports:
          - "6379:6379"
        volumes:
          - "/home/docker/data:/data"
        deploy:
          placement:
            constraints: [node.role == manager]
        command: redis-server --appendonly yes
        networks:
          - webnet
    networks:
      webnet:

     

    Redis 在 Docker 庫中具備官方鏡像,而且被授予了剛剛 redis 的簡短image名稱,所以這裏沒有用username/repo表示法。Redis 端口 6379 已由 Redis 預配置,以便從容器向主機公開,在咱們的Compose文件中,咱們將從主機向世界公開它,所以您能夠實際將任何節點的 IP 進入 Redis Desktop Manager 並管理此 Redis實例,若是您選擇。

    最重要的是,redis 有一些使數據在此stack部署之間持久的規範:

    • redis 始終在manager上運行,所以始終使用相同的文件系統。

    • redis 在容器內以 /data 掛載主機文件系統中的任意目錄,這是 Redis 存儲數據的地方。

    總之,這在主機的物理文件系統中爲 Redis 數據建立了一個"真相源"。若是沒有此,Redis 會將其數據存儲在容器文件系統中的 /data 中,若是從新部署該容器,該文件系統將消失。

    這個真理之源有兩個組成部分:

    • 在 Redis 服務上標記 placement constraint,確保它始終使用相同的主機。

    • 建立一個 volume ,路徑 ./data(在主機上)做爲 /data(在 Redis 容器內)的volume。當容器被拆掉和從新部署時,存儲在指定主機上 ./data 上的文件將保留,從而實現連續性。

    您已準備好部署新的 Redis-using stack。

  2. 在manager上建立 ./data目錄:

     
    docker-machine ssh myvm1 "mkdir ./data"

     

  3. 確保shell配置爲與 myvm1 對話(完整示例在此處)。

    • 運行 docker-machine ls 列出計算機並確保已鏈接到 myvm1,如其旁邊的星號所示。

    • 若是須要,請從新運行 docker-machine env myvm1,而後運行給定的命令來配置 shell。

      在 Mac 或 Linux 上,命令是:

       
      eval $(docker-machine env myvm1)

       

      在 Windows 上,命令是:

       
      & "C:\Program Files\Docker\Docker\Resources\bin\docker-machine.exe" env myvm1 | Invoke-Expression

       

  4. 再運行 docker stack deploy 一次。

     
    $ docker stack deploy -c docker-compose.yml getstartedlab

     

  5. 運行 docker service ls 以驗證三個服務是否按預期運行。

     
    $ docker service ls
    ID                  NAME                       MODE                REPLICAS            IMAGE                             PORTS
    x7uij6xb4foj        getstartedlab_redis        replicated          1/1                 redis:latest                      *:6379->6379/tcp
    n5rvhm52ykq7        getstartedlab_visualizer   replicated          1/1                 dockersamples/visualizer:stable   *:8080->8080/tcp
    mifd433bti1d        getstartedlab_web          replicated          5/5                 gordon/getstarted:latest    *:80->80/tcp

     

  6. 檢查其中一個節點,如http://192.168.99.101,並查看訪問者計數器的結果,該計數器如今實時顯示並存儲在 Redis 上的信息。

    此外,請檢查任一節點的 IP 地址端口 8080 處的可視化工具,並注意到 redis 服務與 Webvisualizer服務一塊兒運行。

回顧(可選)

您瞭解到, stacks是相互關聯的服務,都協同運行,這 - 驚喜!-- 自本教程的第三部分以來,您一直在使用stack。您瞭解到,要向stack添加更多服務,請將它們插入到Compose文件中。最後,您瞭解到,經過使用放置placement constraints 和 volumes的組合,您能夠建立永久的永久主狀態數據,以便在容器被拆掉和從新部署時,應用的數據可以存活下來。

相關文章
相關標籤/搜索