Docekr三剑客之 Docekr compose

时间:2022-06-14 00:46:49

写在前面

Docker三剑客Docker Compose、Docker Machine、Docker Swarm分别是Docker官方开源的三个项目。有着不同的功能:

  1. Docker Compose负责实现对 Docker 容器集群的快速编排
  2. Docker Machine负责在多种平台上快速安装 Docker 环境
  3. Docker Swarm提供 Docker 容器集群服务,是 Docker 官方对容器云生态进行支持的核心方案

今天这篇文章我们来聊聊Docker compose,这部分我们会分为三篇文章来分别介绍。

一、什么是Docker compose

Compose 项目是Docker官方的开源项目,负责实现Docker容器集群的快速编排,开源代码在https://github.com/docker/compose 上

我们知道使用Dockerfile模板文件可以让用户很方便的定义一个单独的应用容器,其实在工作中,经常会碰到需要多个容器相互配合来完成的某项任务情况,例如工作中的web服务容器本身,往往会在后端加上数据库容器,甚至会有负责均衡器,比如LNMP服务

Compose 就是来做这个事情的,它允许用户通过一个单独的docker-compose.yml模板文件(YAML格式)来定义一组相关联的应用容器为一个项目(project)

Compose 中有两个重要的概念:
  服务(service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例
  项目(project):由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml中定义

Compose 项目是由Python编写的,实际上就是调用了Docker服务提供的API来对容器进行管理,因此,只要所在的操作系统的平台支持Docker API,就可以在其上利用Compose来进行编排管理.

二、安装和卸载

2.1 安装

在 Linux 上的也安装十分简单,从 GitHub Release 处直接下载编译好的二进制文件即可。
例如,在 Linux 64 位系统上直接下载对应的二进制包。

// 先把docker-compose文件dump到当前目录
wget https://github.com/docker/compose/releases/download/v2.12.2/docker-composelinux-x86_64
// 然后拷贝到/usr/bin/
$ sudo cp -arf docker-compose-linux-x86_64 /usr/bin/docker-compose
$ sudo chmod +x /usr/bin/docker-compose

2.1 卸载

如果是二进制包方式安装的,删除二进制文件即可。

sudo rm /usr/bin/docker-compose

三、常用命令

命令官方详细文档戳这里

3.1 命令对象及格式

对于 Compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或者容器。如
果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务都会受到命令影响。
执行 docker-compose [COMMAND] --help 或者 docker-compose help [COMMAND] 可以查看具体某个
命令的使用格式。
docker-compose 命令的基本的使用格式是

docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]

3.2 常用选项

  1. -f, --file FILE 指定使用的 Compose 模板文件,默认为 docker-compose.yml ,可以多次指定
  2. -p, --project-name NAME 指定项目名称,默认将使用所在目录名称作为项目名。

3.3 使用说明

3.3.1 build

构建或重新构建项目中service的镜像。构建之后镜像不会被应用到容器,必须将项目down之后,再重
新up方能使用最新镜像。构建的镜像会被加上项目名称的前缀
选项包括:
–force-rm 删除构建过程中的临时容器。
–no-cache 构建镜像过程中不使用 cache(这将加长构建过程)。
–pull 始终尝试通过 pull 来获取更新版本的镜像。
–build-arg 设置构建参数

3.3.2 config

验证 Compose 文件格式是否正确,若正确则显示配置,若格式错误显示错误原因。

3.3.3 up&down

up命令十分强大,它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容
器的一系列操作。
链接的服务都将会被自动启动,除非已经处于运行状态。
可以说,大部分时候都可以直接通过该命令来启动一个项目。
默认情况, docker-compose up 启动的容器都在前台,控制台将会同时打印所有容器的输出信息,可
以很方便进行调试。
当通过 Ctrl-C 停止命令时,所有容器将会停止。
如果使用 docker-compose up -d ,将会在后台启动并运行所有的容器。一般推荐生产环境下使用该选
项。
默认情况,如果服务容器已经存在, docker-compose up 将会尝试停止容器,然后重新创建(保持使
用 volumes-from 挂载的卷),以保证新启动的服务匹配 docker-compose.yml 文件的最新内容。如
果用户不希望容器被停止并重新创建,可以使用 docker-compose up --no-recreate 。这样将只会启动
处于停止状态的容器,而忽略已经运行的服务。如果用户只想重新部署某个服务,可以使用 dockercompose up --no-deps -d <SERVICE_NAME> 来重新创建服务并后台停止旧服务,启动新服务,并不会
影响到其所依赖的服务。
选项:
-d 在后台运行服务容器。
–no-color 不使用颜色来区分不同的服务的控制台输出。
–no-deps 不启动服务所链接的容器。
–force-recreate 强制重新创建容器,不能与 --no-recreate 同时使用。
–no-recreate 如果容器已经存在了,则不重新创建,不能与 --force-recreate 同时使用。
–no-build 不自动构建缺失的服务镜像。
-t, --timeout TIMEOUT 停止容器时候的超时(默认为 10 秒)。

