Docker 入門筆記 5 - 在Stack中部署多個service

本筆記參考 https://docs.docker.com/get-started/part5/

  • Containers
  • Services
  • Swarms
  • Stacks

什麼是stack

在docker中,stack指的是一組相互關聯的服務,它們可以共享依賴關係,並且可以一起協調和縮放。一個stack 能夠定義和協調整個應用程序的功能(儘管非常複雜的應用程序可能需要使用多個stack)

添加一個新服務

在之前的練習中我們已經用製作的image部署了一個web service,現在我們修改 docker-compose.yml, 添加一個叫做visualizer的service 到stack。

  1. 編輯 docker-compose.yml
version: "3"
services:
  web:       #service called web
    image: misterchi/repositorytest:hello  #Pull the image 
    deploy:
      replicas: 5     #five instances
      resources:
        limits:
          cpus: "0.1"  #one instance at most 10% of the CPU
          memory: 50M  #one instance at most 50M memory
      restart_policy:
        condition: on-failure   #Immediately restart containers if one fails
    ports:
      - "80:80"   #map host port 80 with service port 80
    networks:
      - webnet  #share 80 via a load-balanced network called webnet


  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "8080:8080"
    volumes:   #giving the visualizer access to the host’s socket file for Docker
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:      #ensuring that this service only ever runs on a swarm manager
        constraints: [node.role == manager]
    networks:
      - webnet


networks:
  webnet:   #use webnet as default network
  1. 將shell 連接到 swarm manager node上
#確認 myvm1 和  myvm2 工作正常
$ docker-machine ls 
NAME    ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS
myvm1   -        virtualbox   Running   tcp://192.168.99.100:2376           v17.09.1-ce   
myvm2   -        virtualbox   Running   tcp://192.168.99.101:2376           v17.09.1-ce

$ eval $(docker-machine env myvm1)
[myvm1]$

重新部署myClusrerApp

#here docker will try to pull dockersamples/visualizer:stable from docker hub, make sure you have login docker up.
[myvm1]$ docker stack deploy -c docker-compose.yml myClusterApp
Creating network myClusterApp_webnet
Creating service myClusterApp_web
Creating service myClusterApp_visualizer


[myvm1]$ docker service ls
ID                  NAME                      MODE                REPLICAS            IMAGE                             PORTS
tdyqjjsra3c7        myClusterApp_visualizer   replicated          0/1                 dockersamples/visualizer:stable   *:8080->8080/tcp
ub42lr94rxod        myClusterApp_web          replicated          5/5                 misterchi/repositorytest:hello    *:80->80/tcp
  1. 測試 visulaizer
    在瀏覽器中訪問 http://192.168.99.100:8080 或者 http://192.168.99.101:8080

添加Redis server到 stack

接下來繼續添加 Redis database 到stack 中爲web app 保存 永久數據

  1. 編輯 docker-compose.yml
version: "3"
services:
  web:       #service called web
    image: misterchi/repositorytest:hello  #Pull the image 
    deploy:
      replicas: 5     #five instances
      resources:
        limits:
          cpus: "0.1"  #one instance at most 10% of the CPU
          memory: 50M  #one instance at most 50M memory
      restart_policy:
        condition: on-failure   #Immediately restart containers if one fails
    ports:
      - "80:80"   #map host port 80 with service port 80
    networks:
      - webnet  #share 80 via a load-balanced network called webnet


  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "8080:8080"
    volumes:   #giving the visualizer access to the host’s socket file for Docker
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:      #ensuring that this service only ever runs on a swarm manager
        constraints: [node.role == manager]
    networks:
      - webnet

  redis:
    image: redis
    ports:
      - "6379:6379" #6379, has been pre-configured by Redis to be exposed from the container to the host,
    volumes: #file "/home/docker/data" is on host’s file system as /data inside the container, which is where Redis stores data.
      - /home/docker/data:/data
    deploy:
      placement:
        constraints: [node.role == manager]
    command: redis-server --appendonly yes
    networks:
      - webnet


networks:
  webnet:   #use webnet as default network
  1. 在 manager node上創建 ./data 文件夾
$docker-machine ssh myvm1 "mkdir ./data"
  1. 再次重新部署myClusterApp
[myvm1]$ docker stack deploy -c docker-compose.yml myClusterApp
Creating service myClusterApp_redis
Updating service myClusterApp_web (id: ok0mzz6wovsn3e4nb99yeabui)
Updating service myClusterApp_visualizer (id: jonslyz4941hhde7uwp7lud6m)


[myvm1]$ docker service ls
ID                  NAME                      MODE                REPLICAS            IMAGE                             PORTS
ljap8qcahxkf        myClusterApp_redis        replicated          1/1                 redis:latest                      *:6379->6379/tcp
jonslyz4941h        myClusterApp_visualizer   replicated          1/1                 dockersamples/visualizer:stable   *:8080->8080/tcp
ok0mzz6wovsn        myClusterApp_web          replicated          5/5                 misterchi/repositorytest:hello    *:80->80/tcp

$ docker-machine ssh myvm1 "ls ./data/"
appendonly.aof
  1. 測試
$ curl http://192.168.99.100
<h3>Hello World!</h3><b>Hostname:</b> a0d14ba329ce<br/><b>Visits:</b> 7
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章