Docker-Compose环境搭建及其使用

Compose文件是一个定义Docker应用程序的服务,网络和卷的YAML文件。

简介

Compose文件是一个定义Docker应用程序的服务,网络和卷的YAML文件。

兼容

有几种版本的Compose文件格式 1、2、2.x和3.x

此表显示哪些Compose文件版本支持特定的Docker版本。

Compose file format Docker Engine release
3.3 17.06.0+
3.2 17.04.0+
3.1 1.13.1+
3.0 1.13.0+
2.3 17.06.0+
2.2 1.13.0+
2.1 1.12.0+
2.0 1.10.0+
1.0 1.9.1.+

版本

目前有三种版本的Compose文件格式:

  • 版本1,传统格式。这是通过省略versionYAML根部的一个键来指定的。
  • 版本2.x. 这是通过YAML根部的一个version: '2'或者version: '2.1'等等条目指定的。
  • 版本3.x是最新和推荐的版本,旨在在Compose和Docker Engine的swarm模式之间交叉兼容。这是通过YAML根部的一个version: '3'或者version: '3.1'等等条目指定的。

下面将一一介绍版本差异:

版本1

当在书写docker-compose.yml文件时不声明文件版本时,默认为版本1。这个版本中,所有的服务都是直接声明在根下的。

版本1文件中是不能声明volumesnetwork和构建参数的。

在使用版本1时,Compose会将每一个容器都放置在一个默认的bridge环境中。

example:

web:
  build: .
  ports:
    - "5000:5000"
  volumes:
    - .:/code
  links:
    - redis
redis:
  image: redis:latest

版本2

当在书写docker-compose.yml文件时,此时则必须在文档根目录下声明版本号。

所有的服务均需声明在services:目录下。

命名卷声明在volumes:目录下,网络声明在networks:目录下。

默认情况下,每个容器均会加入Project应用程序:即一个docker-compose.yml文件的范围)范围的默认网络中,并且相互之间可以使用服务名访问对方,links可以弃用了。

example:

version: '2'
services:
  web:
    build: ""
    ports:
      - "5000:5000"
    volumes:
      - ./code
  redis:
    image: redis:latest

Full example:

version: '2'
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code
    networks:
      - front-tier
      - back-tier
  redis:
    image: redis:latest
    volumes:
      - redis-data:/var/lib/redis
    networks:
      - back-tier
volumes:
  redis-data:
    driver: local
networks:
  front-tier:
    driver: bridge
  back-tier:
    driver: bridge

版本2.1

引入以下附加参数:

  • link_local_ips
  • isolation
  • labels
  • name
  • userns_mode
  • healthcheck
  • sysctls
  • pids_limit

版本2.2

引入以下附加参数:

  • init
  • scale

版本2.3

引入以下附加参数:

  • target
  • start_periodhealthchecks

版本3

为了在Compose和Docker Engine的swarm模式之间交叉兼容,版本3删除了几个选项并添加了更多选项。

  • 删除:volume_drivervolumes_fromcpu_sharescpu_quotacpusetmem_limitmemswap_limitextendsgroup_add
    。请参阅升级指南以了解如何迁移这些指南。(有关更多信息extends,请参阅扩展服务。)
  • 补充:部署

版本3.3

引入以下附加参数:

  • 建立 labels
  • credential_spec
  • configs
  • 部署 endpoint_mode

升级

版本2.x到3.x

