1. docker-compose是什么,应用场景是什么
compose是用于定义和运行多个container的工具,可以参考类比vagrant。
我们可以通过一个YAML文件定义和配置多个容器,然后通过docker-compose一条命令,将这些容器运行起来。
典型的compose用法如下:
1. 通过定义Dockerfile,配置我们的应用,例如:nginx,db,redis等等
2. 通过docker-compose.yml中定义services,将上边定义的container组织在一起
3. 运行docker-compose up命令,启动所有应用的container,得到一个完整的可用环境
一个典型的docker-compose.yml看起来会像下边的例子的样子:
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
-
logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
实际中,我觉得compose最适合给开发人员配环境用。
一是运维配置好以后,开发只要一条命令即可得到完整的开发环境,简洁高效。
二是再也不会有“代码在我这跑的好好的呀,一定是你的环境哪有问题”这种话。
2. docker-compose的安装
官方有可执行文件直接下载,不过我更推荐使用pip来安装,更方便之后的升级管理。
]# pip install docker-compose
安装compose的命令自动补齐
]# curl -L
https://raw.githubusercontent.com/docker/compose/1.21.0/contrib/completion/bash/docker-compose
-o /etc/bash_completion.d/docker-compose
]# source ~./bash_profile
4. 多个compose-file的用法
compose支持使用“-f”指定多个compose配置文件,形式如下:
]# docker-compose -f docker-compose.yml -f
docker-compose.admin.yml run backup_db
docker-compose命令至少需要指定docker-compose.yml。
如果不指定“-f”参数,compose会在当前工作目录,及工作目录的上级目录中自动寻找名为docker-compose.override.yml的文件。
多个”-f“指定的compose-file,会合被并成一个文件,合并的原则是“Adding and
overriding”。
“-f”指定的文件路径,必须是相对于docker-compose.yml的位置。
所谓”Adding and
overriding“,是指按命令行输入”-f“的顺序,后边的文件覆盖前边文件的配置。
例1:覆盖的例子
# docker-compose.yml中的配置
command: python app.py
# “-f” 指定的docker-compose.override.yml中的配置
command: python otherapp.py
# 合并后的结果,后边覆盖前边
command: python otherapp.py
例2:追加的例子
对于具有多个值的选项如 ports, expose, external_links, dns, dns_search,
tmpfs, compose会将两个文件中的值连接为一体:
# docker-compose.yml中的配置
expose:
- "3000"
# “-f” 指定的docker-compose.override.yml中的配置
expose:
- "4000"
- "5000"
# 合并后的结果,两者追加合并在一起
expose:
- "3000"
- "4000"
- "5000"
例3: 追加和合并的例子
对于 environment, labels, volumes,
devices这些选项,compose在追加合并的时候,后边的override文件定义的值具有优先权。
# docker-compose.yml中的配置
environment:
- FOO=original
- BAR=original
# “-f” 指定的docker-compose.override.yml中的配置
environment:
- BAR=local
- BAZ=local
# 合并后的结果,两者追加合并在一起,BAR=local具有优先权
environment:
- FOO=original
- BAR=local
- BAZ=local
例4:volumes和 devices 选项使用在container中的mount路径合并
# docker-compose.yml中的配置
volumes:
- ./original:/foo
- ./original:/bar
# “-f” 指定的docker-compose.override.yml中的配置
volumes:
- ./local:/bar
- ./local:/baz
# 合并后的结果,两者追加合并在一起
volumes:
- ./original:/foo
- ./local:/bar
- ./local:/baz
通过使用多个docker-compose文件,我们可以在生产,测试,UAT间进行切换,可以参考docker官网的例子。
5.docker-compose中的网络配置
默认情况下,compose
file中的所有container会加入compose创建的同一个网络,并且可已通过主机名进行服务发现。
举例来说:docker-compose.yml配置如下:
version: "3"
services:
web:
build: .
ports:
-
"8000:8000"
db:
image: postgres
ports:
-
"8001:5432"
当我们运行 docker-compose up 以后:
一个名为myapp_default的网络被创建
一个使用web配置的container被创建,其使用web作为名字,加入myapp_default网络
一个使用db配置的container被创建,其使用db作为名字,加入myapp_default网络
现在每个container都可以通过查询主机名 web 或者 db 来获取对应container的IP地址。