3

Docker | Docker Compose 基础

 2 years ago
source link: https://ijayer.github.io/post/tech/devops/docker/20180925-docker-compose-note/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Docker | Docker Compose 基础

2018-09-25 3281 words 7 mins read 29 times read

平时启动容器的时候,一般会使用 docker run 命令,但会遇到一种情况就是当一个项目需要启动多个容器的时,docker run 命令就显得不是很方便了。 为此 Docker 推出了一个工具软件 Compose, 用来定义和运行多个容器应用。 这部分内容就是关于 Docker Compose 的学习笔记。

Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件 docker-compose.yml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动/关闭这些容器。 例如一个 Web 服务容器再加上后端的数据库服务容器等。

# 启动所有服务
$ docker-compose up

# 关闭所有服务
$ docker-compose stop

Note:

  • Dockerfile: 允许用户管理一个单独的
  • docker-compose.yml: 允许用户管理一组相互关联的应用容器

其他更加详细的信息可以前往官网查看:View Docker Compose On GitHub | Overview

完全参考 官方文档 安装即可

安装完成后,运行下面命令:

$ docker-compose --version
docker-compose version 1.22.0, build f46880fe

先熟悉一下 Docker Compose 基本用法:官方 Docker Compose 使用文档

项目:由一组关联的应用容器组成的一个完整业务单元。

可见,一个项目可以由多个服务(容器)关联而成,Compose 面向项目进行管理。

输入 $ docker-compose -h 可以查看该命令的详细信息,下面对部分内容做简要说明

Compose 大部分命令都可以运行在一个或多个服务上,如果没有特别的说明,命令则应用在项目的所有服务上,即 docker-compose.yml 中定义的所有内容。

Usage:

$ docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
  • -f, –file FILE 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定。

    $ docker-compose -f docker-compose.yml docker-compose.admin.yml 

    Note: 关于 -f 的具体处理逻辑可以查看 Here

    • -p, –project-name NAME 指定项目名称,默认将使用所在目录名称作为项目名。

    • –x-networking 使用 Docker 的可拔插网络后端特性

    • –x-network-driver DRIVER 指定网络后端的驱动,默认为 bridge

    • –verbose 输出更多调试信息

    部分命令说明

    build

    Usage: build [options] [--build-arg key=val...] [SERVICE...]
    
    Options:
    --force-rm  删除构建过程中的临时容器
    --no-cache  构建镜像过程中不使用 cache(这将加长构建过程)
    --pull      始终尝试通过 pull 来获取更新版本的镜像
  • 构建或重新构建服务容器

  • 服务容器一旦构建后,将会带上一个标记名,例如对于 web 项目中的一个 db 容器,可能是 web_db

  • 当服务的 Dockerfile 有改动或构建的目录内容有变化时,可以运行 docker-compose build 来重新构建

config

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

Stops containers and removes containers, networks, volumes, and images
created by `up`.

By default, the only things removed are:

- Containers for services defined in the Compose file
- Networks defined in the `networks` section of the Compose file
- The default network, if one is used

Networks and volumes defined as `external` are never removed.
Force stop service containers.

Usage: kill [options] [SERVICE...]

Options:
    -s SIGNAL         SIGNAL to send to the container.
                      Default signal is SIGKILL.
  • 通过发送 SIGKILL 信号来强制停止服务容器。
  • 支持通过 -s 参数来指定发送的信号,例如通过如下指令发送 SIGINT 信号。

    • $ docker-compose kill -s SIGINT
  • 查看服务容器的输出。默认情况下,docker-compose 将对不同的服务输出使用不同的颜色来区分。可以通过 –no-color 来关闭颜色。

  • 该命令在调试问题的时候十分有用。

pause

  • Pauses running containers of a service. They can be unpaused with docker-compose unpause.
  • 打印某个容器端口所映射的公共端口。
  • 列出项目中目前的所有容器
  • 拉取服务依赖的镜像
  • 推送服务依赖的镜像到 registry/repository

restart

  • 重启项目中的服务
  • 删除所有(停止状态的)服务容器。推荐先执行 docker-compose stop 命令来停止容器。

    • -f, –force 强制直接删除,包括非停止状态的容器。一般尽量不要使用该选项。
    • -v 删除容器所挂载的数据卷。
  • 在指定服务上执行一个命令
    • 默认情况下,如果存在关联,则所有关联的服务将会自动被启动,除非这些服务已经在运行中。
  • 两个不同点:

    • 给定命令将会覆盖原有的自动运行命令;
    • 不会自动创建端口,以避免冲突。
  • 如果不希望自动启动关联的容器,可以使用 –no-deps 选项