down命令将会停止 up 命令所启动的容器,并移除网络

3.3.4 exec

进入指定的容器。

3.3.5 help

获得一个命令的帮助。

3.3.6 images

列出 Compose 文件中包含的镜像。

3.3.7 logs

格式为 docker-compose logs [options] [SERVICE…] 。
查看服务容器的输出。默认情况下,docker-compose 将对不同的服务输出使用不同的颜色来区分。
可以通过 --no-color 来关闭颜色。
该命令在调试问题的时候十分有用。

3.3.8 pause&unpause

暂停一个服务容器。
恢复处于暂停状态中的服务。

3.3.9 port

打印某个容器端口所映射的公共端口。
选项:
–protocol=proto 指定端口协议,tcp(默认值)或者 udp。
–index=index 如果同一服务存在多个容器,指定命令对象容器的序号(默认为 1)。

3.3.10 ps

格式为 docker-compose ps [options] [SERVICE…] 。
列出项目中目前的所有容器。
选项:
-q 只打印容器的 ID 信息。

3.3.11 pull&push

pull 格式为 docker-compose pull [options] [SERVICE…] 。
拉取服务依赖的镜像。
选项:
–ignore-pull-failures 忽略拉取镜像过程中的错误。

push 推送服务依赖的镜像到 Docker 镜像仓库。

3.3.12 run

格式为 docker-compose run [options] [-p PORT…] [-e KEY=VAL…] SERVICE [COMMAND]
[ARGS…] 。
在指定服务上执行一个命令。类似docker run指令
将会基于指定的service的镜像启动一个新的容器,并且运行指定命令
默认情况下,如果存在关联,则所有关联的服务将会自动被启动,除非这些服务已经在运行中。
该命令类似启动容器后运行指定的命令,相关卷、链接等等都将会按照配置自动创建。
两个不同点:
给定命令将会覆盖原有的自动运行命令;
不会自动创建端口,以避免冲突。
如果不希望自动启动关联的容器,可以使用 --no-deps 选项,例如
将不会启动 web 容器所关联的其它容器。
选项:
-d 后台运行容器。
–name NAME 为容器指定一个名字。
$ docker-compose run redis pwd
//该操作为伪操作
docker-compose run --no-deps web pwd
–entrypoint CMD 覆盖默认的容器启动指令。
-e KEY=VAL 设置环境变量值,可多次使用选项来设置多个环境变量。
-u, --user=“” 指定运行容器的用户名或者 uid。
–no-deps 不自动启动关联的服务容器。
–rm 运行命令后自动删除容器, d 模式下将忽略。
-p, --publish=[] 映射容器端口到本地主机。
–service-ports 配置服务端口并映射到本地主机。
-T 不分配伪 tty,意味着依赖 tty 的指令将无法运行。

3.3.13 start&stop

start 启动已经存在的服务。
stop 停止已经处于运行状态的服务,但不删除它。通过 docker-compose start 可以再次启动这些服务。
选项:
-t, --timeout TIMEOUT 停止容器时候的超时(默认为 10 秒)。

3.3.14 restart

重启项目中的服务。
选项:
-t, --timeout TIMEOUT 指定重启前停止容器的超时(默认为 10 秒)

3.3.15 rm

删除所有(停止状态的)服务容器。推荐先执行 docker-compose stop 命令来停止容器。
选项:
-f, --force 强制直接删除,包括非停止状态的容器。一般尽量不要使用该选项。
-v 删除容器所挂载的数据卷。

3.3.16 top

查看各个服务内运行的进程。

3.3.17 version

打印版本信息。

四、yml 配置指令参考(以下内容只作为参考)

官方文档:https://docs.docker.com/compose/compose-file/
version
Compose 文件格式有3个版本,分别为1, 2.x 和 3.x 目前主流的为 3.x 其支持 docker 1.13.0 及其以上的
版本
build
指定镜像构建参数,其作用与docker build 命令一样
例如:

build: ./dir
或
build:
context: .
dockerfile: Dockerfile-compose
args:
- http_proxy: https://proxy.golang.com.cn,https://goproxy.cn,direct
labels:
- "myhello:1.0"
- "com.example.description=Accounting webapp"
tags:
- "myhello:1.0.0"
- "localhost:5000/myhello:1.0.0"
  1. context:上下文路径
  2. dockerfile:指定构建镜像的 Dockerfile 文件名
  3. args:添加构建参数,这是只能在构建过程中访问的环境变量。
  4. labels:设置构建镜像的标签。
  5. target:多层构建,可以指定构建哪一层。
  6. tags:指定镜像的tags