Docker Swarm

Docker Swarm_第1张图片
image.png

Docker Swarm_第2张图片

Docker Swarm_第3张图片
swarm是一个集群架构

Swarm有两种节点,一种叫Manager,一种叫Worker。Manager是指挥官,多个Manager之间会做同步,Worker是真正干活的,Worker之间也要数据同步。


Docker Swarm_第4张图片

replicas可以理解为容器。

1.创建一个三节点的swarm集群

进入https://labs.play-with-docker.com/p/bngt93vad2eg009qp6h0#bngt93va_bngt9kfad2eg009qp6l0
这个网站去搭建

Docker Swarm_第5张图片

执行以下命令:

$ docker swarm init --advertise-addr 192.168.0.16
Swarm initialized: current node (hwip18th1x341ya0mgfhy0odn) is now a manager.

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

    docker swarm join --token SWMTKN-1-47yjbgi9agonlqcx561xj83m0yghgtsfvrrqutzpdnfv4cc0c4-5yzowa1j2s2hwubzl8amgsvcq 192.168.0.16:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

我们可以从结果中看到启动的是一个manager。

[root@master ~]# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
rvr00w2iu56y94ru5l1gmcg03 *   master              Ready               Active              Leader              19.03.5

在第二台机器上执行命令,加入到manager集群中


Docker Swarm_第6张图片

回到第一台机器,我么可以看到节点加入进来了


Docker Swarm_第7张图片

加入第三台机器
Docker Swarm_第8张图片

Docker Swarm_第9张图片

2.service的创建维护和水平扩展

service就是一个容器,swarm可以使用docker service创建一个容器。类似于docker run,但是docker是在本地创建一个容器。docker service就不仅仅是在本地创建容器了。
创建一个busybox:


Docker Swarm_第10张图片

我们通过下面的截图可以看到这个service运行在node2节点上:


Docker Swarm_第11张图片

通过docker ps可以发现node3上根本没有busybox,只有我自己启动的一个nginx。证明了service启动的时候是随机选择了集群中的一个节点进行启动。

接下来我们对我们的demo3进行水平扩展
Docker Swarm_第12张图片

重点关注下REPLICAS从1/1变成了5/5,说明我们扩展成功了,分母上的5表示设置的scale的数量,分子上表示运行中的。在通过docker service ps demo3看看有多少个运行的,且分别运行在什么机器上:


Docker Swarm_第13张图片

如果说我们在node2上去docker rm -f一个container会发生什么事情呢?

Docker Swarm_第14张图片

我们发现RELICAS从4/5变成了5/5,为什么会这样?
执行docker service ps demo3可以发现,挂掉了一个之后,又重新启动了一个起来。
Docker Swarm_第15张图片

那如果我们真正的要做删除操作呢?docker service rm service名称即可

在swarm中Container和Container之间的访问通过overlay网络。我们启动多个service,如果service有绑定端口,则此服务可以通过任意swarm节点的相应端口访问。当一个container去访问swarm中的另外一个container的时候,首先通过DNS把服务名解析成一个VIP,然后这个VIP在映射到具体的Service中。如下图所示:

Docker Swarm_第16张图片

docker容器之间的通信是通过overlay来进行的:


2.用Docker swarm部署一个复杂的应用

2.1编辑一个docker-compose.yml

version: "3"
services:

  redis:
    image: redis:alpine
    ports:
      - "6379"
    networks:
      - frontend
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure

  db:
    image: postgres:9.4
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - backend
    deploy:
      placement:
        constraints: [node.role == manager]

  vote:
    image: dockersamples/examplevotingapp_vote:before
    ports:
      - 5000:80
    networks:
      - frontend
    depends_on:
      - redis
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
      restart_policy:
        condition: on-failure

  result:
    image: dockersamples/examplevotingapp_result:before
    ports:
      - 5001:80
    networks:
      - backend
    depends_on:
      - db
    deploy:
      replicas: 1
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure

  worker:
    image: dockersamples/examplevotingapp_worker
    networks:
      - frontend
      - backend
    deploy:
      mode: replicated
      replicas: 1
      labels: [APP=VOTING]
      restart_policy:
        condition: on-failure
        delay: 10s
        max_attempts: 3
        window: 120s
      placement:
        constraints: [node.role == manager]

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

networks:
  frontend:
  backend:

volumes:
  db-data:

这个compose文件中有多个应用,我们对这个文件中所有的应用进行部署:

$ docker stack deploy zzm --compose-file=docker-compose.yml
Creating network zzm_frontend
Creating network zzm_default
Creating network zzm_backend
Creating service zzm_worker
Creating service zzm_visualizer
Creating service zzm_redis
Creating service zzm_db
Creating service zzm_vote
Creating service zzm_result

查看这里面有多少services


Docker Swarm_第17张图片

查看一下swarm集群中的service情况分布


Docker Swarm_第18张图片

现在我们打算把zzm_vote这个service从2个扩展到3个:
Docker Swarm_第19张图片

Docker Swarm_第20张图片

3.Docker secret管理和使用

Docker Swarm_第21张图片

Docker Swarm_第22张图片

3.1通过文件创建一个密码,然后删掉文件

Docker Swarm_第23张图片

3.2查看我们创建的密码

3.3创建一个service使用这个密码

Docker Swarm_第24张图片

Docker Swarm_第25张图片

你可能感兴趣的:(Docker Swarm)