Compose是用于定义和运行多容器Docker应用程序的工具。使用compose,可以使用yaml文件配置应用程序的服务。然后,通过一个命令,可以从配置中创建和启动所有服务。
因为dockfile建议的要求是一个镜像只允许一个程序,但是实际项目中,一个项目运行起来可能需要多个模板,多个程序一起运行,所以Docker官方就应社区要求,开发了docker-compose用来管理容器的一项容器编排技术。
编排(Orchestration)功能,是复杂系统是否具有灵活可操作性的关键。特别在Docker应用场景中,编排意味着用户可以灵活地对各种容器资源实现定义和管理。Compose作为Docker官方编排工具,其重要性不言而喻,它可以让用户通过编写一个简单的模板文件,快速地创建和管理基于Docker容器的应用集群。
Compose、Machine和Swarm合成为Docker三大剑客,但是随着发展,Machine和Swarm已经没落了,只保留下了三大剑客之一的Compose
Compose支持三平台Windows、Mac、Linux,安装方式各有不同。我这里使用的是Linux系统,其他系统安装方法可以参考官方文档和开源GitHub链接。安装Compose之前,要先安装Docker引擎.
Docker Compose官方文档链接
Docker Compose GitHub链接
Linux上有两种安装方法,Compose项目是用Python写的,可以使用Python-pip安装,也可以通过GitHub下载二进制文件进行安装。
Compose可以通过Python的pip工具进行安装,可以直接下载编译好的二进制文件使用,甚至直接运行在Docker容器中。前两种方式是传统方式,适合本地环境下安装使用;最后一种方式则不破坏系统环境,更适合云计算场景。
# 安装Python-pip
yum install -y epel-release
yum install -y python-pip
# 安装docker-compose
pip install docker-compose
# 验证是否安装
docker-compose version
# 卸载
pip uninstall docker-compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
如果在安装的时候出现如图所示错误,可以在指令后加上参数k,关闭证书验证即可
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose -k
chmod +x /usr/local/bin/docker-compose
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose version
rm /usr/local/bin/docker-compose
模板文件是使用Compose的核心,涉及的指令关键字也比较多。但大家不用担心,这里的大部分指令与docker [container] create|run相关参数的含义都是类似的。默认的模板文件名称为docker-compose.yml,格式为YAML格式,目前最新的版本为v3。
模板文件常用指令如下:
指定镜像名称或者镜像id,如果该镜像在本地不存在,Compose会尝试pull下来。例如:
image: ubuntu
image: orchardup/postgresql
image: a4bc65fd
指定Dockerfile所在文件夹的路径(可以是绝对路径,或者相对docker-compose.yml文件的路径)。Compose将会利用它自动构建应用镜像,然后使用这个镜像,例如:
version: '3'
services:
app:
build: /path/to/build/dir
build指令还可以指定创建镜像的上下文、Dockerfile路径、标签、Shm大小、参数和缓存来源等,例如:
version: '3'
services:
app:
build:
context: /path/to/build/dir
dockerfile: Dockerfile-app
labels:
version: "2.0"
released: "true"
shm_size: '2gb'
args:
key: value
name: myApp
cache_from:
- myApp:1.0
覆盖容器启动后默认执行的命令,可以为字符串格式或JSON数组格式。例如:
command: echo "hello world"
或者:
command: ["bash", "-c", "echo", "hello world"]
注意:links命令属于旧的用法,可能在后续版本中被移除。链接到其他服务中的容器。使用服务名称(同时作为别名)或服务名称:服务别名(SERVICE:ALIAS)格式都可以。
links:
- db
- db:database
- redis
使用的别名将会自动在服务容器中的/etc/hosts里创建。例如:
172.17.2.186 db
172.17.2.186 database
172.17.2.187 redis
被链接容器中相应的环境变量也将被创建。
暴露端口信息。使用宿主:容器(HOST:CONTAINER)格式,或者仅仅指定容器的端口(宿主将会随机选择端口)都可以。
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
或者:
ports:
- target: 80
published: 8080
protocol: tcp
mode: ingress
注意:
当使用HOST:CONTAINER格式来映射端口时,如果你使用的容器端口小于60并且没放到引号里,可能会得到错误结果,因为YAML会自动解析xx:yy这种数字格式为60进制。为避免出现这种问题,建议数字串都采用引号包括起来的字符串格式。
暴露端口,但不映射到宿主机,只被连接的服务访问。仅可以指定内部端口为参数,如下所示:
expose:
- “3000”
- “8000”
数据卷所挂载路径设置。可以设置宿主机路径(HOST:CONTAINER)或加上访问模式(HOST:CONTAINER:ro)。支持driver、driver_opts、external、labels、name等子配置。该指令中路径支持相对路径。例如:
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro
或者可以使用更详细的语法格式:
volumes:
- type: volume
source: mydata
target: /data
volume:
nocopy: true
volumes:
mydata:
设置网络模式。使用和docker client的–net参数一样的值。例如:
network_mode: "none"
network_mode: "bridge"
network_mode: "host"
network_mode: "service:[service name]"
network_mode: "container:[name or id]"
所加入的网络。需要在顶级的networks字段中定义具体的网络信息。例如,指定web服务的网络为web_net,并添加服务在网络中别名为web_app。例如:
services:
web:
networks:
web_net:
aliases: web_app
ipv4_address: 172.16.0.10
networks:
web_net:
driver: bridge
enable_ipv6: true
ipam:
driver: default
config:
subnet: 172.16.0.0/24
设置环境变量,可以使用数组或字典两种格式。只给定名称的变量会自动获取运行Compose主机上对应变量的值,可以用来防止泄露不必要的数据。例如:
environment:
RACK_ENV: development
SESSION_SECRET:
或者:
environment:
- RACK_ENV=development
- SESSION_SECRET
指定检测应用健康状态的机制,包括检测方法(test)、间隔(interval)、超时(timeout)、重试次数(retries)、启动等待时间(start_period)等。例如,指定检测方法为访问8080端口,间隔为30秒,超时为15秒,重试3次,启动后等待30秒再做检查。
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080"]
interval: 30s
timeout: 15s
retries: 3
start_period: 30s
指定重启策略,可以为no(不重启)、always(总是)、on-failure(失败时)、unless-stopped(除非停止)。注意Swarm模式下要使用restart_policy。在生产环境中推荐配置为always或者unless-stopped。例如,配置除非停止:
restart: unless-stopped
docker-compose.yml 还有很多其他模板文件命令,可以参考docker-compose.yml文件官方文档
对于Compose来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或者容器。如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务都会受到命令影响。执行docker-compose [COMMAND] --help或者docker-compose help [COMMAND]可以查看具体某个命令的使用格式。Compose命令的基本的使用格式是:
docker-compose [-f=…] [options] [COMMAND] [ARGS…]
docker-compose build [options] [SERVICE...]
构建(重新构建)项目中的服务容器。服务容器一旦构建后,将会带上一个标记名,例如对于Web项目中的一个db容器,可能是web_db。可以随时在项目目录下运行docker-compose build来重新构建服务。选项包括:
docker-compose config [options]
校验和查看Compose文件的配置信息。支持选项包括:
docker-compose exec [options] [-e KEY=VAL...] SERVICE COMMAND [ARGS...]
在一个运行中的容器内执行给定命令。支持选项包括:
docker-compose images [options] [SERVICE...]
列出服务所创建的镜像。支持选项为:
docker-compose logs [options] [SERVICE...]
查看服务容器的输出。默认情况下,docker-compose将对不同的服务输出使用不同的颜色来区分。可以通过–no-color来关闭颜色。该命令在调试问题的时候十分有用。支持选项为:
docker-compose pause [SERVICE...]
暂停一个服务容器。
docker-compose port [options] SERVICE PRIVATE_PORT
打印某个容器端口所映射的公共端口。选项:
docker-compose ps [options] [SERVICE...]
列出项目中目前的所有容器。选项包括
docker-compose pull [options] [SERVICE...]
拉取服务依赖的镜像。选项包括
docker-compose push [options] [SERVICE...]
推送服务创建的镜像到镜像仓库。选项包括
docker-compose restart [options] [SERVICE...]
重启项目中的服务。选项包括
docker-compose rm [options] [SERVICE...]
删除所有(停止状态的)服务容器。推荐先执行docker-compose stop命令来停止容器。选项:
docker-compose start [SERVICE...]
启动已经存在的服务容器。
docker-compose stop [options] [SERVICE...]
停止已经处于运行状态的容器,但不删除它。通过docker-compose start可以再次启动这些容器。选项包括
docker-compose version
打印版本信息。
docker-compose up [options] [SERVICE...]
该命令十分强大,它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。链接的服务都将会被自动启动,除非已经处于运行状态。
可以说,大部分时候都可以直接通过该命令来启动一个项目。默认情况,docker-compose up启动的容器都在前台,控制台将会同时打印所有容器的输出信息,可以很方便进行调试。当通过Ctrl-C停止命令时,所有容器将会停止。
如果使用docker-compose up -d,将会在后台启动并运行所有的容器。一般推荐生产环境下使用该选项。
默认情况,如果服务容器已经存在,docker-compose up将会尝试停止容器,然后重新创建(保持使用volumes-from挂载的卷),以保证新启动的服务匹配docker-compose.yml文件的最新内容。如果用户不希望容器被停止并重新创建,可以使用docker-compose up --no-recreate。这样将只会启动处于停止状态的容器,而忽略已经运行的服务。如果用户只想重新部署某个服务,可以使用docker-compose up–no-deps -d
参考文献