DOCKER 07:docker swarm

docker compose 主要用于单机容器编排,docker swarm 则用于跨主机容器编排。

docker compose 需要单独下载执行脚本,docker swarm 系统自带无需安装。

docker swarm 属于需要了解得东西,毕竟生产中大多选择还是 Kubernetes(K8S)。

说明:

在 docker swarm 中包含了两个角色,Manager 和 Worker。Manager 是一个集群的核心,起着调度作用,建议部署多节点,且节点数量为奇数,防止脑裂。

在 Mnager 之间通信方式采取的是 Raft 进行数据信息同步,Worker 则是工作节点。

docker swarm 创建

这里准备了 4 台虚拟机:192.168.200.101(Manager),192.168.200.102-104(Worker)

首先在 4 台机器上都安装配置启动好 docker。

1. 101 Manager 节点初始化:

docker swarm init --advertise-addr=192.168.200.101

结果如图:

注意:红色部分将是其它节点加入该集群的依据,要保存好!

2. 在 102-104 节点上面执行该命令加入集群:

docker swarm join --token SWMTKN-1-4ht8hjdp73jrkguh7ux8e5uneq2mm1ovi91oko5a8vpearh5ss-8wn5u0kf9jxd0xj6wg29wq3bq 192.168.200.101:2377

结果如下:

可以看到接入集群成功,并且是作为 worker 存在!

3. 查看集群节点情况:

docker node ls

结果如图:

从这里也可以发现主机名不一致的重要性。

此时,docker 集群中所有对于容器的处理命令都应该在 Manager 节点上面执行,再由 Manager 分发调度到各个 Worker 节点。

几种加节点常见的报错:

1. 节点加错了想删除,去该节点执行退出集群:

docker swarm leave --force

但是这并会在 Manager 节点上面删除该节点,只是将节点状态换成 Down:

重新加入该节点则会新增一个:

可以 Manager 节点上手动删除 Down 的节点:

docker node rm pdfimxsip775w7pz9hhonzatd

再度查看:

2. 加入集群时候报错:Error response from daemon: error while validating Root CA Certificate: x509: certificate has expired or is not yet valid

原因为几台机器的时间可能不一致,可以使用 ntp 同步时间后再度添加。

3. 加入等待很久没反应,报错:connect: no route to host

可能是防火墙没有关闭导致网络不通,关闭防火墙再试。

docker swarm 操作

在 docker swarm 中,容器都是 service,所以 docker swarm 的操作都是 docker service xxx 操作。

注意:所以操作都是在 Manager 节点执行的。

1. 创建一个 service:

docker service create --name b1 busybox /bin/sh -c "while true;do sleep 3000;done"

执行方式和 docker run 其实差不多。

2. 查看运行的容器:

docker service ls

结果如图:

查看运行的容器中最重要的就是这个副本数,可以知道该容器运行了几个。

3. 查看容器运行在那个具体节点:

docker service ps b1

结果如图:

可以看到运行在了 node 1 节点上。而这个 node 1 节点也是 Manager 本身。

4. 删除容器测试:

docker container rm -f f190b31bbc90

此时再度查看:

可以看到再度启动了一个容器顶替了删掉的那个。

这就看出了 swarm 的好处,它运行的容器是被 service 管理的,只要 service 不删除,下面的容器你删除之后还是能够自动重建。

5. 删除 service:

docker service rm b1

结果如图:

docker swarm 实战

再开始之前先删除掉多余的网络,volume 干扰。

其中两个是 docker swarm 需要用到的网络,在构建的时候已经自动生成。

1. 创建本次实战的专属 overlay 网络,为了和其它服务网络隔离:

docker network create -d overlay wordpress-overlay

结果如图:

2. 通过 docker swarm 创建 mysql 数据库:

docker service create --name wordpress-db --env MYSQL_ROOT_PASSWORD=123456 --env MYSQL_DATABASE=wordpress --network wordpress-overlay --mount type=volume,source=wordpress-db-data,destination=/var/lib/mysql mysql:5.7

结果如图:

3. 创建 wordpress:

docker service create --name wordpress-web -p 8000:80 --network wordpress-overlay --env WORDPRESS_DB_PASSWORD=123456 --env WORDPRESS_DB_HOST=wordpress-db wordpress

结果如图:

可以看到此时 wordpress 的服务被调度到了 node-02 节点上面。

4. 访问测试:

Manager 节点 IP 访问:

Worker 节点访问:

发现集群内所有节点的 IP 通过制定的端口都能访问到该服务。

5. 集群扩容:

当业务量上来的时候,单节点的服务器已经带不动了,就可以运行多借点的 WEB。

docker service scale wordpress-web=3

结果如图:

