日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

Docker入门(六):Stacks

發布時間:2023/12/29 综合教程 45 生活家
生活随笔 收集整理的這篇文章主要介紹了 Docker入门(六):Stacks 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這個《Docker入門系列》文檔,是根據Docker官網(https://docs.docker.com)的幫助文檔大致翻譯而成。主要是作為個人學習記錄。有錯誤的地方,Robin歡迎大家指正。分為如下幾個部分:

1 Docker入門:簡介

2 Docker入門:安裝運行

3 Docker入門:容器(Containers)

4 Docker入門:服務(Services)

5 Docker入門:Swarms

6 Docker入門:Stacks

7 Docker入門:部署app

8 Docker入門:稍高級的話題

6.1 引言

在第五部分,我們學習了如何搭建一個swarm。一個swarm就是運行著Docker的一組機器所組成的集群。然后學習了如何將app部署到swarm上,并讓許多容器一致地運行在多個機器上。

在第六部分,我們將進入一個分布式應用程序層次結構的最高層:stack。

stack

service

container

一個stack就是一組相互關聯的services,這些services之間相互依賴,并能夠一起進行編排和scale。單個stack就能夠定義和協調整個應用程序的功能(也存在一些復雜的應用程序,可能使用多個stacks)。

好消息是,我們從第四部分就已經接觸stack了:創建一個Compose文件并使用docker stack deploy。但那只是一個單service的stack,運行在單個主機上,這種情況極少在產品部署中使用。下面,我們將使多個services相互關聯,并將它們運行在多個機器上。

6.2 添加一個新的service并重新部署

向我們的docker-compose.yml文件中添加services很簡單。首先,添加一個免費的visualizer service,該service用于查看swarm是如何調度容器的。

分為如下4個步驟。

6.2.1 重新編輯Compose文件

用編輯器打開文件docker-compose.yml,并輸入如下內容,確保用你的映像信息替換uername/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:

在該.yml文件中,添加了一個和web平行的service,名稱為visualizer。還有兩個新的關鍵字。一個是關鍵字volumes,用于給visualizer提供權限,從而訪問主機上的Docker socket文件。另一個關鍵字是placement,用于確保這個service只能運行在swarm manager上,而不能運行在worker節點上。因為這個容器構建自Docker開源項目,用來以圖表方式展示一個swarm上運行的services。

6.2.2 配置和swarm manager對話的shell

確保你的shell已經配置好,能夠和myvm1進行對話:

● 運行命令docker-machine ls,來列出所有的machines,并確保你已經連上myvm1了,能夠發現myvm1旁邊有星號。

● 如果需要,就重新運行命令docker-machine env myvm1,然后運行給出的命令來配置shell。

在MAC/LINUX系統里,這個命令是:

eval $(docker-machine env myvm1)

在WINDOWS系統里,這個命令是:

& "C:Program FilesDockerDockerResourcesindocker-machine.exe" env myvm1 | Invoke-Expression

6.2.3 重新部署

在manager上重新運行命令docker stack deploy,更新需要更新的services:

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

Updating service getstartedlab_web (id: angi1bf5e4to03qu9f93trnxm)

Updating service getstartedlab_visualizer (id: l9mnwkeq2jiononb5ihz9u7a4)

6.2.4 查看visualizer服務

在Compose文件里,visualizer運行在端口8080上。運行docker-machine ls來獲得任一個節點的IP地址,進入該IP的8080端口來看看visulizer的運行情況:

和期望中的一樣,visualizer的單個實例運行在manager上,web的5個實例分布在整個swarm上。你可以運行命令docker stack ps <stack>來佐證一下visualizer的展示結果:

docker stack ps getstartedlab

visualizer是一個獨立的服務,在stack中,它可以運行在任何app里。它不依賴任何東西。下面我們創建一個具有依賴性的service:能夠提供訪客計數功能的Redis service.

6.3 數據持久化

我們再一次使用之前的工作流程,來添加一個Redis數據庫service,用以存儲app的數據。分為如下六個步驟。

6.3.1 修改Compose文件

修改docker-compose.yml文件,內容如下面所示,這將添加一個Redis service。確保用你自己的映像信息來取代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從容器暴露到主機,在Compose文件里,我們將該端口從主機暴露到外面的世界,所以你可以通過任一個節點的IP來訪問Redis桌面管理器,從而管理這個Redis實例。

還有一些重要的Redis規范,用于指導stack多次部署時的數據持久化:

Redis總是運行在manager上,所以它總是可以使用相同的文件系統;
通過訪問容器中的目錄/data,redis能夠訪問主機文件系統中的任何目錄,Redis在該目錄中存儲數據。

  以上兩點結合在一起,就可以在主機的物理文件系統中為Redis數據創建一個事實上的源(source of truth)。如果沒有這個機制,Redis就會在容器的文件系統中的/data目錄下存儲數據,一旦容器重新部署,這些數據就會丟失。

“source of truth”包含兩個部分:

Placement: 放置在Redis service上的這個約束,保證了Redis service總是使用相同的主機。
volume: 這個關鍵字的配置,使得容器通過訪問Redis容器中的/data目錄,來間接訪問主機上的/data目錄。換句話說,這讓容器的數據訪問透明化,雖然容器邏輯上訪問的是Redis容器中的/data目錄,而實際上容器訪問的是主機上的/data目錄。

6.3.2 在manager上創建目錄

在manager上創建一個./data目錄:

docker-machine ssh myvm1 "mkdir ./data"

6.3.3 配置和swarm manager對話的shell

確保你的shell已經配置好,能夠和myvm1進行對話:

● 運行命令docker-machine ls,來列出所有的machines,并確保你已經連上myvm1了,能夠發現myvm1旁邊有星號。

● 如果需要,就重新運行命令docker-machine env myvm1,然后運行給出的命令來配置shell。

  在MAC/LINUX系統里,這個命令是:

eval $(docker-machine env myvm1)

  在WINDOWS系統里,這個命令是:

& "C:Program FilesDockerDockerResourcesindocker-machine.exe" env myvm1 | Invoke-Expression

6.3.4 重新部署

再一次運行命令docker stack deploy:

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

6.3.5 確認service運行狀況

運行命令docker service ls,來確認3個services是否正常運行:

$ docker service ls

ID NAME MODE REPLICAS IMAGEPORTS

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.3.6 網頁驗證

選擇一個節點的IP地址(比如:http://192.18.99.101)進入其網頁,就可以看到訪客的統計數量,這個數據會一直更新并存儲在Redis上。

同樣,選擇任一個節點的IP地址,在其端口8080上訪問visulizer,就可以看到web、redis、visualizer三種服務一起運行。

6.4 總結

Stacks就是一組一致運行的、相互關聯的services。通過修改Compose文件,可以向stack中添加更多的services。最后,通過使用placement和volumes兩個關鍵字的組合,為持久化數據創建了一個永久的港灣,無論容器關閉或重新部署,app的數據會一直保存下來。

總結

以上是生活随笔為你收集整理的Docker入门(六):Stacks的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。