1.简介
Compose 项目是 Docker官方的开源项目,负责实现对 Docker容器集群的快速编排。从功能上看,跟 OpenStackt中的Heat 十分类似。其代码目前在https://github.com/docker/compose上开源。
Compose定位是「定义和运行多个 Docker容器的应用( Defining and running multi-container Docker applications)」,其前身是开源项目Fig。
通过第一部分中的介绍,我们知道使用一个 Dockerfile模板文件,可以让用户很方便的定义一个单独的应用容器。
然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。
例如要实现一个Web项目,除了Web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等
Compose恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml模板文件(AM格式)来定义一组相关联的应用容器为一个项目(project)
Compose中有两个重要的概念:
- 服务( service): 一个应用的容器, 实际上可以包括若干运行相同镜像的容器实例
- 项目( project): 由一组关联的应用容器组成的一个完整业务单元,在
docker-compose.yml文件中定义。
Compose的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。
Compose项目由 Python编写, 实现上调用了 Docker服务提供的AP来对容器进行管理。因此,只要所操作的平台支持 Docker APl,就可以在其上利用 Compose来进行编排管理。
2.安装与卸载
1.inux
- 在Linux上的也安装十分简单,从官方 Github release处直接下载编译好的二进制文件即可。例如,在 Linux64位系统上直接下载对应的二进制包。 ```bash yum update curl
2.下载
sudo curl -L https://github.com/docker/compose/releases/download/1.25.5/docker-compose-`uname -s-uname -m` -o /usr/local/bin/docker-compose
3.安装
chmod +x /usr/local/bin/docker-compose
4. 检查版本
docker-compose version
---<a name="B0iS5"></a>## 3.docker compose使用1.编辑`docker-compose.yml`文件docker-compost.yml文件内容```bashversion: "3"services:tomcat1:image: tomcat:8.0-jre8ports:- "8081:8081"
2.docker-compose up 启动
默认需要在运行命令的目录中存在docker-compost.yml文件,
当然也可以指定其他的路径的模板文件,通过docker-compose -f FILE 方式来指定
4.docker-compose 模板文件
build
指定为构建镜像上下文路径:
例如 webapp 服务,指定为从上下文路径./dir/Dockerfile 所构建的镜像
version: "3.7"services:webapp:build: ./dir
或者,作为具有在上下文指定的路径的对象,以及可选的 Dockerfile 和 args:
version: "3.7"services:webapp:build:context: ./dir # 上下文路径dockerfile: Dockerfile-alternate # 指定构建镜像的 Dockerfile 文件名args: # 添加构建参数,这是只能在构建过程中访问的环境变量buildno: 1labels: # 设置构建镜像的标签。- "com.example.description=Accounting webapp"- "com.example.department=Finance"- "com.example.label-with-empty-value"target: prod # 多层构建,可以指定构建哪一层
command
覆盖容器启动后默认执行的命令
command: echo "hello world"
container_name
指定容器名称。 默认将会使用 项目名称服务名称序号 这样的格式
container_name: docker-web-container
注意: 指定容器名称后, 该服务将无法进行扩展(scale),因为Docker不允许多个容器具有相同的名称
depends_on
解决容器的依赖, 启动先后问题。 以下列子中会先启动 redis db再启动 web
version: "3"services:web:build: .depends_on:- db- redisredis:image: redisdb:image: postgres
注意: web服务不会等待 redis db 完全启动之后才启动。
env_file
从文件中获取环境变量, 可以为单独的文件路径或列表
如果通过 docker-compose -f FILE 方式来指定compose模板文件, 则 env_file中变量的路径会基于模板文件路径
如果有变量名称与environment指令冲突, 则按照惯例, 以后者为准。
env_file: .envimage: orchardup/postgresqlimage: a4bc65fd
environment
设置环境变量。 可以使用数组或者字典两种格式。
只给定名称的变量会自动获取运行 Compose主机山对应变量的值, 可以用来防止泄露不必要的数据。
environment:RACK_ENV: developmentSESSION_SECRET:environment:- RACK_ENV=development- SESSION_SECRET
如果变量名称或者值中用到 true| false, yes|no 等表达 布尔含义的词汇, 最好放到引号里, 避免YAML 自动解析某些内容为对应的布尔语义。这些特定词汇,包括
y|Y|yes|Yes|YES|n|N|noNo|Notrue|True|TRUE|false|False|FALSE|on|On| ON|off |off| OFF
healthcheck
通过命令检查容器是否健康运行。
healthcheck:test:["CMD","curl", "-f", "http://localhost"]interval: 1m30stimeout: 10sretries: 3
image
指定为镜像名称或镜像ID. 如果镜像在本地不存在, Compose将会尝试拉取这个镜像。
image: ubuntuimage: orchardup/postgresqlimage: a4bc65fd
networks
配置容器连接的网络
version: "3"services:some-service:- some-network- other-networknetworks:some-network:other-network:
ports
暴露端口信息
使用宿主端口:容器端口(HOST:CANTAINER)格式,或者仅仅制定容器的端口都可以。
ports:- "3000"- "8080:8080"- "49100:22"- "1270.0.1:8001:8001"
注意: 当使用HOST:CANTAINER格式来映射端口时, 如果你使用的容器端口小于60并且没有放到引号里, 可能会得到错误结果。因为YAML会自动解析xx:yy这种数据格式为60进制。 为避免出现这种问题, 建议数字串都采用引号包括起来的字符串格式。
sysctls
配置容器内核参数
sysctls:net.core.somaxconn: 1024net.ipv4.tcp_syncookies:0sysctls:net.core.somaxconn= 1024net.ipv4.tcp_syncookies=0
ulimits
指定容器的ulimits限制值。
例如, 指定最大进程数为65535, 指定文件句柄数为20000(软限制,应用可以随时修改,不能超过硬限制)和
40000(系统硬限制, 只能root用户提高。)
ulimits:nproc:65535nofile:soft:20000hard:40000
volumes
数据卷所挂载路径设置。可以设置为宿主机路径(H0ST: CONTAINER)或者数据卷名称( VOLUME: CONTAINER),并且可以设置访问模式( HOST: CONTAINER: ro)
该指令中路径支持相对路径。
volumes:- /var/lib/mysql- cache/:/tmp/cache- ~/configs:/etc/configs/:ro
如果路径为数据卷名称,必须在文件中配置数据卷。
version: "3"services:my_src:image: mysql: 8.0volumes:- mysql_data: /var/lib/mysqlvolumes: # 声明上面服务所使用的自动创建的卷名mysql_data: # 声明指令的卷名
5.docker-compose 常用命令
1 命令对象与格式
对于 Compose来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或者容器。如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务都会受到命令影晌
执行 docker-compose [COMMAND] --help 或者 docker-compose help [ COMMAND] 可以查看具体某个命令的使用格式。
docker- compose命令的基本的使用格式是
docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
2 命令选项
- -f, -file FILe 指定使用的 Compose模板文件, 默认为 docker- compose.yml,可以多次指定。
- -p, -project-name NAME 指定项目名称,默认将使用所在目录名称作为项目名。
- —x-networking使用 Docker的可拔插网络后端特性
- -x-network-driver DRIVER指定网络后端的驱动,默认为 bridge
- —verbose 输出更多调试信息。
- -v,—version 打印版本井退出
3 命令使用说明
up
格式为 docker- compose up[ options] [ SERVICE…]
- 该命令十分强大,它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。
- 连接的服务都将会被自动启动,除非已经处于运行状态
- 可以说,大部分时候都可以直接通过该命令来启动一个项目。
- 默认情况, docker- compose up启动的容器都在前台,控制台将会同时打印所有容器的翰出信息,可以很方使进行调试。
- 当通过ctr1-C停止命令时,所有容器将会停止
- 如果使用 docker- compose up-d,将会在后台启动并运行所有的容器。一般推荐生产环境下使用该选项。
- 默认情况,如果服务容器已经存在, docker- compose up将会尝试停止容器,然后重新创建(保持使用 volumes-from挂载的卷),以保证新启动的服务匹配 docker- compose.yml 文件的最新内容
down
- 此命令将会停止up命令所启动的容器, 并移除网络
exec
- 进入指定的容器
ps
格式为 docker-compose ps [options] [SERVICE….]
列出项目中目前的所有容器。
选项:
- -q 只打印容器的ID信息。
restart
格式为 docker-compose restart [options] [SERVICE….]
重启项目中的服务
选项:
- -t, —timeout TIMEOUT 指定重启前停止容器的超时(默认为10秒)。
rm
格式为 docker-compose rm [options] [SERVICE….]
删除所有(停止状态的)服务容器。 推荐先执行 docker-compost stop 命令来停止容器
选项:
- -f, —force 强制直接删除, 包括非停止状态的容器。 一般尽量不使用
- -v 删除容器所挂在的数据卷
start
格式为 docker-compose start [SERVICE….]
启动已经存在的服务容器。
stop
格式为 docker-compose stop [options] [SERVICE….]
停止已经处于运行状态的容器, 但不删除它。 通过docker-compose start 可以再次启动这些容器。
选项:
- -t, —timeout TIMEOUT 停止容器时候的超时(默认为10秒)
top
查看各个服务容器内运行的进程。
unpause
格式为 docker-compose unpause [SERVICE….]
恢复处于暂停状态中的服务。