在版本2.x和3.x之间,yml文件的结构是相同的,但是几个选项已被删除:

  • volume_driver:不是在服务上设置卷驱动,而是使用顶层volumes选项定义卷并在那里指定驱动。版本:“3”服务:db:image:postgres卷: - data:/ var / lib / postgresql
    / data卷:data:驱动程序:mydriver
  • volumes_from:要在服务之间共享卷,请使用顶级volumes选项对其进行定义,并从使用服务级别volumes选项共享服务的每个服务中引用它。
  • cpu_sharescpu_quotacpusetmem_limitmemswap_limit:这些已被替换下的资源键deploy。请注意,deploy
    配置仅在使用时生效docker stack deploy,并被忽略docker-compose
  • extends:对于version: "3.x"撰写文件,此选项已被删除。(有关更多信息,请参阅扩展服务。)
  • group_add:对于version: "3.x"撰写文件,此选项已被删除。
  • pids_limit:此选项尚未在version: "3.x"Compose文件中引入。
  • link_local_ipsin networks:该选项尚未在version: "3.x"Compose文件中引入。

版本1到2.x

在大多数情况下,从版本1移动到2是一个非常简单的过程:

  1. 将整个文件缩进一层,并services:在顶部放置一个键。
  2. version: '2'在文件顶部添加一行。

如果您使用特定的配置功能,则会更加复杂:

  • dockerfile:现在contextbuild之下:build: context:。dockerfile:Dockerfile-alternate
  • log_driverlog_opt:这些现在在logging密钥下:logging: driver: syslog options: syslog-address: "tcp://192.168.0.42:123"
  • links使用环境变量:如环境变量引用中所述,由链接创建的环境变量已被弃用一段时间。在新的Docker网络系统中,它们已被删除。您应该直接连接到适当的主机名或使用链接主机名设置相关的环境变量:web:links: - db
    environment: - DB_PORT = tcp:// db:5432
  • external_links
    :Compose在运行版本2项目时使用Docker网络,因此链接的行为稍有不同。特别是,两个容器必须连接到至少一个共同的网络才能通信,即使明确地链接在一起。将外部容器连接到应用程序的默认网络,或者将外部容器和服务的容器连接到外部网络。
  • net:这现在被network_mode:net:host - > network_mode:host net:bridge - > network_mode:bridge net:none - >
    network_mode:none 替代如果您正在使用net: "container:[service name]",您现在必须network_mode: "service:[service name]"
    改用它。net:“container:web” - > network_mode:“service:web”如果你正在使用net: "container:[container name/id]"
    ,这个值不需要改变。net:“container:cont-name” - > network_mode:“container:cont-name”net:“container:abc12345” - >
    network_mode:“container:abc12345”
  • volumes使用命名卷:现在必须在volumesCompose文件的顶级部分显式声明这些命令。如果某个服务装载了一个已命名的卷data,则必须data在顶级volumes
    部分中声明一个卷。整个文件可能如下所示:版本:’2’服务:db:image:postgres卷: - data:/ var / lib / postgresql /
    data卷:data:默认情况下,Compose创建一个卷,其名称带有前缀与您的项目名称。如果您希望仅调用data它,请将其声明为external:volumes:data:external:true

安装

Bash

我们可以从 Github 上下载它的二进制包来使用,最新发行的版本地址:https://github.com/docker/compose/releases。

运行以下命令以下载 Docker Compose 的当前稳定版本:

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

要安装其他版本的 Compose,请替换 1.24.1。

将可执行权限应用于二进制文件:

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

Docker Desktop or Docker Toolbox

Docker 桌面版和 Docker Toolbox 已经包括 Compose 和其他 Docker 应用程序,因此 Windows 用户不需要单独安装 Compose。

Docker-Compose指令

  • build

  • bundle

  • config

  • create

  • down

  • events

  • exec

  • help

  • images

  • kill

  • logs

  • pause

  • port

  • PS

  • pull

  • push

  • restart

  • rm

  • run

  • scale

  • start

  • stop

  • top

  • unpause

  • up

build

Usage: build [options] [--build-arg key=val...] [SERVICE...]
Options:    
    --force-rm              Always remove intermediate containers.    
    --no-cache              Do not use cache when building the image.    
    --pull                  Always attempt to pull a newer version of the image.    
    --build-arg key=val     Set build-time variables for one service.

构建docker-compose服务。服务名默认为project_service

bundle

