1. 简介

Docker-Compose项目是Docker官方的开源项目,是对Docker容器集群的快速编排的工具。

2. 安装

Linux

sudo curl -L https://github.com/docker/compose/releases/download/1.29.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose

sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

docker-compose -v

Windows 在安装docker桌面版本的时候已经包含了Compose,因此不需要单独安装 Compose

3. 常用命令

3.1. Docker-compose命令格式

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

命令选项

-f --file FILE指定Compose模板文件,默认为docker-compose.yml

-p --project-name NAME 指定项目名称,默认使用当前所在目录为项目名

--verbose 输出更多调试信息

-v,--version 打印版本并退出

--log-level LEVEL 定义日志等级(DEBUG, INFO, WARNING, ERROR, CRITICAL)

--env-file PATH 环境文件路径指定备用环境文件

3.2. docker-compose ps

用于列出 Compose 应用中所有容器。输出内容包括当前状态、容器运行的命令以及网络端口。

docker-compose ps

3.3. docker-compose up

docker-compose up 用于构建、启动容器。

docker-compose up [options] [--scale SERVICE=NUM...] [SERVICE...]

选项包括

-d 参数令应用在后台启动。

–-build 在启动容器前构建服务镜像

–-no-build 不自动构建缺失的服务镜像

--t, –-timeout TIMEOUT 停止容器时候的超时(默认为10秒)

--no-color 不是有颜色来区分不同的服务的控制输出

--force-recreate 强制重新创建容器,不能与--no-recreate同时使用

–-no-recreate 如果容器已经存在,则不重新创建,不能与–-force-recreate同时使用

–-bort-on-container-exit 停止所有容器,如果任何一个容器被停止,不能与-d同时使用

–-remove-orphans 删除服务中没有在compose文件中定义的容器

docker-compose up

docker-compose up -d

3.4. docker-compose stop

停止正在运行的容器,但不会删除它们。

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

选项包括:

-t, –timeout TIMEOUT,指定重启前停止容器的超时(默认为10秒)

docker-compose stop

3.5. docker-compose restart

重启已停止的容器

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

选项包括:

-t, –timeout TIMEOUT,指定重启前停止容器的超时(默认为10秒)

docker-compose restart

3.6. docker-compose rm

删除所有已停止的服务容器。

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

选项包括

–f, –-force,强制直接删除,包括非停止状态的容器

-v,删除容器所挂载的数据卷

-s, --stop 在拆除前停止容器

docker-compose rm

删除所有已停止服务容器。建议先执行docker-compose stop命令来停止容器。

3.7. docker-compose down

停止并删除运行中的容器、网络、卷、镜像。

docker-compose down [options]

选项包括

–-rmi type,删除镜像,类型必须是:all,删除compose文件中定义的所有镜像;local,删除镜像名为空的镜像

-v, –-volumes,删除已经在compose文件中定义的和匿名的附在容器上的数据卷

–-remove-orphans,删除服务中没有在compose中定义的容器

docker-compose down

3.8. docker-compose kill

通过发送SIGKILL信号来停止指定服务的容器

docker-compose kill kafka

3.9. docker-compose config

查看compose文件配置

docker-compose config [options]

选项包括

–-resolve-image-digests 将镜像标签标记为摘要

-q, –-quiet 只验证配置,不输出。 当配置正确时,不输出任何内容,当文件配置错误,输出错误信息

–-services 打印服务名,一行一个

–-volumes 打印数据卷名,一行一个

3.10. docker-compose create

为服务创建容器

docker-compose create

4. docker-compose.yml 属性

4.1. 模板文件简介

Compose允许用户通过一个docker-compose.yml模板文件来定义一组相关联的应用容器为一个项目

version: '3'

services:
  zookeeper:
    image: wurstmeister/zookeeper
    restart: unless-stopped
    hostname: zookeeper
    ports:
      - "2181:2181"
    container_name: zookeeper

  # kafka version: 1.1.0
  # scala version: 2.12
  kafka:
    image: wurstmeister/kafka
    ports:
      - "9092:9092"
    environment:
      KAFKA_ADVERTISED_HOST_NAME: 192.168.31.64
      KAFKA_ZOOKEEPER_CONNECT: "zookeeper:2181"
      KAFKA_BROKER_ID: 1
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_CREATE_TOPICS: "stream-in:1:1,stream-out:1:1" 
      KAFKA_LOG_DIRS: "/kafka/logs"
    depends_on:
      - zookeeper
    container_name: kafka

4.2. version

指定 docker-compose.yml 文件的写法格式
Compose目前有三个版本分别为Version 1,Version 2,Version 3,Compose区分Version 1和Version 2(Compose 1.6.0+,Docker Engine 1.10.0+)。 Version 2支持更多的指令。Version 1将来会被弃用

