一、简介
由Docker引领先锋,容器在过去的一年里得到了飞速发展。容器技术提供了组件化环境,帮助应用在云之间轻松迁移而无需显著的返工。当谈到构建云以及非云的应用时,容器的战斗口号是可移植性和简单性。
随着容器在企业持续获得发展,厂商将增加新的功能让用户可以创建可扩展的基于容器的环境,这些功能很大程度上都集中于容器编排上。
容器编排工具提供调度和集群的技术,提供用于基于容器应用可扩展性的基本机制。这些工具使用容器服务,并编排他们以决定容器之间如何进行交互。此外,编排允许容器可以存在并执行在集群上,这使得他们能够扩展来适应增加的处理负荷。
docker-compose是docker官方提供的容器编排工具,但市面上使用得较多的容器编排工具是k8s。什么是容器编排?容器编排就是管理宿主机部署容器的过程。docker-compose 只支持单机多容器部署,通过yml文件配置你自己的服务,然后通过一个命令,你能使用配置文件创建和运行所有的服务,重点可以启动多个容器!!!
二、安装
2.1 版本选择
我们所选择的docker-compose版本要和docker engine版本对应:友情链接
2.2 下载
在 Linux 系统上将 Compose 安装为独立的二进制文件
- 运行以下命令下载 Docker Compose 的当前稳定版本:
curl -SL https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
- 对二进制文件应用可执行权限:
chmod +x /usr/local/bin/docker-compose
- 测试安装:
docker-compose --version
三、原理
Compose 项目是由Python编写的,实际上就是调用了Docker服务提供的API来对容器进行管理,因此,只要所在的操作系统的平台支持Docker API,就可以在其上利用Compose来进行编排管理。
compose 中常常提及的概念:
project
通过 docker compose 管理的一个项目被抽象称为一个 project,它是由一组关联的应用容器组成的一个完整的业务单元。简单点说就是一个 docker-compose.yml 文件定义一个 project。
我们可以在执行 docker-compose 命令时通过 -p 选项指定 project 的名称,如果不指定,则默认是 docker-compose.yml 文件所在的目录名称。
service
运行一个应用的容器,实际上可以是一个或多个运行相同镜像的容器。可以通过 docker-compose up 命令的 --scale 选项指定某个 service 运行的容器个数,比如:
docker-compose up -d --scale redis=2
了解了上面的基本概念之后,让我们一起看看 compose 的一次调用流程:
右上角的 docker-compose 定义了一组 service 来组成一个 project,通过 docker-compose.yml 中 service 的定义与 container 建立关系(service 与容器的对应关系),最后使用 container 来完成对 docker-py(Python 版的 docker client) 的调用,向 docker daemon 发起 http 请求。
注意,这里的 project, service 和 container 对应的都是 docker-compose 实现中的数据结构。下面让我们结合上图来介绍 docker-compose 工作的大致流程。
首先,用户执行的 docker-compose up 命令调用了命令行中的启动方法,功能非常简单。一个 docker-compose.yml 文件定义了一个 project,docker-compose up 提供的命令行参数则作为这个 project 的启动参数交由 project 模块处理。
然后,如果当前宿主机已经存在与该应用对应的容器,docker-compose 则进行行为逻辑判断。如果用户指定可以重新启动已有服务,docker-compose 就会执行 service 模块的容器重启方法,否则就直接启动已有容器。这两种操作的区别在于前者会停止旧的容器,创建并启动新的容器,并把旧容器移除掉。在这个过程中创建容器的各项自定义参数都是从 docker-compose up 命令和 docker-compose.yml 中传入的。
接下来,启动容器的方法也很简洁,这个方法中完成了一个 docker 容器启动所需的主要参数的封装,并在 container 模块执行启动。
最后,contaier 模块会调用 docker-py 客户端来执行向 docker daemon 发起创建容器的 POST 请求。
由此可见 docker-compose 工作的整体流程非常清晰、简洁!
重新启动 services
前面我们提到当前宿主机已经存在与该应用对应的容器,docker-compose 会进行判断并决定是否重新启动已有服务。
强制 recreate
Recreate 就是删除现有的容器并且重新创建新的容器,为 docker-compose up 命令指定 --force-recreate 选项可以强制 recreate 容器。
创建个别容器
如果应用中的个别 service 对应的容器被删除了,docker-compose up 命令会新建相关的容器。
启动个别容器
与上面类似,如果应用中的个别 service 对应的容器被停止(stop)了,docker-compose up 命令会重新启动相关的容器。
四、常用命令
命令 注释
命令 |
注释 |
docker-compose -h | 查看帮助 |
docker-composeup | 启动所有docker-compose服务 |
docker-composeup -d |
启动所有docker-compose服务并后台运行 |
docker-composedown |
停止并删除容器、网络、卷、镜像 |
docker-composeexec ${yml内服务的id} /bin/bash | 进入容器实例内部 |
docker-composeps | 展示当前docker-compose编排过的运行的所有容器 |
docker-composetop | 展示当前docker-compose编排过的容器进程 |
docker-composelogs ${yml内服务的id} | 查看容器输出日志 |
docker-composeconfig | 检查配置 |
docker-composeconfig -q |
检查配置,有问题才输出 |
docker-composerestart | 重启服务 |
docker-composestart | 启动服务 |
docker-composestop |
停止服务 |
Compose 大部分命令的对象即可以是项目的本身,也可以是指定为项目中的服务或者容器
执行docker-compose [COMMAND] --help 或者docker-compose help [COMMAND]可以查看命令的帮助信息
具体的使用格式
docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS]
参数选项
1 | 2 |
-f,--file | file指定模板文件,默认是docker-compose.yml模板文件,可以多次指定 |
-p,--project-name |
name指定项目名称,默认使用所在目录名称作为项目名称 |
--x-networking | 使用Docker的后端可插拔网络特性 |
--x-networking-driver | driver指定网络的后端驱动,默认使用bridge |
--verbose | 输入更多的调试信息 |
-v,--version | 输出版本信息 |
Compose所支持的命令
1 | 1 |
build | Build or rebuild services (构建项目中的服务容器) |
bundle | Generate a Docker bundle from the Compose file (从Compose文件生成分布式应用程序包) |
config | Validate and view the Compose file (验证并查看Compose文件) |
create | Create services (为服务创建容器) |
down | Stop and remove containers, networks, images, and volumes (停止容器并删除由其创建的容器,网络,卷和图像up) |
events | Receive real time events from containers (为项目中的每个容器流式传输容器事件) |
exec | Execute a command in a running container (这相当于docker exec。使用此子命令,您可以在服务中运行任意命令。默认情况下,命令分配TTY,因此您可以使用命令docker-compose exec web sh来获取交互式提示。) |
help | Get help on a command (获得一个命令的帮助) |
images | List images () |
kill | Kill containers (通过发送SIGKILL信号来强制停止服务容器) |
logs | View output from containers (查看服务容器的输出) |
pause | Pause services (暂停一个容器) |
port | Print the public port for a port binding (打印某个容器端口所映射的公共端口) |
ps | List containers (列出项目中目前所有的容器) |
pull | Pull service images (拉取服务依赖镜像) |
push | Push service images (推送服务镜像) |
restart | Restart services (重启项目中的服务) |
rm | Remove stopped containers (删除所有停止状态的服务容器) |
run | Run a one-off command (在指定服务上执行一个命令) |
scale | Set number of containers for a service (设置指定服务执行的容器个数) |
start | Start services (启动已存在的服务容器) |
stop | Stop services (停止已存在的服务容器) |
top | Display the running processes (显示容器正在运行的进程) |
unpause | Unpause services (恢复处于暂停状态的容器) |
up | Create and start containers (自动完成包括构建镜像、创建服务、启动服务并关联服务相关容器的一系列操作) |
version | Show the Docker-Compose version information (输出版本) |
五、实战
编写docker-compose.yml
version: "3" services: ossa-service-producer: image: ossa-service-producer-9001 container_name: ossa-service-producer-9001 ports: - "9001:9001" volumes: - /app/ossa-service-producer:/data networks: - ossa_net depends_on: - nacos - sentinel nacos: image: ossa-nacos ports: - "8848:8848" - "9848:9848" volumes: - /app/nacos:/data networks: - ossa_net command: sentinel: image: ossa-sentinel ports: - "8858:8858" volumes: - /app/sentinel:/data networks: - ossa_net command:
修改项目中的相关配置文件
server: port: 9001 spring: application: name: ossa-service-producer cloud: nacos: # nacos踩坑:docker run --name nacos -itd -e MODE=standalone -p 8848:8848 -p 9848:9848 nacos/nacos-server:v2.0.3 discovery: server-addr: nacos:8848 namespace: a3915605-1084-43cb-911e-d206afa6c032 group: DEV_GROUP config: server-addr: nacos:8848 file-extension: yml refresh-enabled: true group: DEV_GROUP namespace: a3915605-1084-43cb-911e-d206afa6c032 sentinel: transport: dashboard: sentinel:8858 port: 8719 # clientIp: 127.0.0.1
执行配置文件检查
有问题修改,没问题执行yml文件
docker-compose up -d
此时查看我们的docker网络
docker network ls
会发现我们的自定义的网络名字ossa_net变成了docker-compose-test_ossa_net
「对于网络名称,会在自定的网络前加上当前文件夹名字+_,对于没有指定容器名字的服务,会在服务的前面加上当前文件夹名字+_,在后面加上数字1,如存在1,则递增」
最后,停止服务
docker-compose stop
文献参考:
徐珉. Docker环境下容器编排工具的选择. 《 集成电路应用 》 , 2017