Usage: bundle [options]
Options:    
    --push-img              Automatically push img for any services
                               which have a `build` option specified.    
    -o, --output PATH          Path to write the bundle file to.
                               Defaults to "<project name>.dab".

生成分布式应用程序包(DAB)。

config

Usage: config [options]
Options:    
    --resolve-image-digests  Pin image tags to digests.    
    -q, --quiet              Only validate the configuration, don't print
                             anything.    
    --services               Print the service names, one per line.   
    --volumes                Print the volume names, one per line.

验证并查看docker-compose.yml文件。

create

Usage: create [options] [SERVICE...]
Options:    
--force-recreate       Recreate containers even if their configuration and
                           image haven't changed. Incompatible with --no-recreate.    
--no-recreate          If containers already exist, don't recreate them.
                           Incompatible with --force-recreate.    
--no-build             Don't build an image, even if it's missing.    
--build                Build img before creating containers.

为服务创建容器。

down

Usage: down [options]
Options:    
    --rmi type          Remove img. Type must be one of:                        
                        'all': Remove all img used by any service.                        
                        'local': Remove only img that don't have a custom tag                        
                        set by the `image` field.    
    -v, --volumes       Remove named volumes declared in the `volumes` section                        
                        of the Compose file and anonymous volumes
                        attached to containers.    
    --remove-orphans    Remove containers for services not defined in the
                        Compose file

停止容器并移除通过up创建的容器,网络,卷和图像。

默认情况下,唯一删除的内容是:

  • 在撰写文件中定义的服务容器

  • 在撰写文件的部分中定义的网络networks

  • 默认网络(如果使用的话)

注:由用户自定义的网络和卷不会删除。

events

Usage: events [options] [SERVICE...]
    Options:    
        --json      Output events as a stream of json objects

为项目中的每个容器流化容器事件。

使用该--json标志,每行将打印一个 json 对象,其格式为:

{
  "service": "web",
  "event": "create",
  "container": "213cf75fc39a",
  "image": "alpine:edge",
  "time": "2015-11-20T18:01:03.615550"
}

exec

Usage: exec [options] SERVICE COMMAND [ARGS...]
    Options:
        -d                Detached mode: Run command in the background.
        --privileged      Give extended privileges to the process.
        -u, --user USER   Run the command as this user.
        -T                Disable pseudo-tty allocation. By default `docker-compose exec`
                          allocates a TTY.
        --index=index     index of the container if there are multiple
                          instances of a service [default: 1]

这相当于docker exec。使用此子命令,您可以在服务中运行任意命令。命令默认分配一个 TTY ,所以你可以通过此命令获得交互式提示。例如:docker-compose exec web bash

images

Usage: img [options] [SERVICE...]
    Options:
        -q     Only display image IDs

列出创建的容器使用的图像。

kill

Usage: kill [options] [SERVICE...]
    Options:
    -s SIGNAL         SIGNAL to send to the container. Default signal is SIGKILL.

运行容器的强制通过发送SIGKILL信号来停止。可以选择要传递的信号类型,例如:

docker-compose kill -s SIGINT

logs

Usage: logs [options] [SERVICE...]
    Options:
    --no-color          Produce monochrome output.
    -f, --follow        Follow log output
    -t, --timestamps    Show timestamps
    --tail="all"        Number of lines to show from the end of the logs                    
                        for each container.

显示服务的日志输出。

pause

Usage: pause [SERVICE...]

暂停运行服务的容器。它可以与docker-compose unpause一起使用。

port

Usage: port [options] SERVICE PRIVATE_PORT

Options:
    --protocol=proto  tcp or udp [default: tcp]
    --index=index     index of the container if there are multiple
                      instances of a service [default: 1]

打印端口绑定的公共端口。

ps

Usage: ps [options] [SERVICE...]
Options:-q    Only display IDs

列出容器。

