容器编排:就是针对容器生命周期的管理,对容器的生命周期进行更快速方便的方式进行管理
- 依赖管理,当一个容器必须在另一个容器运行完成后,才能运行时,就需要进行依赖管理
- 副本数控制,容器有时候也需要集群,快的对容器集群进行弹性伸缩
- 配置共享,通过配置文件统一描述需要运行的服务相关信息,自动化的解析配置内容,并构建对应的服务
有的时候我们会需要涉及到在一台机器部署多个容器,那么此时再手动的每次输入相关的一堆配置命令再来启动容器,还是产生了很多无意义的重复性劳动。针对单机的多容器部署的情况,Docker 为我们提供了一个单机版本的服务编排工具 docker-compose
Docker-Compose 可以高效便捷的管理单机上运行的所有容器,它通过 yaml 配置文件的方式完成之前执行 docker run 命令所设置的所有参数,你可以先针对单机上的所有容器进行相关配置,配置完成后即可使用 docker-compose 对单机多容器进行高效的管理
docker-compose 的 api 版本与大版本一致,compose 版本与 docker 版本之间存在一定关联
Compose 版本 | Docker 版本 |
---|---|
3.4 | 17.09.0+ |
3.3 | 17.06.0+ |
3.2 | 17.04.0+ |
3.1 | 1.13.1+ |
3.0 | 1.13.0+ |
2.3 | 17.06.0+ |
2.2 | 1.13.0+ |
这个表格将 Compose 版本和相应的 Docker 版本进行了对比。
需要运行的容器配置,可以理解为原先用 docker run 命令后面跟的一系列配置信息,都陪在这个下面
docker-compose 公共自定义网络管理,配置好以后,可以直接在 services 中引用该网络配置,这个配置可以多个 service 使用
docker-compose 下的统一数据卷管理,可以给多个 service 使用
bashDefine 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)
可以选择基于已有的镜像或者 Dockerfile 进行重新构建,利用 docker-compose build 可进行构建操作,也可以指定 docker-compose build <service name> 来构建指定服务
配置好 yml 文件后,通过 docker-compose create 创建配置文件中的所有服务,通过指定服务名来创建具体服务
docker-compose pull 服务名,可以拉取指定服务的镜像
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 <容器名称>=数量
将会创建指定数量的容器yamlservices:
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:
架构图
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重新恢复运行之后,他会收集重建集群信息。
集群的管理和编排是使用嵌入 docker 引擎的 SwarmKit,可以在docker 初始化时启动 swarm 模式或者加入已存在的 swarm
运行 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 官网的这张图片形象的展示了集群中管理节点与工作节点的关系。
任务 (Task)是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器。
服务 (Services) 是指一组任务的集合,服务定义了任务的属性。服务有两种模式:
replicated services 按照一定规则在各个工作节点上运行指定个数的任务。
global services 每个工作节点上运行一个任务
两种模式通过 docker service create 的 --mode 参数指定。
服务与任务的关系:
服务的生命周期:
登录管理节点,并执行如下命令
docker swarm init --advertise-addr IP(192.168.113.120)
使用 docker info 可以查看 swarm 集群状态
docker node ls 可以查看集群节点信息
分别在两个工作节点上执行加入节点命令
docker swarm join \ -- token 集群初始化时的 token 信息 \ 192.168.113.120:2377
docker node ls
进入主节点,创建一个 helloworld 服务
docker service create --replicas 1 -p 80:80 --name nginx_swarm nginx
命令解释:
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>
可以查看服务信息
docker service ls
可以查看 Swarm 集群下运行的所有服务查看服务信息:
docker service inspect --pretty <service id>
--pretty
参数可以简化输出内容
docker service ps <service id>
可以查看运行中的服务信息
docker ps
可以查看容器运行状态docker service update --replicas <num> <service id/name>
bashdocker service update --replicas 1 nginx_swarm
docker service update
:用来更新 Docker Swarm 中已存在的服务
--replicas 1
:设置服务的副本数为 1。这意味着该服务将运行一个容器实例
nginx_swarm
:要更新的服务的名称。在这个例子中,服务的名称是 nginx_swarm
添加新的 Docker 节点,执行 docker swarm join
命令可以加入集群
执行 docker swarm leave
可以退出集群,也可以带上 --force
参数强制退出集群
本文作者:GYC
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!