Docker入门 (五 Stacks)

上一篇: Docker 入门 (四 Swarms 集群)

Stacks

简介

在第四部分Docker 入门 (四 Swarms 集群), 你学会了如何建立一个集群,并且在集群上部署了一个应用,该应用在多台机器上的容器上协作运行。

在第5部分中,您将到达分布式应用程序层次结构的顶部:堆栈。 堆栈是一组相互关联的服务,它们共享依赖关系,并且可以协调和缩放在一起。 单个堆栈能够定义和协调整个应用程序的功能(尽管非常复杂的应用程序可能希望使用多个堆栈)。

一些好消息是,从第3部分开始,当您创建Compose文件并使用docker堆栈部署时,您在技术上一直在使用堆栈。 但这是在单个主机上运行的单个服务堆栈,这通常不是生产中发生的事情。 在这里,您可以学习所学内容,使多个服务相互关联,并在多台计算机上运行它们。

添加新服务并重新部署

将服务添加到docker-compose.yml文件很容易。 首先,让我们添加一个免费的可视化服务,让我们看看我们的swarm如何调度容器。

  1. 在编辑器中打开docker-compose.yml并用以下内容替换其内容。 请务必将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:

在这里新增了web 服务,叫visualizer。注意在这里有两个新东西,volumes key:使visualizer服务有权限访问Docker主机的套接字文件,placement key:确保visualizer服务只运行在集群管理机上而不是Worker上。

我们待会详细解释placement constraints和 volumes。

  1. 确保您的shell配置为与myvm1通信。
    docker-machine env myvm1
    eval $(docker-machine env myvm1)
  1. 重新部署应用
docker stack deploy -c docker-compose.yml getstartedlab
  1. 验证
    查看visualizer:
    Docker入门 (五 Stacks)_第1张图片
    查看service:
    出现的问题:dockersamples/visualizer:stable 一直处在Prepare状态。这里不是问题,只需要耐心等待即可变成Running。
[hb@hb-desktop Bird2]$ docker stack ps getstartedlab
ID                  NAME                         IMAGE                             NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
gf72dv1epu1b        getstartedlab_visualizer.1   dockersamples/visualizer:stable   myvm1               Running             Running 18 seconds ago                       
hxbcwk8x7cj8        getstartedlab_web.1          hebiao/get-started:part1          myvm2               Running             Running 11 minutes ago                       
hbsdgoas3iy3        getstartedlab_web.2          hebiao/get-started:part1          myvm2               Running             Running 11 minutes ago                       
y6nj81bctipp        getstartedlab_web.3          hebiao/get-started:part1          myvm1               Running             Running 11 minutes ago                       
xbzp341tj8kg        getstartedlab_web.4          hebiao/get-started:part1          myvm2               Running             Running 11 minutes ago                       
sw0doud6mjup        getstartedlab_web.5          hebiao/get-started:part1          myvm1               Running             Running 11 minutes ago                       

建立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的暴露出6379和外部通信。

最重要的是,redis规范中有一些内容可以使数据在此堆栈的部署之间保持不变:

  • redis总是在管理器上运行,所以它总是使用相同的文件系统。
  • redis访问主机文件系统中的任意目录作为容器内的/ data,这是Redis存储数据的地方。

总之,这是在主机的物理文件系统中为Redis数据创建“真实来源”。 如果没有这个,Redis会将其数据存储在容器文件系统中的/ data中,如果重新部署该容器,将会被删除。

这个真相来源有两个组成部分:

  • 您放置在Redis服务上的放置约束,确保它始终使用相同的主机。
  • 您创建的卷,允许容器访问./data(在主机上)作为/ data(在Redis容器内)。 当容器来来往往时,存储在指定主机上的./data中的文件仍然存在,从而实现连续性。
  1. 在管理器上创建一个./data目录:
docker-machine ssh myvm1 "mkdir ./data"
  1. 确保您的shell配置为与myvm1通信
    docker-machine env myvm1
    eval $(docker-machine env myvm1)
  1. 再次执行部署
docker stack deploy -c docker-compose.yml getstartedlab
  1. 验证(如果除了问题就多检查即便docker-compose.yml文件,尽量拷贝粘贴)
    查看service:
[hb@hb-desktop Bird2]$ docker service ls
ID                  NAME                       MODE                REPLICAS            IMAGE                             PORTS
m0tevz136u5k        getstartedlab_redis        replicated          1/1                 redis:latest                      *:6379->6379/tcp
hsad3358i674        getstartedlab_visualizer   replicated          1/1                 dockersamples/visualizer:stable   *:8080->8080/tcp
x1niigeaxis4        getstartedlab_web          replicated          5/5                 hebiao/get-started:part1          *:80->80/tcp

浏览器验证:
Docker入门 (五 Stacks)_第2张图片Docker入门 (五 Stacks)_第3张图片

你可能感兴趣的:(Docker入门 (五 Stacks))