$ docker-compose ps
         Name                        Command                 State             Ports
         --------------------------------------------------------------------------------------------
         mywordpress_db_1          docker-entrypoint.sh mysqld      Up           3306/tcp
         mywordpress_wordpress_1   /entrypoint.sh apache2-for ...   Restarting   0.0.0.0:8000->80/tcp

pull

Usage: pull [options] [SERVICE...]
    Options:    
    --ignore-pull-failures  Pull what it can and ignores img with pull failures.    
    --parallel              Pull multiple img in parallel.    
    --quiet                 Pull without printing progress information

拉取在docker-compose.ymldocker-stack.yml文件中定义的服务相关联的映像,但不会基于这些映像启动容器。

push

Usage: push [options] [SERVICE...]Options:    --ignore-push-failures  Push what it can and ignores img with push failures.

将服务的镜像推送到它们各自的位置registry/repository

做出以下假设:

  • 您正在推送您在本地创建的镜像

  • 您可以访问构建密钥

restart

Usage: restart [options] [SERVICE...]Options:-t, --timeout TIMEOUT      Specify a shutdown timeout in seconds. (default: 10)

重新启动所有停止并正在运行的服务

如果对docker-compose.yml配置进行更改,则运行此命令后这些更改将不会反映出来。

例如,对环境变量(在构建容器后但在容器的命令执行之前添加)的更改在重新启动后将不会更新。

rm

Usage: rm [options] [SERVICE...]
Options:    
-f, --force   Don't ask to confirm removal    
-s, --stop    Stop the containers, if required, before removing    
-v            Remove any anonymous volumes attached to containers

删除已停止的服务容器。

默认情况下,附加到容器的匿名卷不会被删除。你可以用这个覆盖它-v。要列出所有卷,请使用docker volume ls

任何不在卷中的数据都将丢失。

运行没有选项的命令也会删除由docker-compose up或创建的一次性容器docker-compose run

$ docker-compose rm
Going to remove djangoquickstart_web_run_1
Are you sure? [yN] y
Removing djangoquickstart_web_run_1 ... done

run

Usage: run [options] [-v VOLUME...] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]
Options:    
        -d                    Detached mode: Run container in the background, print                          
                              new container name.    
        --name NAME           Assign a name to the container    
        --entrypoint CMD      Override the entrypoint of the image.    
        -e KEY=VAL            Set an environment variable (can be used multiple times)    
        -u, --user=""         Run as specified username or uid    
        --no-deps             Don't start linked services.    
        --rm                  Remove container after run. Ignored in detached mode.    
        -p, --publish=[]      Publish a container's port(s) to the host    
        --service-ports       Run command with the service's ports enabled and mapped
                              to the host.    
        -v, --volume=[]       Bind mount a volume (default [])    
        -T                    Disable pseudo-tty allocation. By default `docker-compose run`
                              allocates a TTY.    
        -w, --workdir=""      Working directory inside the container

针对服务运行一次性命令。例如,以下命令启动该web服务并bash作为其命令运行。

docker-compose run web bash

您使用的命令run从具有由服务定义的配置的新容器中启动,包括卷,链接和其他详细信息。但是,有两个重要的区别。

首先,通过的命令将run覆盖服务配置中定义的命令。例如,如果web服务配置以bash开头,则将其docker-compose run web python app.py覆盖python app.py

第二个区别是该docker-compose run命令不会创建服务配置中指定的任何端口。这可以防止端口与已打开的端口发生冲突。如果您确实想要创建服务的端口并将其映射到主机,请指定--service-ports标签:

docker-compose run --service-ports web python manage.py shell

或者,可以使用--publish-p选项,就像使用docker run

docker-compose run --publish 8080:80 -p 2022:22 -p 127.0.0.1:2021:21 web python manage.py shell

如果启动使用链接配置的服务,则该run命令首先检查链接服务是否正在运行,并在服务停止时启动该服务。一旦所有链接的服务正在运行,run执行您通过它的命令。例如,您可以运行:

docker-compose run db psql -h db -U docker

这将为链接db容器打开一个交互式 PostgreSQL shell 。