可以看到其余节点也被分配到了 web 服务。

关于为啥一个集群节点运行了 web 服务器所以节点的 IP 都能访问的原理:Routing mesh

1. 当一个 service 访问另外一个 service 的时候,容器之间采用的是 overlay 网络。

2. 当外部访问容器服务,其实是访问到 LVS 上面的虚拟 IP,这个 IP 和服务做了绑定,并实现了负载均衡。所以无论哪个 IP 进来,都是通过 gwbridge 网络调度到指定网络名称空间,最终都能到达 LVS 调度器。

docker swarm 中的 docker-compose.yml

和单机运行一样,docker swarm 运行多个复杂关系的容器的时候每次都需要手动敲命令,那显然是不合理的,所以它也引入了 docker-compose 文件。

https://docs.docker.com/compose/compose-file/

删除掉之前的 wordpress 项目,这次试用 docker-compose 来定义:

version: "3"

# 容器
services:
  # 数据库
  wordpress-db-demo:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: wordpress
    networks:
      - wordpress-overlay-demo
    volumes:
      - wordpress-db-data-demo:/var/lib/mysql
    deploy:
      mode: global
      placement:
        constraints:
          # 指定运行的节点
          - node.role == manager

  # web
  wordpress-web-demo:
    image: wordpress
    ports:
      - 8000:80
    environment:
      WORDPRESS_DB_PASSWORD: 123456
      WORDPRESS_DB_HOST: wordpress-db-demo
    depends_on:
      - wordpress-db-demo
    networks:
      - wordpress-overlay-demo
    deploy:
      mode: replicated
      replicas: 3
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
      update_config:
        parallelism: 2
        delay: 10s
      placement:
        constraints:
          - node.role == worker

volumes:
  wordpress-db-data-demo:

networks:
  wordpress-overlay-demo:
    driver: overlay

相较于 docker 直接使用的 docker-compose 配置,在 docker swarm 中多了 deploy 字段。

该字段一般用于定义运行规则,如运行的类型,指定节点,运行的数量,重启规则等等。

执行运行改配置:

docker stack deploy wordpress --compose-file=docker-compose.yml

注意,在使用 docker-compose 配置的时候需要使用 stack 命令,而不再是 service 和 swarm 命令。

查看运行的容器信息:

1. 查看运行了哪些 stack:

docker stack ls

2. 查看指定 stack 运行的节点信息:

docker stack services wordpress

3. 查看容器运行的具体节点:

docker stack ps wordpress

结果如下:

当然删除同理!

服务灰度更新

1. 在所以节点上面都新增目录,app.py,Dockerfile:

mkdir flask-update-demo
cd flask-update-demo/

app.py:

from flask import Flask
app = Flask(__name__)

@app.route(‘/‘)
def hello():
    return "Version 1.0\n"
if __name__=="__main__":
    app.run(host="0.0.0.0", port=5000)

Dockerfile:

FROM python:2.7
LABEL author="Dylan" mail="[email protected]"
RUN pip install flask
COPY app.py /app/
WORKDIR /app/
EXPOSE 5000
CMD ["python", "app.py"]

2. 将 Dockerfile 构建成镜像:

docker build -t dylan/flask-update-demo:v1.0 .

3. 将 app.py 中 Version 改为 2.0 再度构建镜像:

docker build -t dylan/flask-update-demo:v2.0 .

结果如图:

4. 此时部署 v1 版本:

docker network create -d overlay flask-overlay-demo
docker service create --name flask-demo -p 8000:5000 --network flask-overlay-demo dylan/flask-update-demo:v1.0 

此时新开窗口访问测试:

sh -c "while true;do curl 127.0.0.1:8000 && sleep 1;done"

结果如图:

5. 扩容升级:

docker service scale flask-demo=3
docker service update --image dylan/flask-update-demo:v2.0 flask-demo

结果如图:

可以发现升级过程中两个版本并排运行:

升级完成后版本统一!

6. 版本回滚:

docker service rollback flask-demo

结果如图:

再次回到两个版本并排运行:

最终回滚完成!

以上就是  docker swarm 需要了解的内容,也是对于 docker 自带的容器编排需要了解的内容。不需要刻意去记,了解这些特征即可。

毕竟,学习这些的目的其实还是为了学习 Kubernetes 做准备。

原文地址:https://www.cnblogs.com/Dy1an/p/12382673.html

时间: 2024-11-08 02:11:40

DOCKER 07:docker swarm的相关文章

Docker(二):Docker的基本概念

