Docker compose用来管理多容器应用。首先需要创建一个yaml格式的定义文件,看起来大概是下边这个样子:
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
关于如何编写compose文件,参考:https://docs.docker.com/compose/compose-file/
compose常用命令:
- Start, stop, and rebuild services
- View the status of running services
- Stream the log output of running services
- Run a one-off command on a service
特性
- 单主机多套环境隔离
- volume数据保持
- 仅配置变更时重新创建容器
- 多环境适配
单主机多套环境隔离
compose使用项目名称,能够在一台主机上隔离出多套环境,项目名称主要用在如下几个地方:
- 在某台开发用主机上,可以创建同一种环境的多份拷贝。如在相同环境下跑同一项目的不同分支
- 在持续集成服务中,通过项目名称为每次构建指定唯一标识。
- 同共享主机中避免不同项目之间的影响
volume数据保持
在compose中的容器启动之前,首先查看这个容器是否已经运行过,如果有则将旧容器使用的volume中的数据复杂到新容器中并启动。这个特性我觉得很奇怪。如果前边的容器已经结束运行,如何确保它占用的资源可能已经被系统回收。如果某个容器有多个实例,那么又如何从旧volume往新volume复制数据呢?它们之间的对应关系如何呢?如果新运行的容器实例个数有变化,又如何复制数据呢?
仅配置变更时重新创建容器
这个特性也不太好理解,如果配置不变更的话,只是重新启动旧的停止运行的容器,因为里边保持了一些运行过程中产生的状态,不创建新容器不是非常应该的事情吗?为什么要特别提出来?
多环境适配
定义compose文件时,可以像预编译一样定义变量、条件,以适应不同的环境。
常用用例
开发环境
compose能够为开发隔离出一套独立的环境,并且能够管理一个应用中的多个服务及它们之间的依赖关系,也可以通过单独的命令控制其中的某个特定服务,相当于把整个环境一起打包。
自动化测试
在持续集成、持续测试中使用比较多。能够随时动态的创建一套测试环境,运行完测试用例后,可以立刻将环境销毁。如:
总结:compose似乎比较关注开发、测试环境