如果您不希望run命令启动链接容器,请使用--no-deps标签:

docker-compose run --no-deps web python manage.py shell

scale

该命令已弃用。若需使用该命令,请用--scale标签代替。

Usage: scale [SERVICE=NUM...]

设置为服务运行的容器数量。

数字在表单中被指定为参数service=num。例如:

docker-compose scale web=2 worker=3

提示:或者,在 Compose 文件版本3.x中,您可以将部署密钥下的副本指定为 Swarm 模式的服务配置的一部分。请注意,deploy密钥及其子选项(包括replicas)仅适用于docker stack deploy命令,不适用于docker compose updocker-compose run

start

Usage: start [SERVICE...]

启动服务的现有容器。

stop

Usage: stop [options] [SERVICE...]
    Options:
        -t, --timeout TIMEOUT      Specify a shutdown timeout in seconds (default: 10).

停止运行容器而不删除它们。他们可以重新开始docker-compose start

top

Usage: top [SERVICE...]

显示正在运行的进程。

$ docker-compose top
compose_service_a_1
PID    USER   TIME   COMMAND----------------------------4060   root   0:00   top

compose_service_b_1
PID    USER   TIME   COMMAND----------------------------4115   root   0:00   top

unpause

Usage: unpause [SERVICE...]

取消暂停服务的暂停容器。

up

Usage: up [options] [--scale SERVICE=NUM...] [SERVICE...]
Options:    -d              Detached mode: Run containers in the background,
                       print new container names.
                       Incompatible with --abort-on-container-exit.    
        --no-color          Produce monochrome output.    
        --no-deps           Don't start linked services.    
        --force-recreate       Recreate containers even if their configuration
                       and image haven't changed.
                       Incompatible with --no-recreate.    
        --no-recreate         If containers already exist, don't recreate them.
                       Incompatible with --force-recreate.    
        --no-build          Don't build an image, even if it's missing.    
        --build            Build img before starting containers.    
        --abort-on-container-exit   Stops all containers if any container was stopped.
                       Incompatible with -d.    
        -t, --timeout TIMEOUT    Use this timeout in seconds for container shutdown
                       when attached or when containers are already
                       running. (default: 10)    
        --remove-orphans       Remove containers for services not defined in
                       the Compose file    
        --exit-code-from SERVICE   Return the exit code of the selected service container.
                       Implies --abort-on-container-exit.    
        --scale SERVICE=NUM     Scale SERVICE to NUM instances. Overrides the `scale`
                       setting in the Compose file if present.

构建,(重新)创建,启动并附加到服务的容器。

除非它们已经在运行,否则该命令还会启动所有相关联的服务。

docker-compose up命令汇总每个容器的输出。当命令退出时,所有容器都停止。运行docker-compose up -d将在后台启动容器并使其运行。

如果存在服务的现有容器,并且在创建容器后服务的配置或映像已更改,则docker-compose up通过停止并重新创建容器(保留已安装的卷)来提取更改。要防止撰写选取更改,请使用该--no-recreate标签。

如果您想强制 Compose 停止并重新创建所有容器,请使用该--force-recreate标签。

如果进程遇到错误,则此命令的退出代码为1

如果使用SIGINTctrl+ C)中断进程或者SIGTERM容器停止,并且退出代码为0

如果SIGINTSIGTERM在此关闭阶段再次发送,正在运行的容器将被终止,并且退出代码为2

环境变量

Compose 支持在.env放在docker-compose执行该命令的文件夹当前工作目录中的环境文件中声明默认环境变量。

语法规则

这些语法规则适用于.env档案:

  • VAR=VAL格式组合期望env文件。

  • #(即注释)开头的行被忽略。

  • 空行被忽略。

  • 没有特殊的引号处理(即它们将成为 VAL 的一部分,你已经被警告;))。

编写文件和 CLI 变量