Docker镜像: Docker镜像就是一个只读模板,例如,一个镜像可以包含Ubuntu操作系统环境,里面安装了Apache或用户需要的其它应用程序. 镜像可以用来创建Docker容器.Docker提供了一个简单的机制来创建镜像或更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像直接使用. Docker容器: Docker利用容器来运行应用.容器是从镜像创建的运行实例,它可以被启动,开始,停止,删除.每个容器是相互隔离的,保证安全的平台.可以把容器看作是一个简易的Linux环境(

Docker(一):Docker入门教程

如今Docker的使用已经非常普遍,特别在一线互联网公司.使用Docker技术可以帮助企业快速水平扩展服务,从而到达弹性部署业务的能力.在云服务概念兴起之后,Docker的使用场景和范围进一步发展,如今在微服务架构越来越流行的情况下,微服务+Docker的完美组合,更加方便微服务架构运维部署落地. 本文详细解释介绍Docker入门相关内容,后期重点关注Docker在微服务体系中的使用.在了解Docker之前我们先考虑几个问题:1.Docker是什么?2.为什么要使用Docker,它有什么优势?带

Docker之七:Docker数据卷管理

容器数据持久化 1.数据卷:将本地磁盘mount进入容器-v /dest-v src:dst [ro]|[rw] 2.数据卷容器:将外部容器分享给容器--volumes-from数据卷容器专门用来挂载数据卷的容器,以供其他容器引用和使用 3.数据卷管理命令docker volume 一.数据卷:1.给容器内部映射一个外部数据卷 -v src:dest[[email protected] nginx]# docker run -d --name web1 -v /opt/nginx:/usr/sh

Docker(二):Docker的用途

Docker的优点: 1.Docker容器的启动可以在秒级实现,相比传统虚拟机方式快的多. 2.Docker资源利用率很高,一台主机上可以同时运行数千个Docker容器. 3.容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高.传统虚拟机方式运行10个不同的应用就要启10个虚拟机,而Docker只需要启动10个相互隔离的容器即可. Docker容器运行不需要额外的hypervisor支持,它是内核级的虚拟化,因此可以实现更高的性能和效率. Docker容器几乎可以在任意的平台上

Docker教程:Docker镜像导出及迁移

http://blog.csdn.net/pipisorry/article/details/51330126 Docker目录分析 安装docker时,默认的安装位置是/var/lib/docker. $sudo ls /var/lib/docker/ aufs  containers  graph  init  linkgraph.db  repositories-aufstmp  trust  volumes repositories-aufs:记录了镜像名称以及对应的Id的json文件

理解Docker(1):Docker 安装和基础用法

1. 安装 1.1 在 Ubuntu 14.04 上安装 Docker 前提要求: 内核版本必须是3.10或者以上 依次执行下面的步骤: sudo apt-get update sudo apt-get install apt-transport-https ca-certificates sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF7

宋宝华:Docker 最初的2小时(Docker从入门到入门)

最初的2小时,你会爱上Docker,对原理和使用流程有个最基本的理解,避免满世界无头苍蝇式找资料.本人反对暴风骤雨式多管齐下狂轰滥炸的学习方式,提倡迭代学习法,就是先知道怎么玩,有个感性认识,再深入学习高级用法,深层原理,一轮轮迭代.坚决反对一上来就搞几百页厚的东西把人脑子弄乱. Docker是什么? KVM, Virtualbox, Vmware是虚拟出机器,让每个实例看到一个单独的机器:而Docker是虚拟出操作系统,实现应用之间的隔离,让各个应用觉得自己有一个自己的操作系统,而且彼此之间隔

Spring Boot 2.0(五):Docker Compose + Spring Boot + Nginx + Mysql 实践

我知道大家这段时间看了我写关于 docker 相关的几篇文章,不疼不痒的,仍然没有感受 docker 的便利,是的,我也是这样认为的,I know your felling . 前期了解概念什么的确实比较无聊,请不要着急精彩马上开始,当大家对 docker 相关概念有所了解之后,后面我会结合 Spring Boot 给大家来一系列的小例子,会让大家感受到使用 Docker 就是这么爽! 今天给大家演出的导演是 Docker 家族的 docker-compare ,主演是 Spring Boot.

docker一: 镜像与容器管理

Docker的优势: 1.启动非常快,秒级实现. 2.资源利用率高,在机器中以进程的方式存在,一台机器可以跑上百个docker容器. 3.创建和配置后可以在任意地方运行docker,只需将其上传到docker仓库,用到时拉下来就可以 4.易迁移,平台依赖性不强. Docker的主要概念: 1.镜像:只读模板,类似于安装系统用到的iso文件,对于镜像我们可以自定义,比如在一台机器上安装好lnmp环境,然后打包成为一个镜像,那么后期只需要从仓库中把这个镜像拉下来就可以直接使用lnmp环境了,非常方便