1. 程式人生 > >Docker Get Started V

Docker Get Started V

知識 dir 協調 ash 沒有 star bash p地址 文件夾

5. Stacks

介紹

在第4部分,你已經學會如何配置一個蜂群,蜂群是一個運行著docker的集群,然後你將app部署到這個蜂群上,容器運行在多個機器上。

在第5部分,我們馬上介紹分布式應用層級的最上層的概念stack。一個stack是一組共享依賴的內部相關的服務,這些服務能夠被一起編排和伸縮。單獨的一個stack能夠定義和協調整個應用的功能,一些復雜的應用可能需要定義多個stack。

不要慌,從第3部分開始,我們就已經接觸到了stack,前面我們創建compose文件,然後運行docker stack deploy,這些都是和stack相關的內容。但是前面我們接觸的都是運行在單臺機器上的包含單個服務的stack,這個在生產環境中不常見。接下來,運用之前學到的知識,我們來創建多個相關的服務,然後運行在多臺機器上。

增加一個Service 重新部署

修改docker-compose.yml文件很容易添加一個服務。首先我們增加一個免費的可視化服務,這個服務可以讓我們看我們的蜂群是如何調度我們的容器的。

  1. 打開docker-compose.yml文件,修改為如下內容:
version: "3"
services:
  web:
    # replace username/repo:tag with your name and image details
    image: dockerjie/get-started:part2
    deploy:
      replicas: 5
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
      restart_policy:
        condition: on-failure
    ports:
      - "4000: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的socket文件,placement則確保服務被部署在蜂群管理器swarm manager上面,而不是worker上,因為可視化服務是顯示蜂群概覽信息的,僅僅管理器才有權限獲取到這些信息。

  1. 確保你的shell連接到myvm1機器上。docker-machine start $(docker-machine ls -q)啟動所有機器
    1. 運行docker-machine ls確保你連接到myvm1上。如果出現ip地址對應的cert不對應,則重新運行命令生成cert,docker-machine regenerate-certs $(docker-machine ls -q)

技術分享圖片

2. 如有必要運行 eval \$(docker-machine env myvm1)

技術分享圖片

  1. 在蜂窩管理器上重新運行 docker stack deploy
docker stack deploy -c docker-compose-yml getstartedlab

部署完成後查看服務:

技術分享圖片

訪問可視化服務:

技術分享圖片

可以看到兩個服務:visualizer和web均已經啟動,且web服務的副本數量為5,分布為:

  • myvm1*1
  • myvm2*2
  • myvm3*2

也可以使用docker命令查看:

docker stack ps getstartedlab

技術分享圖片

持久化數據

到現在為止,我們的web服務中依賴的redis服務還沒有配置。

  1. 修改docker-compose文件,增加redis服務
version: "3"
services:
  web:
    # replace username/repo:tag with your name and image details
    image: dockerjie/get-started:part2
    deploy:
      replicas: 5
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
      restart_policy:
        condition: on-failure
    ports:
      - "4000: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有官方的鏡像,因此具有一個short name redis。6379是redis容器預先配置的端口,需要對外暴露的,我們也暴露這個端口給宿主機。有兩個額外的配置只得註意:

  • redis一直運行在manager上,因此它一直運行在相同的文件系統上,因為是同一個宿主機。
  • redis訪問宿主機上的文件夾作為/data目錄,redis將數據存儲到這裏。

redis需要持久化數據到容器裏的/data目錄,而容器啟動, 停止後,裏面的數據都沒有了。因此為了持久化數據,需要將容器的某些目錄映射到宿主機上,這樣數據才會被真正的持久化。

  1. 在manager宿主機上創建data目錄
docker-machine ssh myvm1 "mkdir ./data"
  1. 部署
docker stack deploy -c docker-compose.yml getstartedlab

技術分享圖片

查看瀏覽器驗證:

技術分享圖片

查看持久化生效:

技術分享圖片

Docker Get Started V