不建议docker-compose在生产环境中使用

  • 适用于单机环境通过docker-compose启动多个容器协同工作的
  • 单机工作存在单节点故障问题,生产环境是不可接受的,无法达到高可用
  • 需要高可用的话,必须是多台物理机器协同工作的,docker-compose无法工作的

集群管理工具docker swarm 容器编排

  • 核心功能

    • Swarm 是 Docker 官方提供的一款集群管理工具,其主要作用是把若干台 Docker 主机抽象为一个整体,并且通过一个入口统一管理这些 Docker 主机上的各种 Docker 资源。
    • 集群方面,Swarm 将一个或多个 Docker 节点组织起来,使得用户能够以集群方式管理它们,可以自如地添加或删除节点。
    • 编排方面,Swarm 提供了一套丰富的 API 使得部署和管理复杂的微服务应用变得易如反掌。通过将应用定义在声明式配置文件中,就可以使用原生的 Docker 命令完成部署。
    • 原生 Swarm 应用,它还可以部署和管理 Kubernetes 应用。Swarm 和 Kubernetes 比较类似,但是更加轻,具有的功能也较 kubernetes 更少一些。当然,后续我们也会学习介绍Kubernetes的使用。
  • 常用命令介绍

    • 集群管理: docker swarm 子命令有 init, join, leave, update (docker swarm --help查看帮助)
    • 节点管理: docker node子 命令有 accept, promote, demote, inspect, update, tasks, ls, rm (docker node --help查看帮助)
    • 配置管理: docker config 子命令有 create, inspect, ls, rm (docker config--help查看帮助)
    • 服务管理: docker service 子命令有 create, inspect, update, remove, tasks, ls, rm, ps (docker service--help查看帮助)
    • 堆栈管理: docker stack 子命令有 deploy, services, ps, rm (docker stack--help查看帮助)

    开始部署

    通信端口开放

  • 要用到的通信接口开放,集群节点之间保证2377/TCP、7946/TCP、7946/UDP和4789/UDP端口通信(或者直接关闭防火墙 systemctl stop firewalld

    # 集群管理端口
    firewall-cmd --zone=public --add-port=2377/tcp --permanent    
    # 节点之间通讯端口
    firewall-cmd --zone=public --add-port=7946/tcp --permanent   
    firewall-cmd --zone=public --add-port=7946/udp --permanent
    # overlay网络通讯端口
    firewall-cmd --zone=public --add-port=4789/tcp --permanent   
    firewall-cmd --zone=public --add-port=4789/udp --permanent
    firewall-cmd --reload

    测试机IP说明

  • 192.168.56.2、192.168.56.3、192.168.56.4

    192.168.56.2初始化节点(默认初始化节点为manager)

    # --advertise-addr  多网卡的情况下,指定需要使用的ip
    # --listen-addr     指定监听的 ip 与 port (默认就是使用的IP:2377)
    docker swarm init --advertise-addr 192.168.56.2  [--listen-addr 192.168.56.2:2377] 

    192.168.56.3和192.168.56.4添加工作节点

    # 192.168.56.3
    docker swarm join --token SWMTKN-1-4c3sxt490hmca01w07dhidc121f3326w256i1rwd33scf9cdlv-dvini4wkay01vz5j7lky8zy14 192.168.56.2:2377
    # 192.168.56.4
    docker swarm join --token SWMTKN-1-4c3sxt490hmca01w07dhidc121f3326w256i1rwd33scf9cdlv-dvini4wkay01vz5j7lky8zy14 192.168.56.2:2377
    # 查看节点情况
    docker node ls
    
    vagrant@swarm2:/etc/docker$ docker node ls
    ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
    lh8yowqifw8fvpefdpmhdxsvp *   swarm2     Ready     Active         Leader           20.10.7
    uwtk92kiuzccpdv6c6lcmha1y     swarm3     Ready     Active                          20.10.7
    zaos4mhr8jkwx2moks4mlr25y     swarm4     Ready     Active                          20.10.7

    其他

    # 移除节点
    docker node rm HOSTNAME
    # 强制从集群中删除节点
    docker node rm -f HOSTNAME
    # 退出节点(对应节点上运行)
    docker swarm leave
    # 节点降级(将manager节点降为worker)
    docker node demote HOSTNAME
    
    # 节点升级(将worker节点提升为manager)
    docker node promote HOSTNAME

    部署多 service 应用

  • 本次部署以文章为例进行集群搭建
  • 在生产环境中,service服务应用很多,我们不可能一一创建,需要一个类似于单机环境docker-compose的工具,来帮助我们实现多service服务应用的创建和管理,而swarm stack刚好解决了这一点,它可以使用docker-compose.yml文件在集群里实现多service的创建等一系列工作。这样理解吧!stack可以理解成swarm版本的compose,docker-compose用于单机环境,docker stack用于swarm集群,下面我们会详细讲swarm stack使用。
  • 在介绍stack之前,我们先简说一下docker service 常用的命令。docker service COMMAND --help查看命令详细参数

    • docker service create 命令用于创建服务, 按照指定参数的描述创建一个服务,必须在管理器节点上运行此命令。
    • docker service inspect 命令用于显示有关一个或多个服务的详细信息,必须以管理员节点为目标运行此命令,默认情况下,这将使JSON数组中的所有结果呈现,如果指定了格式,则将为每个结果执行给定的模板。
    • docker service logs 命令用于获取服务的日志,docker服务记录命令批量检索执行时存在的日志。注意:此命令仅适用于使用json-file或日志记录驱动程序启动的服务。
    • docker service ls 命令用于列出服务,此命令在运行定向管理器时,正在群集中运行的列表服务。
    • docker service rm 命令用于删除一个或多个服务,从群集中删除指定的服务,必须以管理员节点为目标运行此命令。
    • docker service scale 命令用于使您能够将一个或多个复制服务向上或向下缩放到所需数量的副本,此命令不能应用于全局模式的服务。该命令将立即返回,但服务的实际缩放可能需要一些时间。 要停止服务的所有副本,同时保持服务在群集中的活动,您可以将比例设置为0。
    • docker service update 命令用于更新服务,它根据指定的参数更新服务。 必须以管理员节点为目标运行此命令

      docker stack 部署多应用

  • 大规模场景下的多服务部署和管理是一件很难的事情,Docker Stack由此而生。
  • docker stack 通过提供期望状态滚动升级简单易用扩缩容健康检查等特性简化了应用的管理,这些功能都封装在一个完美的声明式模型当中。
  • docker stack 能够在单个声明文件中定义复杂的多服务应用,还提供了简单的方式来部署应用并管理其完整的生命周期:初始化部署 -> 健康检查 -> 扩容 -> 更新 -> 回滚
  • 主要注意的是,我们操作都在manager的机器上,初始化节点为manager即192.168.56.2。

    # 可以通过以下命令去查看详细参数
    docker stack deploy --help
    
    # 创建启动,在私有的dockerhub上拉去镜像需要加上 --with-registry-auth参数
    
    vagrant@swarm2$ docker stack deploy -c docker-compose.yml  app
    Ignoring unsupported options: build, restart
    
    Updating service app_adminer (id: rtml09uzy2yv3qly9p3j6pk0f)
    Updating service app_web (id: pnm1h8n1gjiaxza0ifssghub6)
    Updating service app_redis-server (id: ow9f63qmpxkq66urdrn3e3bl6)
    Updating service app_mysql-server (id: yzu3gx8ddu2aludkl7t2obhz4)
    vagrant@swarm2$ docker ps
    CONTAINER ID   IMAGE                    COMMAND                  CREATED              STATUS                             PORTS                                                  NAMES
    e7a7cf965c36   niuzheng131400/web:1.0   "docker-php-entrypoi…"   About a minute ago   Up 54 seconds (health: starting)   80/tcp, 9000/tcp                                       app_web.1.osvng4z3zq5qvxm3hbg0auf91
    2e7444e6d9e6   redis:latest             "docker-entrypoint.s…"   2 minutes ago        Up 2 minutes (healthy)             6379/tcp                                               app_redis-server.1.dxy4mxmib1dehiqy3zaptbpt1
    75a2f27c4508   adminer:latest           "entrypoint.sh docke…"   26 hours ago         Up 28 minutes (healthy)            0.0.0.0:8080->8080/tcp, :::8080->8080/tcp              docker-compose1-adminer-1
    0ec03fdbcdd9   mysql:5.7                "docker-entrypoint.s…"   26 hours ago         Up 28 minutes (healthy)            0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   docker-compose1-mysql-server-1

    源码地址

    github源码地址
    dockerHub地址

swarm 基本架构图

swarm_arch.jpg

Last modification:June 18, 2022
如果觉得我的文章对你有用,请随意赞赏