这里定义的环境变量将用于变量替换在撰写文件中,并且还可以用于定义以下内容 CLI 变量

  • COMPOSE_API_VERSION

  • COMPOSE_CONVERT_WINDOWS_PATHS

  • COMPOSE_FILE

  • COMPOSE_HTTP_TIMEOUT

  • COMPOSE_TLS_VERSION

  • COMPOSE_PROJECT_NAME

  • DOCKER_CERT_PATH

  • DOCKER_HOST

  • DOCKER_TLS_VERIFY

  • 运行时环境中存在的值将始终覆盖在.env档案。同样,通过命令行参数传递的值也优先。

  • 中定义的环境变量。.env文件在容器中不自动可见。若要设置适用于容器的环境变量,请遵循本主题中的指导方针。组合中的环境变量,描述如何将 shell 环境变量传递到容器,在复合文件中定义环境变量等等。

环境变量的使用

撰写中有多个部分在某种意义上处理环境变量。这个页面应该可以帮助你找到你需要的信息。

在组合文件中替换环境变量

可以在 shell 中使用环境变量填充复合文件中的值:

web:
  image: "webapp:${TAG}"

有关更多信息,请参见变量替换节中的“撰写文件引用”。

在容器中设置环境变量

可以在服务的容器中设置环境变量。“环境”键,就像docker run -e VARIABLE=VALUE ...*

web:
  environment:    - DEBUG=1

将环境变量传递到容器

可以将环境变量直接从shell传递到服务的容器,“环境”键不给他们一个价值,就像docker run -e VARIABLE ...*

web:
  environment:    - DEBUG

DEBUG容器中的变量的值将从运行复合的 shell 中相同变量的值中提取。

env_file“ 配置选项

可以将多个环境变量从外部文件传递到服务的容器,env_file

选项,就像docker run --env-file=FILE ...*

web:
  env_file:    - web-variables.env

以 “docker-compose run”设置环境变量

就像docker run -e,则可以在一次性容器上设置环境变量docker-compose run -e*。

docker-compose run -e DEBUG=1 web python console.py

还可以通过不给变量值从 shell 传递变量:

docker-compose run -e DEBUG web python console.py

DEBUG容器中的变量的值将从运行复合的 shell 中的相同变量的值中提取。

“.env”文件

控件中引用的任何环境变量或用于配置撰写的任何环境变量的默认值。环境文件命名.env*

$ cat .env
TAG=v1.5$ cat docker-compose.yml
version: '3'services:
  web:
    image: "webapp:${TAG}"

当你运行的时候docker-compose upweb上面定义的服务使用图像webapp:v1.5.您可以使用配置命令,它将已解析的应用程序配置打印到终端:

$ docker-compose config
version: '3'services:
  web:
    image: 'webapp:v1.5'

shell 中的值优先于.env文件中指定的值。如果你TAG在你的 shell 中设置了一个不同的值,那么这个替换就会image使用它:

$ export TAG=v2.0$ docker-compose config
version: '3'services:
  web:
    image: 'webapp:v2.0'

当使用 shell 中 environment变量和env_file配置文件提供值时,环境变量的值将首先从环境密钥获取,然后从环境文件获取,然后从 ** -entry **
获取:**Dockerfile** **ENV**

$ cat ./Docker/api/api.env
NODE_ENV=test

$ cat docker-compose.yml
version: '3'services:
  api:
    image: 'node:6-alpine'
    env_file:     - ./Docker/api/api.env
    environment:     - NODE_ENV=production

你可以用它来测试例如 NodeJSCLI 中的容器:

$ docker-compose exec api node> process.env.NODE_ENV'production'

有任何ARGENV设置在Dockerfile只有在否码头工人作曲进入environmentenv_file

NodeJS 容器专用材料:如果你有package.json进入script:start就像NODE_ENV=test node server.js,这将推翻你的docker-compose.yml档案中任何文件。

使用环境变量配置组合

