# Docker Compose

docker compose可以让用户通过编写一个简单的模板文件,快速的创建和管理基于Docker容器的应用集群。 使用docker compose可以单独的编写docker-compose.yml模板文件(YAML格式)来定义一组相关联的应用容器为一个项目。

# 核心概念

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

Compose的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。

# 命令详解

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

-f 指定使用的默认的compose模板文件(默认为docker-compose.yml)
-p NAME指定项目名称,默认将所在目录名称作为项目名称

Compose 命令

build 构建项目中的服务容器
kill 通过发送SIGKILL信号来强制停止服务容器
logs 查看服务容器的输出
pause 暂停一个服务容器
port 打印某个容器端口所映射的公共端口
ps 列出项目中目前的所有容器
pull 拉取服务依赖的镜像
restart 重启项目中的服务
rm 删除所有(停止状态的)服务容器
run 在指定服务上执行一个命令
scale 设置指定服务运行的容器个数
start 启动已经存在的服务容器
stop 停止已经处于运行状态的容器,但不删除
unpause 恢复出于暂停状态的中的服务
up 自动完成包括构建镜像、创建服务、启动服务并关联服务相关容器的一系列操作

1.build 构建项目中的服务内容

docker-compose build [options] [--build-arg key=val...] [SERVICE...]

2.kill 通过发送SIGKILL信号来强制停止服务容器,可以支持使用-s参数来指定发送的信号

docker-compose kill -s SIGINT

3.logs 查看服务容器的输出

docker-compose logs [options] [SERVICE...]

4.pause 暂停一个服务容器

docker-compose pause [options] [SERVICE...]

5.port 显示某个容器端口所映射的公共端口

docker-compose port [options] SERVICE PRIVATE_PORT

6.ps 列出项目中目前的所有容器

docker-compose ps [options] [SERVICE...]

7.pull 拉取服务依赖的镜像

docker-compose pull [options] [SERVICE...]

8.restart 重启项目中的服务

docker-compose restart [options] [SERVICE...]

9.rm 删除所有的(停止状态的)服务容器

docker-compose rm [options] [SERVICE...]

注意: 推荐先执行docker-compose stop命令来停止容器

10.run 在指定服务上执行一个命令 eg:

docker-compose run ubuntu ping docker.com
//将会启动一个ubuntu服务容器,并执行ping docker.com

-d 后台运行
--entrypoint CMD覆盖默认的内容
-e KEY=VALUE 设置环境变量
-u --user="" 指定运行容器的用户或者uid
--no-deps 不自动的启动关联的服务容器
--rm 运行命令后自动删除容器
-p 映射容器端口到本地 eg: docker-compose run -p 2022:22 web shell
--service-ports 配置服务端口并映射到本地主机

默认情况下,如果存在关联,则所有的关联的服务将会自动的被启动(除非这些服务已经在运行中)。如果不希望自动启动关联的容器,可以使用--no-deps选项

注意:

  • 给定的命令将会覆盖原有的自动运行命令
  • 不会自动创建端口,以避免冲突

11.start 启动已经存在的服务容器

docker-compose start [SERVICE...]

12.stop 停止已经处于运行状态的容器,但不删除它。

docker-compose stop [options] [SERVICE...]

13.up 该命令十分强大,他将尝试自动完成包括:构建镜像,重新创建服务,启动服务,并关联服务相关容器的一系列操作。连接的服务都将会被自动启动,除非已经处于运行状态。

docker-compose up [options] [SERVICE...]

# 模板文件

模板文件是使用Compose的核心。默认的模板文件名称为docker-compose.yml,格式为YAML格式 eg:

version: '2'
services:
  webapp:
    image: examples/web
    ports:
      - "80:80"
    volumes:
      - "/data"

如果使用build指令,在Dockerfile中的设置的选项(例如:CMD,EXPOSE,VOLUMN,ENV)将会被自动获取,无需在docker-compose.yml中再次设置

1.build 指定Dockerfile所在文件夹的路径(绝对路径或者是相对路径)

build: /path/to/build/dir

2.command 覆盖容器启动后默认执行的命令。

command: echo "hello workld"

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

container_name: docker-web-container

4.devices

devices:
  - "/dev/ttyUSB1:/dev/ttyUSB0"

5.dns 自定义DNS服务器

dns: 8.8.8.8
dns:
    -8.8.8.8
    -9.9.9.9

6.dockerfile 指定额外的编译镜像的Dockerfile文件

dockerfile: Dockerfile-alternate

注意: 该指令不能跟image同时使用,否则Compose将不会知道根据哪个指令来生成最终的服务镜像。

7.env_file 从文件中获取环境变量,可以为单独的文件路径或列表。如果通过docker-compose -f FILE方式来指定Compose模板文件,则env_file中变量的路径会基于模板文件路径。

如果有变量名称与environment指令冲突,则按照惯例,以后者为准:

env_file: .env
env_file: 
    - ./common.env
    - ./apps/web.env
    - /opt/secrets.env

8.enviroment 设置环境变量,可以使用数组或字典两种格式。

只给定名称的变量会自动的获取运行Compose主机上对应变量的值,可以用来防止泄露不必要的数据。

enviroment:
    RACK_ENV: development
    SESSION_SECRET:

注意:如果变量名称或者值中用到truefalse,yesno等表达布尔含义的词汇。最好放到引号里,避免YAML自动解析某些内容为对应的布尔语义

9.expose 暴露端口,但不映射宿主机,只能允许能被连接的服务访问。仅可以指定内部端口为参数。

expose:
    - "3000"
    - "8000"

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

image: ubuntu
image: a4b65fd

11.links 链接到其他服务器中的容器。 两种方式:

  • 服务名称(同时作为别名)
  • 服务名称:服务别名 => SERVICE:ALIAS

eg:

links:
    - db
    - db:database
    - redis

使用的别名将会自动在服务容器中的/etc/hosts里创建。例如:

172.17.2.186 db
172.17.2.186 database
172.17.2.187 redis

12.ports 暴露端口信息 两种方式:

  • 使用宿主:容器格式 => "HOST:CONTAINER"
  • 仅指定容器的端口(宿主将会随机选择端口):
ports:
    - "3000"
    - "8000:8000"
    - "127.0.0.1:8001:8001"

13.volumes 数据卷所挂载路径设置。可以设置宿主机路径(HOST:CONTAINER)或加上访问模式(HOST:CONTAINER:ro)

volumes:
    - /var/lib/mysql  => 将宿主机的`/var/lib/mysql`挂载到容器的`/var/lib/mysql`
    - cache/:/tmp/cache => 将宿主机的`cache`挂载到容器的`/tmp/cache`
    - ~/configs:/etc/configs/:ro => 将宿主机的`~/configs`挂载到容器的`/etc/configs/`并设置访问权限为读写
陕ICP备20004732号-3