学习笔记--Docker集群Swarm(应用篇)

ps:博客用与记录个人学习过程中遇到的一些问题以及解决方案。若有表述不当之处还请见谅。

简述

这篇文章分享自己使用swarm搭建现实需求环境的过程和遇到的问题
ps: 使用docker compose stack配合搭建。下文提到的 ‘docker-compose.yml’ 等价与 'docker-stack.yml’

搭建

环境的配置: 承载django的ubuntu16:04、用于缓存的redis、主数据库mariadb、数据库管理pma、web服务器nginx、docker服务 界面visualizer

注意事项

  • docker-compose必须是3.x版本,有关docker-compose知识点不在文章内容内。有意学习的朋友可以查询官方文档。

https://docs.docker-cn.com/compose/compose-file/ docker-compose version3 官方文档

  • 使用docker-compose文件时(分布式情况下) 无法使用build指令, 所以所有服务均采用image方式构建,当遇到需要替换配置文件情况时可以采用预先构建定制镜像的方式解决。(使用dockerfile构建镜像)

  • 不同于compose2版本,link操作在version3版本中移除了,采用networks方式有些迂回地连接各个服务。处在相同网络下的服务有着version2中link的效果。这里有一点要注意,对于关联后的服务命名采用以下方式。具体请查看文档

    networks:
      '网络名':
        aliases:
          - ‘别名’

ps: 有关compose version2和version3区别,有一片博客总结得很好

https://www.jianshu.com/p/748416621013

启动服务

准备好docker-compose.yml文件后,使用docker stack deploy命令运行swarm。系统将自动为服务分配节点服务器。

docker stack deploy -c 'docker-compose.yml路径+名称' '服务名'

运行情况可通过docker stack ls方式查询

docker stack ls         查询所有服务
docker stack ps '服务名' 查看服务详细信息

在这里我遇到第一个问题
问题一:
个别服务启动失败,第一反应就是文件关联的问题。当我们在一台机运行的时候,所有文件关联可以通过相对、绝对路径进行,但在不同服务器运行时会出现文件不存在、无法共享等问题。以导致服务无法启动。
解决方案(个人目前了解):

  1. 将需要文件关联的服务放在同一节点(启动节点)下运行(使用标签限制),让无需文件共享的服务在其他服务器运行。
    deploy:
      placement:
        constraints:
          - node.labels.id == 2
    deploy是compose3对部署时的属性,node.labels.id==2的意思是只允许标签id为2的节点运行该服务

利用上述方法可将服务限制在自己想要让其运行的节点服务器上(具体使用方法可参考compose3文档)

  1. 使用nfs服务器的形式共享文件
    搭建共享服务器的方式网上有很多,这里就不贴出网址。
    使用方法(个人目前了解):
    1 . 在写compose文件时,使用volumes数据卷,数据卷配置nfs连接。这样在运行对应服务的服务器会临时创建volume数据卷,并连接到nfs服务器,并且在服务关闭的时候会自动销毁数据卷。是目前我所了解的最好的方式。
volumes:
  '数据卷名':
    driver: local
    driver_opts:
      type: "nfs"
      o: "addr: 'nfs服务器ip地址',rw"
      device: '路径'

通过上述方法可以解决共享文件的问题,但在这里我遇到另外一个问题
问题二:
volumes数据卷无法连接nfs服务器。我尝试在节点服务器上对nfs服务器使用showmount,但显示无法连接,而采用mount却可以连接。在网上百度了很多方法均无法解决,如果有小伙伴懂得怎么解决希望不吝赐教,嘻嘻
于是只好退而求其次,采取另外一种方法

  1. 我将所有node节点均连接到nfs服务器共享文件(好在小家小户只供得起两台学生级服务器…),compose文件不采取数据卷模式,直接连接到相关路径文件,因为每个服务器均共享文件,所以不管服务在那里运行均可以关联到目标文件夹,同时在读写方面也能共享(这里可能会遇到读写冲突,但对于目前规模和文件设计上来说暂时没有冲突)。通过上述方法,我解决了共享文件的问题。

服务管理

docker service、docker stack相关指令均可查看当前运行服务情况。
也可以选择在服务当中运行visualizer,为运行中服务提供更直观的状态表述

  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "本机端口:8080"
    stop_grace_period: 1m30s
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints:
          - node.role == manager

注意事项:visualizer只能运行在manager节点
访问visualizer映射端口可以看到服务运行图形界面
学习笔记--Docker集群Swarm(应用篇)_第1张图片
ps: 对于读写力度大的服务建议还是放在nfs服务对应节点运行

关闭服务

直接使用 docker stack rm ‘服务名’ 即可

每个运行服务的节点服务都会被移除。

你可能感兴趣的:(docker)