编辑
2024-02-11
TechNotes
00

目录

基本概念
是什么
为什么需要?
Docker Compse (单机环境的容器编排)
配置文件
版本简述
服务 services
网络 networks
数据卷 volumes
常用命令
构建服务
创建服务
拉取镜像
容器的运行/启动/停止
查看管理的容器列表
查看日志
示例
docker swarm(swarm)
关键概念
Swarm
Node
Task
Service
应用实战
集群搭建
初始化集群
增加工作节点
查看集群
部署服务
新建服务
监控集群状态
弹性伸缩
调整实例个数
调整集群大小

基本概念

是什么

容器编排:就是针对容器生命周期的管理,对容器的生命周期进行更快速方便的方式进行管理

为什么需要?

  • 依赖管理,当一个容器必须在另一个容器运行完成后,才能运行时,就需要进行依赖管理
  • 副本数控制,容器有时候也需要集群,快的对容器集群进行弹性伸缩
  • 配置共享,通过配置文件统一描述需要运行的服务相关信息,自动化的解析配置内容,并构建对应的服务

Docker Compse (单机环境的容器编排)

有的时候我们会需要涉及到在一台机器部署多个容器,那么此时再手动的每次输入相关的一堆配置命令再来启动容器,还是产生了很多无意义的重复性劳动。针对单机的多容器部署的情况,Docker 为我们提供了一个单机版本的服务编排工具 docker-compose

Docker-Compose 可以高效便捷的管理单机上运行的所有容器,它通过 yaml 配置文件的方式完成之前执行 docker run 命令所设置的所有参数,你可以先针对单机上的所有容器进行相关配置,配置完成后即可使用 docker-compose 对单机多容器进行高效的管理

image.png

配置文件

版本简述

docker-compose 的 api 版本与大版本一致,compose 版本与 docker 版本之间存在一定关联

Compose 版本Docker 版本
3.417.09.0+
3.317.06.0+
3.217.04.0+
3.11.13.1+
3.01.13.0+
2.317.06.0+
2.21.13.0+

这个表格将 Compose 版本和相应的 Docker 版本进行了对比。

服务 services

需要运行的容器配置,可以理解为原先用 docker run 命令后面跟的一系列配置信息,都陪在这个下面

网络 networks

docker-compose 公共自定义网络管理,配置好以后,可以直接在 services 中引用该网络配置,这个配置可以多个 service 使用

数据卷 volumes

docker-compose 下的统一数据卷管理,可以给多个 service 使用

常用命令

bash
Define and run multi-container applications with Docker. Usage: docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...] docker-compose -h|--help Options: -f, --file FILE Specify an alternate compose file (default: docker-compose.yml) -p, --project-name NAME Specify an alternate project name (default: directory name) --verbose Show more output -v, --version Print version and exit -H, --host HOST Daemon socket to connect to --tls Use TLS; implied by --tlsverify --tlscacert CA_PATH Trust certs signed only by this CA --tlscert CLIENT_CERT_PATH Path to TLS certificate file --tlskey TLS_KEY_PATH Path to TLS key file --tlsverify Use TLS and verify the remote --skip-hostname-check Don't check the daemon's hostname against the name specified in the client certificate (for example if your docker host is an IP address)
  • Commands:
    • build 构建或重新构建一个服务
    • bundle Generate a Docker bundle from the Compose file
    • config 验证并查看 compose 文件
    • create 创建一个服务
    • down 停止并删除容器、网络、镜像和数据卷
    • events Receive real time events from containers
    • exec 在一个运行中的容器执行命令
    • help 获取帮助信息
    • kill 关闭一个容器
    • logs 显示服务的日志信息
    • pause 暂停一个服务
    • port 打印一个端口绑定的公开端口
    • ps 查看容器列表
    • pull 拉取镜像
    • push 推送镜像
    • restart 重启容器
    • rm 删除已经停止的容器
    • run 运行一个一次性执行的命令
    • scale 设置服务的容器数量
    • start 启动服务
    • stop 停止服务
    • unpause 恢复一个暂停的服务
    • up 创建并启动一个容器
    • version 显示 compose 的版本信息

构建服务

可以选择基于已有的镜像或者 Dockerfile 进行重新构建,利用 docker-compose build 可进行构建操作,也可以指定 docker-compose build <service name> 来构建指定服务

创建服务

配置好 yml 文件后,通过 docker-compose create 创建配置文件中的所有服务,通过指定服务名来创建具体服务

