什么是compose
Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。从功能上看,跟OpenStack 中的Heat 十分类似。其代码目前https://github.com/docker/compose 上开源。
Compose定位是定义和运行多个Docker容器的应用(Defining and running mult-container Docker applications)」,其前身是开源项目Fig。
通过第一部分中的介绍,我们知道使用一个Dockerfile 模板文件,可以让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个web项目,除了web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。Compose恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose. yml模板文件(YAML格式)来定义一组相关联的应用容器为一个项目(project)。
Compose中有两个重要的概念:
- 服务( service ):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
- 项目( project ):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml文件中定义。Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。
Compose项目由 Python编写,实现上调用了Docker服务提供的API来对容器进行管理。因此,只要所操作的平台支持 Docker APl,就可以在其上利用Compose来进行编排管理。
安装compose
linux版
- 直接去github上下载对应的二进制源码文件,放入
/usr/bin
目录下,改名为docker-compose
即可
- 不要忘记了,赋予可执行权限,执行
docker-compose -v
如果可以看到compose的版本信息,则表示安装完成
docker-compose
启动
docker-compose根据提供docker-compse文件,来启动一组服务(容器)
# 根据当前目录下的docker-compose.yml文件,启动一组容器,以前台的方式启动
docker-compose up
启动完成后,不同容器的日志内容,会通过不同的标签颜色来区分
# 根据当前目录下的docker-compose.yml文件,启动一组容器,以后台服务的方式启动
docker-compose up -d
以后台的方式启动,并不会打印容器的日志等信息
docker-compose文件(模板)
docker-compose文件参考文档
docker-compose.yml
文件用来描述一个项目里面,所有的容器信息,例如:expose
,volumes
,images
等容器关键信息
注意要点:
- docker-compose文件默认是yml结尾,YAML文件格式
- docker-compose文件同样也支持json格式的文件,以json结尾的文件
- 无论是yml文件,还是json文件,推荐里面所有的数字信息都以双引号包括起来,以字符串的形式使用
version
推荐的version应该在3.0-4.0
services
在docker-compose中,可以启动多个服务,在services下指定多个服务(容器)信息
启动一个或多个容器
build(从给定Dockerfile文件构建)
指定 Dockerfile 所在文件夹的路径(可以是绝对路径,或者相对 docker-compose.yml 文件的路径)。 Compose 将会利用它自动构建这个镜像,然后使用这个镜像。
version: '3'
services:
webapp:
build:
# context 指令指定 Dockerfile 所在文件夹的路径。
context: ./dir
# 指定dockerfile文件的名称。官方默认Dockerfile,但是有时候我们会自定义文件名称
dockerfile: Dockerfile-alternate
# 使用 arg 指令指定构建镜像时的变量。
args:
buildno: 1
container_name
相当于
run --name
为当前容器指定一个名称,方便容器之间通过容器名就可以直接调用
image
指定当前服务(容器)从哪个镜像构建的
services:
tomcat:
image:"tomcat:9.0" # 代表这从tomcat:9.0构建的
ports(映射端口)
指定当前服务如何映射端口 ,接受一个数组,每个数组元素前必须加“-”符号
services:
tomcat:
ports:
- "8080:8080"
- "80:8080"
# 代表tomcat服务将8080端口映射到宿主机上的8080,80端口
environment
添加环境变量。您可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 True 或 False。
语法示例
environment:
RACK_ENV: development
SHOW: 'true'
env_file(从指定的文件中加载环境变量)
- 从文件中获取环境变量,可以为单独的文件路径或列表。
- 如果通过 docker-compose -f FILE 方式来指定 Compose 模板文件,则 env_file 中变量的路径会基于模板文件路径。
官方规定,env_file的后缀名必须是.env
结尾,在服务里可以指定多个环境文件,所以接受数组类型
services:
tomcat:
container_name:"tomcat01"
env_file:
- "./common.env"
- "./apps/web.env"
- "/opt/secrets.env"
环境变量文件中每一行必须符合格式,支持 # 开头的注释行。
# common.env: Set development environment
PROG_ENV=development
# 例如
MYSQL_ROOT_PASSWORD=123456
depends_on(设置容器依赖的服务的启动顺序)
解决容器的依赖、启动先后的问题。以下例子中会先启动
redis
db
再启动web
version: '3'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
command
覆盖容器启动时的命令
healthcheck (通过命令检查容器是否健康运行)
services:
web:
image:"tomcat"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
mem_limit(配置服务可以使用内存的上限)
services:
web:
image: "tomcat"
mem_limit: "2GB"
sysctls(配置容器内核参数)
sysctls:
net.core.somaxconn: 1024
net.ipv4.tcp_syncookies: 0
sysctls:
- net.core.somaxconn=1024
- net.ipv4.tcp_syncookies=0
ulimits(指定容器的 ulimits 限制值。)
例如,指定最大进程数为 65535,指定文件句柄数为 20000(软限制,应用可以随时修改,不能超过硬限制) 和 40000(系统硬限制,只能 root 用户提高)。
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
volumes
设置数据卷挂载,可以设置为宿主机路径(
host:container
)或者数据卷名称(volume:container
),并且可以设置访问模式
同样也是接受一个数组参数
services:
tomcat:
volumes:
- "/usr/webapps:/usr/local/tomcat/webapps:ro"
- "volume:/usr/local/tomcat/webapps"
注意:
- 如果路径为数据卷名称,必须在文件中配置数据卷
- 如果需要使用已经存在的数据卷,不需要自动创建,需要在
volumes
中声明卷,然后设置external
属性为true
networks
定义声明,服务们所需要使用的网桥(网络),例如多个容器需要在同一个网络内,并且之间可以相互通信