4.3. services

多个容器集合

4.4. image

image是指定服务的镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试拉取镜像。

4.5. build

服务除了可以指定的镜像 image,还可以利用Dockerfile自动构建镜像。

[!NOTE] 若同时指定image和build标签,Compose会构建镜像并且把镜像命名为image值指定的名字。

build指定 Dockerfile 所在文件夹的路径

#绝对路径

build: /www/blog/docker

#相对路径只要上下文能读取到Dockerfile就可

build: ./docker

#设定上下文根目录,以该目录为准指定Dockerfile。

build:  
  context: /www/blog/docker  
  dockerfile: Dockerfile  
  args:
    username: yzx
    password: secret

参数:

  • context : 可以是Dockerfile的文件路径,也可以是到链接到git仓库的url.

  • dockerfile : 指定Dockerfile文件名,若context指定了文件名,这里就不用设置了。

  • args : 添加构建参数,这些参数是仅在构建过程中可访问的环境变量

首先, 在Dockerfile文件中指定参数:

ARG username
ARG password

然后指定 build 下的参数,可以传递映射或列表 (与env不同的是,agr可以为空值)

build:
  context: /www/blog/docker/Dockerfile
  args:
    username: yzx
    password: secret

[!NOTE] YAML布尔值(true,false,yes,no,on,off)必须使用引号括起来,才能正常被解析为字符串.

4.6. restart

docker服务重启

no,默认策略,在任何情况下都不会重启容器。

always,总是重启容器

on-failure,在容器非正常退出时(退出状态非0),才会重启容器

unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器

restart: "no"
restart: always
restart: on-failure
restart: unless-stopped

4.7. hostname

内网里可以直接用hostname的命名来代替其IP地址

4.8. ports

映射端口

使用HOST:CONTAINER格式或者只是指定容器的端口,宿主机会随机映射端口。

  ports:
    - "2181:2181"
    - "127.0.0.1:8001:8001"

[!NOTE] 若使用的容器端口小于60可能会得到错误得结果,因为YAML将会解析xx:yy这种数字格式为60进制。所以建议采用字符串格式。

4.9. container_name

指定容器名称,如果未指定,容器命名规则是
【[compose文件所在目录]_[服务名]_1】

4.10. environment

环境变量配置,可以使用数组或字典表示

environment 和 Dockerfile 中的 ENV 指令一样会把变量一直保存在镜像、容器中,类似 docker run -e 的效果

如kafka的环境变量设置

#数组
  environment:
      KAFKA_ADVERTISED_HOST_NAME: 192.168.31.64
      KAFKA_ZOOKEEPER_CONNECT: "zookeeper:2181"

#字典
  environment:
      - KAFKA_ADVERTISED_HOST_NAME: 192.168.31.64
      - KAFKA_ZOOKEEPER_CONNECT: "zookeeper:2181"

4.11. env_file

从文件中获取环境变量,可以指定一个文件路径或路径列表,其优先级低于 environment 指定的环境变量

env_file: .env

# 可设置多个
env_file:
    - a.env
    - b.env

若a.env和b.env有相同变量,取排在后面的b.env值

[!NOTE] 如果在配置文件中有 build 操作,这些变量是不会进入构建过程中,如果要在构建中使用变量首选还是 arg 标签

4.12. command

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

 command: [
    '--character-set-server=utf8mb4',           #设置数据库表的数据集
    '--collation-server=utf8mb4_unicode_ci',    #设置数据库表的数据集
    '--default-time-zone=+8:00'                 #设置mysql数据库的时区
 ]

4.13. volumes

将主机的数据卷或着文件挂载到容器里。

4.14. depends_on

本服务启动前,需要依赖哪些别的服务

下面的容器会先启动db和redis两个服务,最后才启动web服务。

version: '3'
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: mysql

链接到其它服务中的容器。使用服务名称(同时作为别名),或者“服务名称:服务别名”,例如:

links:
    - redis
    - mysql:mysql
    - db:database

4.16. logging

服务的日志记录配置。

logging:
  driver: json-file
  options:
    max-size: "88k" # 单个文件大小为88k
    max-file: "8" # 最多8个文件

该 driver值是指定服务器的日志记录驱动程序,默认值为 json-file,与 --log-diver 选项一样,当达到文件限制上限,会自动删除旧得文件。

使用syslog 驱动程序下,可以使用 syslog-address 指定日志接收地址。

logging:
  driver: syslog
  options:
    syslog-address: "tcp://192.168.31.18:8080"

配置日志服务

4.17. 其它

  • networks 加入指定网络

  • aliases 同一网络上的其他容器可以使用服务器名称或别名来连接到其他服务的容器

Copyright © yzx该文章修订时间: 2021-09-18 17:01:54

results matching ""

    No results matching ""