拉取镜像

docker-compose pull 服务名,可以拉取指定服务的镜像

容器的运行/启动/停止

  • docker-compose run 服务名:运行服务
  • docker-compose start 服务名:启动服务
  • docker-compose stop 服务名:停止服务
  • docker-compose restart 服务名:重启服务

查看管理的容器列表

docker-compose ps 查看服务列表

查看日志

docker-compose logs 服务名:查看指定服务的日志信息

示例

yaml
# 版本号 version: "2.1" services: # 定义名为 nginx 的服务 nginx: # 指定使用的镜像为官方的 nginx 镜像 image: "nginx" # 指定容器的名称为 nginx_compose container_name: "nginx_compose" # 设置容器的重启策略为 always,表示无论容器退出的原因是什么,都会自动重启 restart: "always" # 将服务连接到名为 gycnet01 的自定义网络 networks: - gycnet01 # 挂载卷,映射到容器内部的 /usr/share/nginx/html 目录 volumes: - nginx_volume:/usr/share/nginx/html # 设置环境变量,用于容器内应用程序的配置 environment: APP_ENV: dev # 配置 DNS 服务器,指定容器使用 8.8.8.8 作为 DNS 解析器 dns: - 8.8.8.8 # ports: 将主机的 80 端口映射到容器的 80 端口 ports: - 80:80 # 配置网络 networks: # 定义一个名为 gycnet01 的自定义网络 gycnet01: # 使用默认的 bridge 驱动创建网络 driver: bridge # 配置 IP 地址管理(IPAM)设置 ipam: driver: default config: # 指定子网范围为 188.18.0.0/16 - subnet: 188.18.0.0/16 # 设置网络的默认网关为 188.18.0.1 gateway: 188.18.0.1 # 配置卷 volumes: # 定义一个名为 nginx_volume 的卷 nginx_volume: # 留空,使用默认的本地驱动
  • 使用docker compose scale <容器名称>=数量将会创建指定数量的容器
  • 需要修改yaml文件
yaml
services: nginx: image: "nginx" restart: "always" networks: - gycnet01 volumes: - nginx_volume:/usr/share/nginx/html environment: APP_ENV: dev dns: - 8.8.8.8 ports: - "80" networks: gycnet01: driver: bridge ipam: driver: default config: - subnet: 188.18.0.0/16 gateway: 188.18.0.1 volumes: nginx_volume:
  • ports: - 80:这里的端口映射将把宿主机的 80 端口映射到容器的 80 端口。需要注意的是,当您扩展多个容器时,只有第一个容器实例可以绑定到宿主机的 80 端口。后续容器将无法绑定到同一个宿主机端口,因为端口冲突会导致错误。

docker swarm(swarm)

swarm架构.png

Swarm 是 Docker 公司推出的用来管理 docker 集群的平台,几乎全部用GO语言来完成的开发的, 它是将一群 Docker 宿主机变成一个单一的虚拟主机,Swarm 使用标准的 Docker API 接口作为其前端的访问入口,换言之,各种形式的DockerClient(compose, docker-py 等) 均可以直接与 Swarm 通信,甚至 Docker 本身都可以很容易的与 Swarm 集成,这大大方便了用户将原本基于单节点的系统移植到 Swarm 上,同时Swarm 内置了对 Docker 网络插件的支持,用户也很容易的部署跨主机的容器集群服务。

Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,对于微服务的部署,显然 Docker Swarm 会更加适合。

从 Docker 1.12.0 版本开始,Docker Swarm 已经包含在 Docker 引擎中(docker swarm),并且已经内置了服务发现工具,我们就不需要像之前一样,再配置 Etcd 或者 Consul 来进行服务发现配置了。

Swarm deamon只是一个调度器(Scheduler)加路由器(router),Swarm自己不运行容器,它只是接受Docker客户端发来的请求,调度适合的节点来运行容器,这就意味着,即使Swarm由于某些原因挂掉了,集群中的节点也会照常运行,放Swarm重新恢复运行之后,他会收集重建集群信息。

关键概念

Swarm

集群的管理和编排是使用嵌入 docker 引擎的 SwarmKit,可以在docker 初始化时启动 swarm 模式或者加入已存在的 swarm

  • swarm 集群节点的管理命令:docker swarm --help
    • 初始化集群节点
    • 加入节点
    • 退出节点

Node