有几个环境变量可供您配置 Docker Compose 命令行行为。它们以 CLI 环境变量开头COMPOSE_DOCKER_记录在 CLI 环境变量中。

由链接创建的环境变量

在 v1 撰写文件中使用 ‘links’ 选项时,将为每个链接创建环境变量。它们记录在 Link 环境变量参考中。但请注意,这些变量已被弃用 - 您应该将链接别名用作主机名。

通用服务配置

Compose 支持两种共享通用配置的方法:

  1. 扩展整个撰写文件使用多个组合文件

  2. 扩展个人服务大extends场域

多重合成文件

使用多个组合文件可以使您为不同的环境或不同的工作流自定义组合应用程序。

理解多重组合文件

默认情况下,撰写读取两个文件,docker-compose.yml还有一个可选的docker-compose.override.yml档案。根据惯例,docker-compose.yml
包含基本配置。正如其名称所暗示的那样,覆盖文件可以包含对现有服务或全新服务的配置重写。

如果在两个文件中都定义了服务,则使用添加和覆盖配置.

若要使用多个覆盖文件或具有不同名称的重写文件,可以使用-f选项指定文件列表。按照命令行中指定的顺序编写合并文件。docker-compose命令引用有关使用-f

使用多个配置文件时,必须确保文件中的所有路径相对于基本组合文件。这是必需的,因为重写文件不一定是有效的组合文件。覆盖文件可以包含小的配置片段。跟踪服务的哪个片段相对于哪个路径比较困难和混乱,因此,为了使路径更容易理解,必须相对于基文件定义所有路径。

用例

在本节中,有两个用于多个组合文件的常用用例:为不同的环境更改一个组合应用程序,以及对一个复合应用程序运行管理任务。

不同环境

多文件的常见用例是为类似生产环境(可能是生产,分段或CI)更改开发撰写应用程序。为了支持这些差异,你可以将你的 Compose 配置分成几个不同的文件:

从一个基本文件开始,它定义了服务的规范配置。

Docker-Compose.yml

web:
  image: example/my_web_app:latest
  links:    - db    - cache

db:
  image: postgres:latest

cache:
  image: redis:latest

在此示例中,开发配置向主机公开了一些端口,将我们的代码作为卷装入,并构建 Web 图像。

docker-compose.override.yml

web:
  build: .
  volumes:    - '.:/code'
  ports:    - 8883:80
  environment:
    DEBUG: 'true'db:
  command: '-d'
  ports:    - 5432:5432cache:
  ports:    - 6379:6379

当你运行的时候docker-compose up它自动读取重写。

现在,在生产环境中使用 Compose 应用程序将会很好。因此,创建另一个覆盖文件(可能存储在不同的 git 仓库或由不同的团队管理)。

Docker-Compose.prod.yml

web:
  ports:    - 80:80
  environment:
    PRODUCTION: 'true'cache:
  environment:
    TTL: '500'

要使用此产品组合文件进行部署,可以运行

docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d

这将使用docker-compose.ymldocker-compose.prod.yml(但不包括开发配置docker-compose.override.yml)中的配置部署所有三个服务。

有关产品中的 Compose 的更多信息,请参阅产品。

管理任务

另一个常见的用例是针对组合应用程序中的一个或多个服务运行临时或管理任务。此示例演示运行数据库备份。

Docker-Compose.yml 开始

web:
  image: example/my_web_app:latest
  links:    - db

db:
  image: postgres:latest

docker-compose.admin.yml 中添加一个新服务来运行数据库导出或备份。

dbadmin:
  build: database_admin/
  links:    - db

开始正常的环境运行docker-compose up -d。要运行数据库备份,也要包含docker-compose.admin.yml

docker-compose -f docker-compose.yml -f docker-compose.admin.yml \
    run dbadmin db-backup

扩展服务

注意extends关键字在早期的 Compose 文件格式中支持到 Compose 文件版本2.1(请参阅v1中的扩展和第2版中的扩展),但在 Compose 版本3.x中不受支持。请参阅第3版的添加和删除键摘要以及有关如何升级的信息。请参阅 moby / moby#31101 以关注extends在未来版本中以某种形式添加支持的可能性。

