天天看点

走进docker-swarm 带大家快速掌握docker自带编排工具

走进docker-swarm 带大家快速掌握docker自带编排工具

什么是Docker Swarm?

  • 对比Docker
前面我们介绍过Docker可以理解成是一个我们的服务的独立运行的容器,那么在实际工作中,我们的系统可能是一个微服务应用,系统中根据业务拆分成多个模块,可以理解一个模块对应一组运行着相同镜像的的Docker容器,这就是单个Docker,而Swarm就是这个系统中,能够管理所有的容器之间的路由、负载均衡、服务发现,以及容器的伸缩(可以理解为我们一个服务进行扩/缩容)、日志、配置文件的编排工具。
  • 对比Docker-Compose
Docker-Compose类似与我们生活中的管家,它仅仅能够管理一个主机上的所有容器,他可以一次性启动多个容器。而Docker-Swarm可以跨主机去管理多个容器,并且当一个容器状态异常时候可以快速在其他机器上启动容器,保证服务的高可用!
  • 对比Kubernetes
Kubernetes它本身的角色定位是和Docker Swarm 是一样的,也就是说他们负责的工作在容器领域来说是相同的部分,都是一个跨主机的容器管理平台,当然也有自己一些不一样的特点,k8s是谷歌公司根据自身的多年的运维经验研发的一款容器管理平台。而Docker Swarm则是由Docker 公司研发的。Kubernetes在Docker基础上封装了一层概念,所以他的功能相对于Swarm更强大,但是运维更复杂,Swarm则更容易上手。

综上所述大家应该知道Docker就是一个容器,Docker-Compose是一个单主机的编排工具,Docker-Swarm是一个多主机的编排工具!

swarm

  • Swarm架构组成
    • Docker Api 是基于Docker去管理容器
    • Swarm Manage CLi 是Swarm集群管理Api
    • Leadership 这个是Swarm提供的HA
    • Scheduler 则是Swarm的调度策略,以及过滤规则管理
    • Discovery Service 管理每个容器的服务的注册、发现

结构图

  • Swarm如何工作?

    Swarm节点分为管理节点(manager)跟 工作节点(worker),管理节点主要用于swarm集群的管理(也可以设置执行任务工作),Docker Swarm命令只能在管理节点上去操作,一个集群可以存在多个管理节点,但是只有一个管理节点可以成为Leader。工作节点是任务执行节点。

    • Manager节点:
      1. 处理集群管理任务
      2. 维护集群状态
      3. 调度服务
      4. Swarm 提供外部可调用的 API 接口
    • Worker节点:

      实际执行我们服务的Docker容器

执行图

Docker Swarm命令

  • 初始化集群
$ docker swarm init --advertise-addr 192.168.99.121
Swarm initialized: current node (bvz81updecsj6wjz393c09vti) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-1awxwuwd3z9j1z3puu7rcgdbx \
    172.17.0.2:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
           
  • 加入集群
# 加入worker 
$ docker swarm join-token worker


To add a worker to this swarm, run the following command:
    docker swarm join \
    --token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-1awxwuwd3z9j1z3puu7rcgdbx \
    172.17.0.2:2377
# 加入manager 
$ docker swarm join-token manager

To add a manager to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-7p73s1dx5in4tatdymyhg9hu2 \
    172.17.0.2:2377
           
  • 离开集群
# --force / -f 强制离开
$ docker swarm leave -f
Node left the default swarm.
           
  • 查看集群节点信息
docker@manager:~$ docker node ls                                                                                                                                                          
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
alz0od3rbkg552mkicfuezhkn *   manager             Ready               Active              Leader              19.03.12
jxf5u2hnurrgz90vnd9ay3y7p     node-1              Ready               Active                                  19.03.12
lldvm2slseyodo0t7ath5tzne     node-2              Ready               Active                                  19.03.12

           
  • swarm集群中创建服务
docker service create --name redis redis:3.0.6

dmu1ept4cxcfe8k8lhtux3ro3

$ docker service create --mode global --name redis2 redis:3.0.6

a8q9dasaafudfs8q8w32udass

$ docker service ls

ID            NAME    MODE        REPLICAS  IMAGE
dmu1ept4cxcf  redis   replicated  1/1       redis:3.0.6
a8q9dasaafud  redis2  global      1/1       redis:3.0.6
           
  • 查看swarm集群服务信息
$ docker service inspect redis
           
  • 查看服务的日志
$ docker service logs -f redis

           
  • 查看启动所有服务
$ docker service ls 
ID            NAME      MODE            REPLICAS             IMAGE
c8wgl7q4ndfd  frontend  replicated      5/5                  nginx:alpine
dmu1ept4cxcf  redis     replicated      3/3                  redis:3.0.6
iwe3278osahj  mongo     global          7/7                  mongo:3.3
hh08h9uu8uwr  job       replicated-job  1/1 (3/5 completed)  nginx:latest

           
  • 查看服务启动的具体容器
$ docker service ps redis

ID             NAME      IMAGE        NODE      DESIRED STATE  CURRENT STATE          ERROR  PORTS
0qihejybwf1x   redis.1   redis:3.0.5  manager1  Running        Running 8 seconds
bk658fpbex0d   redis.2   redis:3.0.5  worker2   Running        Running 9 seconds
5ls5s5fldaqg   redis.3   redis:3.0.5  worker1   Running        Running 9 seconds
           
  • 删除服务
$ docker service rm redis

redis

$ docker service ls

ID  NAME  MODE  REPLICAS  IMAGE
           
  • 扩容/缩容服务(可以动态添加服务提供节点,在swarm节点集群中启动)

    docker service create --mode global ... : 启动服务