运行 Docker 的主机可以主动初始化一个 Swarm 集群或者加入一个已存在的 Swarm 集群,这样这个运行 Docker 的主机就成为一个 Swarm 集群的节点 (node) 。

节点分为管理 (manager) 节点和工作 (worker) 节点。

管理节点用于 Swarm 集群的管理,docker swarm 命令基本只能在管理节点执行(节点退出集群命令 docker swarm leave 可以在工作节点执行)。一个 Swarm 集群可以有多个管理节点,但只有一个管理节点可以成为 leader,leader 通过 raft 协议实现。通常,第一个启用docker swarm的节点将成为leader,后来加入的都是follower。当前的leader如果挂掉,剩余的节点将重新选举出一个新的leader。每一个manager都有一个完整的当前集群状态的副本,可以保证manager的高可用。

工作节点是任务执行节点,管理节点将服务 (service) 下发至工作节点执行。管理节点默认也作为工作节点。你也可以通过配置让服务只运行在管理节点。worker节点之间,通过control plane进行通信,这种通信使用gossip协议,并且是异步的。

来自 Docker 官网的这张图片形象的展示了集群中管理节点与工作节点的关系。

swarm-diagram.png

Task

任务 (Task)是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器。

Service

服务 (Services) 是指一组任务的集合,服务定义了任务的属性。服务有两种模式:

  • replicated services 按照一定规则在各个工作节点上运行指定个数的任务。

  • global services 每个工作节点上运行一个任务

  • 两种模式通过 docker service create 的 --mode 参数指定。

服务与任务的关系:

services-diagram.png

服务的生命周期:

service-lifecycle.png

应用实战

集群搭建

初始化集群

登录管理节点,并执行如下命令 docker swarm init --advertise-addr IP(192.168.113.120)

  • 使用 docker info 可以查看 swarm 集群状态

  • docker node ls 可以查看集群节点信息

image.png

增加工作节点

分别在两个工作节点上执行加入节点命令

docker swarm join \ -- token 集群初始化时的 token 信息 \ 192.168.113.120:2377

image.png

查看集群

  • 进入主节点,输入如下命令查看集群节点信息 docker node ls

image.png

部署服务

新建服务

进入主节点,创建一个 helloworld 服务 docker service create --replicas 1 -p 80:80 --name nginx_swarm nginx

image.png

  • 命令解释:

    • docker service create 创建一个服务
    • --name 设置服务名称
    • --replicas 设置启动多少个实例
  • 命令详解:

    • docker service create:这是 Docker Swarm 模式下创建服务的命令。服务是 Docker Swarm 中的一个重要概念,它允许你在多个节点上运行和管理容器。

    • --replicas 2:指定服务的副本数为 2。也就是说,这个服务会在集群中运行两个相同的 nginx 容器实例。

    • -p 80:80:这是端口映射的选项。第一个 80 是主机上的端口,第二个 80 是容器内的端口。这个映射意味着访问集群节点的端口 80 时,流量会被转发到容器内的 80 端口,也就是 nginx 默认的 HTTP 服务端口。

    • --name nginx_swarm:指定服务的名称为 nginx_swarm。你可以使用这个名字来管理或查询这个服务。

    • nginx:这是服务所运行的镜像名称。在这个例子中,nginx 是一个来自 Docker 官方镜像库的镜像,它会在容器中运行一个 Nginx Web 服务器。

  • 通过 docker service ps <service id> 可以查看服务信息

image.png

  • 通过 docker service ls 可以查看 Swarm 集群下运行的所有服务

image.png

监控集群状态

  • 查看服务信息: docker service inspect --pretty <service id> --pretty 参数可以简化输出内容

  • docker service ps <service id> 可以查看运行中的服务信息

image.png

  • 进入工作节点通过 docker ps 可以查看容器运行状态

image.png

弹性伸缩

调整实例个数

  • 更新服务的实例个数: docker service update --replicas <num> <service id/name>
bash
docker service update --replicas 1 nginx_swarm
  • 命令详解:
    • docker service update:用来更新 Docker Swarm 中已存在的服务

    • --replicas 1:设置服务的副本数为 1。这意味着该服务将运行一个容器实例

    • nginx_swarm:要更新的服务的名称。在这个例子中,服务的名称是 nginx_swarm

image.png

调整集群大小

  • 添加新的 Docker 节点,执行 docker swarm join 命令可以加入集群

  • 执行 docker swarm leave 可以退出集群,也可以带上 --force 参数强制退出集群

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:GYC

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!