Docker Compose 的extends关键字可以在不同文件之间共享通用配置,甚至可以完全共享不同的项目。如果您有多个服务可以重复使用一组通用配置选项,则扩展服务很有用。使用extends
您可以在一个地方定义一套通用的服务选项,并从任何地方引用它。

记住linksvolumes_fromdepends_on从不使用extends服务之间共享。这些例外存在以避免隐式依赖性; 你总是本地定义linksvolumes_from
。这可以确保在读取当前文件时,服务之间的依赖关系清晰可见。在本地定义这些也确保对引用文件的更改不会破坏任何内容。

理解扩展配置

中定义任何服务时docker-compose.yml,您可以声明您正在扩展如下的另一个服务:

web:  extends:
    file: common-services.yml
    service: webapp

此指令将编写为重用webapp中定义的服务。common-services.yml档案。假设common-services.yml看起来是这样的:

webapp:
  build: .
  ports:    - "8000:8000"
  volumes:    - "/data"

在这种情况下,您将得到完全相同的结果,就像您编写docker-compose.yml用同样的buildportsvolumes直接定义在web.

您可以进一步在本地定义(或重新定义)配置docker-compose.yml

web:  extends:
    file: common-services.yml
    service: webapp
  environment:    - DEBUG=1
  cpu_shares: 5important_web:  extends: web
  cpu_shares: 10

您还可以编写其他服务并链接web向他们提供服务:

web:  extends:
    file: common-services.yml
    service: webapp
  environment:    - DEBUG=1
  cpu_shares: 5
  links:    - db
db:
  image: postgres

用例

当您有多个具有公共配置的服务时,扩展单个服务非常有用。下面的示例是一个包含两个服务的撰写应用程序:一个 Web 应用程序和一个队列工作程序。这两个服务使用相同的代码库,并共享许多配置选项。

common.yml 中我们定义了通用配置:

app:
  build: .
  environment:
    CONFIG_FILE_PATH: /code/config
    API_KEY: xxxyyy
  cpu_shares: 5

docker-compose.yml我们定义了使用通用配置的具体服务:

webapp:  extends:
    file: common.yml
    service: app
  command: /code/run_web_app
  ports:    - 8080:8080
  links:    - queue    - db

queue_worker:  extends:
    file: common.yml
    service: app
  command: /code/run_worker
  links:    - queue

添加和覆盖配置

将副本配置从原始服务复制到本地服务。如果在原始服务和本地服务中都定义了配置选项,则本地值取代或扩展原始价值。

对于单值选项imagecommand或者mem_limit,新值替换旧值。

# original service
command: python app.py

# local service
command: python otherapp.py

# result
command: python otherapp.py

buildimage在撰写文件版本1 如属buildimage,使用时编写文件格式的版本1,如果在原始服务中定义了另一个选项,则使用本地服务中的一个选项将导致组合放弃另一个选项。 例如,如果原始服务定义image: webapp本地服务定义build: .则结果服务将具有build: .而不是image选择。 这是因为buildimage不能在版本1文件中一起使用。

对于多值的选项 portsexposeexternal_linksdnsdns_search,和tmpfs,撰写会连接两组的值:

# original service
expose:  - "3000"# local service
expose:  - "4000"  - "5000"# result
expose:  - "3000"  - "4000"  - "5000"

environmentlabelsvolumesdevices情况下,撰写“合并”的条目连同本地定义的值取的优先级:

# original service
environment:  - FOO=original  - BAR=original

# local service
environment:  - BAR=local  - BAZ=local

# result
environment:  - FOO=original  - BAR=local  - BAZ=local

Docker-Compose环境搭建及其使用
https://blog.cikaros.top/doc/d0af4468.html
作者
Cikaros
发布于
2021年12月29日
许可协议