docker官方文件翻譯5

方誌朋發表於2018-05-08

轉載請標明出處: https://blog.csdn.net/forezp/article/details/80244682 本文出自方誌朋的部落格

堆疊(Stacks)

準備工作

  • 安裝Docker 1.13及以上版本
  • 安裝Docker Compose正如第三部分的準備工作。
  • 安裝Docker Machine正如第四部分的準備工作。
  • 閱讀第一部分的引導。
  • 學習怎麼在第二部分建立容器。
  • 確保你已經發布friendlyhello 映象,並推送到公共倉庫。我們需要在這一部分用到這個映象。
  • 確保你的映象能夠成為一個被部署的容器能正常工作。
  • 從第三篇文章拷貝一份docker-compose.yml
  • 確保第四部分的docker machine已經正確安裝,通過docker-machine ls檢視。
  • 確保docker swarm正確安裝,並且執行。通過執行docker-machine ssh myvm1 "docker node ls 命令驗證。

介紹

在第4部分中,你學習瞭如何設定一個swarm,這是一群執行Docker的機器,併為其部署了一個應用程式,應用才能修包含的眾多容器在多臺機器上執行。

在第5部分中,你將學習分散式應用程式層次結構的頂部:堆疊。 堆疊是一組相互關聯的服務,它們可以共享依賴關係,並且可以進行協調和伸縮。 單個堆疊能夠定義和協調整個應用程式的功能(儘管非常複雜的應用程式可能需要使用多個堆疊)。

好訊息是,從第3部分開始,在建立Compose檔案並使用Docker堆疊部署時,從技術上講,你一直在使用堆疊。 但是,這是在單個主機上執行的單個服務堆疊,通常不會發生在生產環境中。 在這裡,你可以把你學到的東西,使多個服務相互關聯,並在多臺機器上執行它們。

你做得很好,這就是主場!

新增一個新服務和重新部署

新增服務到docker-compose檔案是非常簡單的。首先,新增一個視覺化介面的服務,可以讓我們檢視swarm正在排程的容器。

1.開啟docker-compose檔案,並將以下的內容替換成檔案的內容。確保用你的映象資訊替換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
networks:
  webnet:

複製程式碼

這裡新增的唯一東西就是網路對等服務,名為視覺化器。 在這裡注意兩件新事物:一個volumes ,讓視覺化工具訪問Docker的主機套接字檔案和一個placement 鍵,確保這項服務只能在群集管理器上執行 - 從不是工作者。 這是因為這個容器是由Docker建立的一個開源專案構建的,它顯示了在一個圖表中的Swarm上執行的Docker服務。

我們稍後會詳細討論lacement constraints 和volumes 。

2.確保你的shell被配置為與myvm1進行通訊(完整的例子在這如下)。

  • 執行docker-machine ls列出機器,並確保您已連線到myvm1,如旁邊的星號所示。

  • 如果需要,重新執行docker-machine env myvm1,然後執行給定的命令來配置shell。

在Mac或Linux上,命令是:

eval $(docker-machine env myvm1)
複製程式碼

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)

複製程式碼
  1. 檢視視覺化介面

你在Compose檔案中看到,視覺化工具在埠8080上執行。通過執行docker-machine ls來獲取其中一個節點的IP地址。 轉到8080埠的IP地址,您可以看到視覺化器正在執行:

image

視覺化器的單個副本按照預期在manager上執行,並且網路的5個例項遍佈整個群集。 你可以通過執行docker stack ps 來確認此視覺化:

docker stack ps getstartedlab

複製程式碼

視覺化器是一個獨立的服務,可以在包含它的任何應用程式中執行。 它不依賴於其他任何東西。現在讓我們建立一個具有依賴性的服務:提供訪問者計數器的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的簡短映象名稱,所以在這裡沒有username/repo符號。 Redis埠6379已經由Redis預先配置為從容器暴露給主機,並且在我們的Compose檔案中,我們將它從主機展示給所有容器,因此你可以實際輸入任何IP的IP 節點新增到Redis桌面管理器中並管理此Redis例項,如果願意的話。

最重要的是,redis規範中有幾件事情使資料在這個堆疊的部署之間持久化:

  • redis總是在管理器上執行,所以它總是使用相同的檔案系統。
  • redis在主機檔案系統中訪問任意目錄作為容器內的/ data,這是Redis儲存資料的地方。

這就是在主機物理檔案系統中為Redis資料建立“source of truth”。 如果沒有這個,Redis會將其資料儲存在容器檔案系統中的/ data中,如果該容器曾經被重新部署,該資料將被清除。

真實的資料來源(source of truth)由2部分組成:

  • 放置在Redis服務上的 placement constraint,確保它始終使用相同的主機。
  • 建立的volume ,允許容器作為/ data(位於Redis容器內)訪問./data(在主機上)。 在容器重複開啟和關閉時,儲存在指定主機上的./data檔案仍然存在,從而保持連續性。

2.在manager上建立一個./data目錄

docker-machine ssh myvm1 "mkdir ./data"

複製程式碼

3.確保你的shell被配置為與myvm1進行通訊(完整的例子在這裡)。

  • 執行docker-machine ls命令,列出所有的機器和確保你已經連上myvm1。
  • 如果需要,重新執行docker-machine env myvm1命令,然後再執行以下命令:
eval $(docker-machine env myvm1)
複製程式碼
  1. 執行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                 orangesnap/getstarted:latest    *:80->80/tcp


複製程式碼

6.檢視你的機器的一個節點的web頁面,比如http://192.168.99.101,並且檢視訪客計數的結果,該計數現在已經存在並將資訊儲存在Redis上。

image

另外,請檢查任一節點IP地址的埠8080處的視覺化工具,並注意檢視隨Web和視覺化工具一起執行的redis服務。

image

關注我:

docker官方文件翻譯5

相關文章