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)
图片.png
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

  1. ![图片.png](https://cdn.nlark.com/yuque/0/2021/png/153889/1630982123977-ac58aceb-f25e-4cdd-9537-6aecc2069b08.png#clientId=uf51944ae-1274-4&from=paste&height=286&id=uace79198&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%87.png&originHeight=431&originWidth=910&originalType=binary&ratio=1&size=32957&status=done&style=none&taskId=u3e688ceb-d943-4d7b-8206-1340076b373&width=603)
  2. ---
  3. <a name="B0iS5"></a>
  4. ## 3.docker compose使用
  5. 1.编辑`docker-compose.yml`文件
  6. docker-compost.yml文件内容
  7. ```bash
  8. version: "3"
  9. services:
  10. tomcat1:
  11. image: tomcat:8.0-jre8
  12. ports:
  13. - "8081:8081"

2.docker-compose up 启动
默认需要在运行命令的目录中存在docker-compost.yml文件,
当然也可以指定其他的路径的模板文件,通过docker-compose -f FILE 方式来指定
图片.png


4.docker-compose 模板文件

build

指定为构建镜像上下文路径:
例如 webapp 服务,指定为从上下文路径./dir/Dockerfile 所构建的镜像

  1. version: "3.7"
  2. services:
  3. webapp:
  4. build: ./dir

或者,作为具有在上下文指定的路径的对象,以及可选的 Dockerfile 和 args:

  1. version: "3.7"
  2. services:
  3. webapp:
  4. build:
  5. context: ./dir # 上下文路径
  6. dockerfile: Dockerfile-alternate # 指定构建镜像的 Dockerfile 文件名
  7. args: # 添加构建参数,这是只能在构建过程中访问的环境变量
  8. buildno: 1
  9. labels: # 设置构建镜像的标签。
  10. - "com.example.description=Accounting webapp"
  11. - "com.example.department=Finance"
  12. - "com.example.label-with-empty-value"
  13. target: prod # 多层构建,可以指定构建哪一层

command

覆盖容器启动后默认执行的命令

  1. command: echo "hello world"

container_name

指定容器名称。 默认将会使用 项目名称服务名称序号 这样的格式

  1. container_name: docker-web-container

注意: 指定容器名称后, 该服务将无法进行扩展(scale),因为Docker不允许多个容器具有相同的名称

depends_on

解决容器的依赖, 启动先后问题。 以下列子中会先启动 redis db再启动 web

  1. version: "3"
  2. services:
  3. web:
  4. build: .
  5. depends_on:
  6. - db
  7. - redis
  8. redis:
  9. image: redis
  10. db:
  11. image: postgres

注意: web服务不会等待 redis db 完全启动之后才启动。

env_file

从文件中获取环境变量, 可以为单独的文件路径或列表
如果通过 docker-compose -f FILE 方式来指定compose模板文件, 则 env_file中变量的路径会基于模板文件路径
如果有变量名称与environment指令冲突, 则按照惯例, 以后者为准。

  1. env_file: .env
  2. image: orchardup/postgresql
  3. image: a4bc65fd

environment

设置环境变量。 可以使用数组或者字典两种格式。
只给定名称的变量会自动获取运行 Compose主机山对应变量的值, 可以用来防止泄露不必要的数据。

  1. environment:
  2. RACK_ENV: development
  3. SESSION_SECRET:
  4. environment:
  5. - RACK_ENV=development
  6. - SESSION_SECRET

如果变量名称或者值中用到 true| false, yes|no 等表达 布尔含义的词汇, 最好放到引号里, 避免YAML 自动解析某些内容为对应的布尔语义。这些特定词汇,包括

  1. y|Y|yes|Yes|YES|n|N|noNo|No
  2. true|True|TRUE|false|False|FALSE|on|On| ON|off |off| OFF

healthcheck

通过命令检查容器是否健康运行。

  1. healthcheck:
  2. test:["CMD","curl", "-f", "http://localhost"]
  3. interval: 1m30s
  4. timeout: 10s
  5. retries: 3

image

指定为镜像名称或镜像ID. 如果镜像在本地不存在, Compose将会尝试拉取这个镜像。

  1. image: ubuntu
  2. image: orchardup/postgresql
  3. image: a4bc65fd

networks

配置容器连接的网络

  1. version: "3"
  2. services:
  3. some-service:
  4. - some-network
  5. - other-network
  6. networks:
  7. some-network:
  8. other-network:

ports

暴露端口信息
使用宿主端口:容器端口(HOST:CANTAINER)格式,或者仅仅制定容器的端口都可以。

  1. ports:
  2. - "3000"
  3. - "8080:8080"
  4. - "49100:22"
  5. - "1270.0.1:8001:8001"

注意: 当使用HOST:CANTAINER格式来映射端口时, 如果你使用的容器端口小于60并且没有放到引号里, 可能会得到错误结果。因为YAML会自动解析xx:yy这种数据格式为60进制。 为避免出现这种问题, 建议数字串都采用引号包括起来的字符串格式。

sysctls

配置容器内核参数

  1. sysctls:
  2. net.core.somaxconn: 1024
  3. net.ipv4.tcp_syncookies:0
  4. sysctls:
  5. net.core.somaxconn= 1024
  6. net.ipv4.tcp_syncookies=0

ulimits

指定容器的ulimits限制值。
例如, 指定最大进程数为65535, 指定文件句柄数为20000(软限制,应用可以随时修改,不能超过硬限制)和
40000(系统硬限制, 只能root用户提高。)

  1. ulimits:
  2. nproc:65535
  3. nofile:
  4. soft:20000
  5. hard:40000

volumes

数据卷所挂载路径设置。可以设置为宿主机路径(H0ST: CONTAINER)或者数据卷名称( VOLUME: CONTAINER),并且可以设置访问模式( HOST: CONTAINER: ro)

该指令中路径支持相对路径。

  1. volumes:
  2. - /var/lib/mysql
  3. - cache/:/tmp/cache
  4. - ~/configs:/etc/configs/:ro

如果路径为数据卷名称,必须在文件中配置数据卷。

  1. version: "3"
  2. services:
  3. my_src:
  4. image: mysql: 8.0
  5. volumes:
  6. - mysql_data: /var/lib/mysql
  7. volumes: # 声明上面服务所使用的自动创建的卷名
  8. mysql_data: # 声明指令的卷名

5.docker-compose 常用命令

1 命令对象与格式

对于 Compose来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或者容器。如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务都会受到命令影晌

执行 docker-compose [COMMAND] --help 或者 docker-compose help [ COMMAND] 可以查看具体某个命令的使用格式。

docker- compose命令的基本的使用格式是

  1. 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….]
恢复处于暂停状态中的服务。