scale

  • 设置指定服务运行的容器个数

    • 通过 service=num 的参数来设置数量, 例如:$ docker-compose scale web=3 db=2

start

  • 启动已经存在的服务容器
  • 停止已经处于运行状态的容器,但不删除它。通过 docker-compose start 可以再次启动这些容器
  • 查看项目中,各个服务容器内运行的进程

unpause

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

  • -d                      在后台运行服务容器。
    --no-color              不使用颜色来区分不同的服务的控制台输出。
    --no-deps               不启动服务所链接的容器。
    --force-recreate        强制重新创建容器,不能与 --no-recreate 同时使用。
    --no-recreate           如果容器已经存在了,则不重新创建,不能与 --force-recreate 同时使用。
    --no-build              不自动构建缺失的服务镜像。
    -t, --timeout TIMEOUT   停止容器时候的超时(默认为 10 秒)。
    • 模板文件是 Docker Compose 的核心,默认文件名为 docker-compose.yml, 格式 YAML。 其中大部分指令和 docker run 是类似的

    Note:

    • 定义的每个服务都必须通过 image 指令指定镜像或通过 build 指令(需要 Dockerfile) 来自动构建镜像
    • 如果使用 build 指令,在 Dockerfile 中设置的选项(例如:CMD, EXPOSE, VOLUME, ENV 等) 将会自动被获取,无需在 docker-compose.yml 中再次设置。

    下面简单介绍定义 Docker Compose 模板文件的指令集

    image

    • 指定为镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉去这个镜像
    image: ubuntu
    image: orchardup/postgresql
    image: a4bc65fd

build

  • 指定 Dockerfile 所在文件夹的路径(可以是绝对路径,或者相对 docker-compose.yml 文件的路径)。 Compose 将会利用它自动构建这个镜像,然后使用这个镜像。

    build: /path/to/build/dir
    • 也可以使用 context 指令指定 Dockerfile 所在文件夹的路径, 然后使用 dockerfile 指令指定 Dockerfile 文件名
    version: '3'
    services:
    
    webapp:
        build:
        context: ./dir
        dockerfile: Dockerfile-alternate
        args:
            buildno: 1
  • 上面实例中,使用了 args 指令指定构建镜像时的变量

command

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

    command: echo "hello world"

    container_name

    • 指定容器名称。默认将会使用 项目名称_服务名称_序号 这样的格式
    container_name: docker-web-container

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

depends_on

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

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

    Note: web 服务不会等待 redis db 「完全启动」之后才启动。

    env_file

    • 从文件中获取环境变量,可以为单独的文件路径或列表
    • 如果通过 docker-compose -f FILE 方式来指定 Compose 模板文件,则 env_file 中变量的路径会基于模板文件路径
    • 如果有变量名称与 environment 指令冲突,则按照惯例,以后者为准
    env_file: .env
    
    env_file:
    - ./common.env
    - ./apps/web.env
    - ./opt/secrets.env
  • 环境变量文件中每一行必须符合格式,支持 # 开头的注释行

# common.env: Set development environment
PROG_ENV=development

environment

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

    environment:
        RACK_ENV: development
        SESSION_SECRET:
    
    environment:
        - RACK_ENV=development
        - SESSION_SECRET

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

    y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF

    expose

    • 暴露端口,但不映射到宿主机,只被连接的服务访问。
    • 仅可以指定内部端口为参数
    expose:
        - "3000"
        - "8000"

network_mode

  • 设置网络模式。使用和 docker run 的 –network 参数一样的值。

networks

  • 配置容器连接的网络

    version: "3"
    services:
    
    some-service:
        networks:
            - some-network
            - other-network
    
    networks:
        some-network:
        other-network:

    ports

    • 暴露端口信息。
    • 使用宿主端口:容器端口 (HOST:CONTAINER) 格式,或者仅仅指定容器的端口(宿主将会随机选择端口)都可以。
    ports:
        - "3000"
        - "8000:8000"
        - "49100:22"
        - "127.0.0.1:8001:8001"

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

secrets

  • 存储敏感数据,例如 mysql 服务密码

volumes

  • 数据卷所挂载路径设置。可以设置宿主机路径 (HOST:CONTAINER) 或加上访问模式 (HOST:CONTAINER:ro)。
  • 该指令中路径支持相对路径。

    volumes:
        - /var/lib/mysql
        - cache/:/tmp/cache
        - ~/configs:/etc/configs/:ro

    Others

    此外,还有包括 domainname, entrypoint, hostname, ipc, mac_address, privileged, read_only, shm_size, restart, stdin_open, tty, user, working_dir 等指令,基本跟 docker run 中对应参数的功能一致。

    See Also

    Thanks to the authors 🙂


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK