0x2 Docker系列:Docker官方文档翻译5

举报
我们都是云专家 发表于 2019/07/09 11:20:17 2019/07/09
【摘要】 Redis在Docker库中有一个正式镜像,并且已被授予redis的简短镜像名称,所以在这里没有username/repo符号。 Redis端口6379已经由Redis预先配置为从容器暴露给主机,并且在我们的Compose文件中,我们将它从主机展示给所有容器,因此你可以实际输入任何IP的IP 节点添加到Redis桌面管理器中并管理此Redis实例,如果愿意的话。

作者:云享专家——方志朋


堆栈(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

MacLinux上,命令是:

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)

查看可视化界面

你在Compose文件中看到,可视化工具在端口8080上运行。通过运行docker-machine ls来获取其中一个节点的IP地址。 转到8080端口的IP地址,您可以看到可视化器正在运行:

image.png

可视化器的单个副本按照预期在manager上运行,并且网络的5个实例遍布整个群集。 你可以通过运行docker stack ps来确认此可视化:

docker stack ps getstartedlab

可视化器是一个独立的服务,可以在包含它的任何应用程序中运行。 它不依赖于其他任何东西。现在让我们创建一个具有依赖性的服务:提供访问者计数器的Redis服务。

数据持久化

让我们再次通过相同的工作流程来添加用于存储应用程序数据的Redis数据库。

保存这份新的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:

RedisDocker库中有一个正式镜像,并且已被授予redis的简短镜像名称,所以在这里没有username/repo符号。 Redis端口6379已经由Redis预先配置为从容器暴露给主机,并且在我们的Compose文件中,我们将它从主机展示给所有容器,因此你可以实际输入任何IPIP 节点添加到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)

运行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.png

另外,请检查任一节点IP地址的端口8080处的可视化工具,并注意查看随Web和可视化工具一起运行的redis服务。

image.png


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。