docker-compose实践介绍

本文介绍了Docker-Compose在容器编排中的应用,详细解析了docker-compose.yml文件的各个指令,包括build、cap_add、cap_drop等,阐述了如何通过Docker-Compose实现多容器的管理和部署,以及其特点和优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

容器编排docker-compose

docker-compose.yml文件是一个 YAML 文件,用于定义 Docker 容器在生产中的行为方式。
将 Compose 文件设置为 version:“3”。本质上,这会使其兼容 swarm mode。我们可以使用 docker stack deploy 命令(仅在 Compose 文件版本 3.x 及更高版本上受支持)运行此文件。您可以使用 docker-compose up 运行具有_非 swarm_ 配置的版本 3 文件。

技术栈

技术栈是一组相关的服务,它们共享依赖项并且可以一起进行编排和扩展。单个技术栈能够定义和协调整个应用的功能(虽然很复杂的应用程序可能需要使用多个技术栈)。

特点

1、单个主机上多个隔离环境
2、创建容器时保留数据卷
3、仅创建已经修改的容器
4、通过变量来定制环境变量

docker-compose中的一些指令

1、build
build:
  context: ./dir
  dockerfile: Dockerfile-alternate
  args:
    - buildno: 1
    - password=secret
  cache_from:
    - alpine:latest
    - corp/web_app:3.14
  labels:
    com.example.description: "Accounting webapp"
    com.example.department: "Finance"

context:说明dockerfile的路径
dockerfile:备用dockerfile,还必须指定构建路径
args:添加的构建参数
cache_from:所列出的镜像将被引擎用来缓存
labels:使用Docker标签将元数据添加到生成的图像中。您可以使用数组或字典

2、cap_add、cap_drop

添加或删除容器功能

cap_add:
  - ALL

cap_drop:
  - NET_ADMIN
  - SYS_ADMIN
3、command

覆盖默认command命令

command: bundle exec thin -p 3000
4、configs

在每个服务中使用configs为每个服务授予config权限,支持两种语法变体。

  • SHORT SYNTAX
    短语法变体仅指定配置名称。这将授予容器对配置的访问权限并将其挂载在容器的/<config_name>的目录下。源名称和目标安装点都设置为配置名称。
version: "3.3"
services:
  redis:
    image: redis:latest
    deploy:
      replicas: 1
    configs:
      - my_config
      - my_other_config
configs:
  my_config:
    file: ./my_config.txt
  my_other_config:
    external: true

my_other_config被定义为外部资源,这意味着它已经在Docker中定义,可以通过运行docker config create命令或通过其他堆栈部署来定义。如果外部配置不存在,则堆栈部署将失败,并显示config not found错误

  • LONG SYNTAX
    长语法提供了在服务的任务容器中如何创建配置的更多粒度。
version: "3.3"
services:
  redis:
    image: redis:latest
    deploy:
      replicas: 1
    configs:
      - source: my_config
        target: /redis_config
        uid: '103'
        gid: '103'
        mode: 0440
configs:
  my_config:
    file: ./my_config.txt
  my_other_config:
    external: true

数字UID或GID,它将在服务的任务容器中拥有已安装的配置文件。如果未指定,则在Linux上默认为0。 Windows不支持。
mode:将以八进制表示法在服务的任务容器中装入的文件的权限。例如,0444表示世界可读。默认值为0444

5、cgroup_parent

为容器指定可选的父cgroup。

cgroup_parent: m-executor-abcd
6、container_name

指定自定义容器名称,而不是生成的默认名称。容器名应该唯一,不然无法扩展到外面去。

container_name: my-web-container
7、credential_spec

配置托管服务帐户的凭据规范(仅限Windows)

credential_spec:
  file: c:/WINDOWS/my-credential-spec.txt

credential_spec:
  registry: HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization\Containers\CredentialSpecs
8、deploy

指定与部署和运行服务相关的配置。这仅在部署到具有docker堆栈部署的群集时生效,并且被docker-compose up和docker-compose run忽略。

version: '3'
services:
  redis:
    image: redis:alpine
    deploy:
	  mode: global
      replicas: 6
      placement:
        constraints:
          - node.role == manager
          - engine.labels.operatingsystem == ubuntu 14.04
      update_config:
        parallelism: 2
        delay: 10s
      resources:
        limits:
          cpus: '0.001'
          memory: 50M
        reservations:
          cpus: '0.0001'
          memory: 20M
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
        window: 120s
      labels:
        com.example.description: "This label will appear on the web service"
  • MODE
    global(每个群集节点恰好一个容器)或replicated(指定数量的容器)。默认值global。

  • REPLICAS
    如果mode是replicated,指定在任何给定时间应该运行的容器数。

  • PLACEMENT
    指定放置约束。

  • UPDATE_CONFIG
    配置服务应如何更新。用于配置滚动更新。

parallelism:一次更新的容器数。
delay:更新一组容器之间的等待时间。
failure_action:如果更新失败怎么办。继续或暂停之一(默认值:暂停)。
monitor:每次更新任务后的持续时间以监视失败(ns | us | ms | s | m | h)(默认为0)。
max_failure_ratio:更新期间容忍的失败率。
  • RESOURCES
    配置资源限制。这将替换版本3之前的Compose文件中的旧资源约束选项(cpu_shares,cpu_quota,cpuset,mem_limit,memswap_limit,mem_swappiness)

  • RESTART_POLICY
    配置是否以及如何在容器退出时重新启动容器。替换restart.

restart: "no"
restart: always
restart: on-failure
restart: unless-stopped
condition:none,on-failure或any(默认值:any)之一。
delay:重新启动尝试之间等待的时间,指定为持续时间(默认值:0)。
max_attempts:在放弃之前尝试重启容器的次数(默认值:never give up)。
window:在判断重启是否成功之前等待多长时间,指定为持续时间(默认值:立即决定)。
  • LABELS
    指定服务的标签。这些标签只能在服务上设置,而不能在服务的任何容器上设置。
9、其他
build
cgroup_parent
container_name
devices
dns
dns_search
tmpfs
external_links
links
network_mode
security_opt
stop_signal
sysctls
userns_mode
10、devices

设备映射列表。使用与–device docker client create选项相同的格式。

devices:
  - "/dev/ttyUSB0:/dev/ttyUSB0"
11、depends_on

服务之间的快速依赖关系,有两个影响:

  • docker-compose up将按依赖顺序启动服务。在以下示例中,db和redis将在web之前启动。
  • docker-compose up SERVICE将自动包含SERVICE的依赖项。在以下示例中,docker-compose up web还将创建并启动db和redis。
version: '3'
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres
11、dns

自定义DNS服务器。可以是单个值或列表。

dns: 8.8.8.8
dns:
  - 8.8.8.8
  - 9.9.9.9
12、dns_search

自定义DNS搜索域。可以是单个值或列表。

dns_search: example.com
dns_search:
  - dc1.example.com
  - dc2.example.com
13、tmpfs

在容器内安装临时文件系统。可以是单个值或列表。

tmpfs: /run
tmpfs:
  - /run
  - /tmp
14、entrypoint

覆盖默认的entrypoint。可以是个列表

entrypoint: /code/entrypoint.sh
entrypoint:
    - php
    - -d
    - zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so
    - -d
    - memory_limit=-1
    - vendor/bin/phpunit
15、env_file

从文件添加环境变量。可以是单个值或列表。
如果已使用docker-compose -f FILE指定了Compose文件,则env_file中的路径相对于该文件所在的目录。
环境中指定的环境变量会覆盖这些值

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

如果您的服务指定了构建选项,则在构建期间,环境文件中定义的变量将不会自动显示。使用build的args子选项来定义构建时环境变量。
环境文件的顺序非常重要,当放在下面的文件中定义的变量在上面文件中已经定义过时,则下面的则会覆盖上面的。
16、environment
添加环境变量。您可以使用数组或字典。任何布尔值; true,false,yes no,需要用引号括起来,以确保YML解析器不会将它们转换为True或False。
仅具有键的环境变量将解析为计算机正在运行的计算机上的值,这对于特定于机密或特定于主机的值很有用。

environment:
  RACK_ENV: development
  SHOW: 'true'
  SESSION_SECRET:

environment:
  - RACK_ENV=development
  - SHOW=true
  - SESSION_SECRET

如果您的服务指定了构建选项,则在构建期间,环境中定义的变量将不会自动显示。使用build的args子选项来定义构建时环境变量。

17、expose

暴露端口而不将它们发布到主机 - 它们只能被链接服务访问。只能指定内部端口。

18、ports

暴露端口

ports:
 - "3000"
 - "3000-3005"
 - "8000:8000"
 - "9090-9091:8080-8081"
 - "49100:22"
 - "127.0.0.1:8001:8001"
 - "127.0.0.1:5000-5010:5000-5010"
 - "6060:6060/udp"
19、external_links

链接到此docker-compose.yml之外或甚至在Compose之外的容器,尤其是对于提供共享或公共服务的容器。在指定容器名称和链接别名(CONTAINER:ALIAS)时,external_links遵循类似于遗留选项链接的语义。

external_links:
 - redis_1
 - project_db_1:mysql
 - project_db_1:postgresql
20、healthcheck

配置运行的检查以确定此服务的容器是否“健康”。

21、image

定义容器镜像

22、isolation

指定容器的隔离技术。在Linux上,唯一受支持的值是default。在Windows上,可接受的值是default,process和hyperv。有关详细信息

23、labels

使用Docker标签向容器添加元数据。您可以使用数组或字典。

24、links

链接到另一个服务中的容器。指定服务名称和链接别名(SERVICE:ALIAS),或仅指定服务名称。

web:
  links:
   - db
   - db:database
   - redis
25、logging
logging:
  driver: syslog
  options:
    syslog-address: "tcp://192.168.0.42:123"
    max-size: "200k"
    max-file: "10"

其中默认driver是json-file

driver: "json-file"
driver: "syslog"
driver: "none"
26、network_mode
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
27、networks

要加入的网络,引用顶级网络密钥下的条目。必须在全局的networks下有定义。

  • ALIASES
    网络上此服务的别名(备用主机名)。同一网络上的其他容器可以使用服务名称或此别名连接到其中一个服务的容器。
  • IPV4_ADDRESS, IPV6_ADDRESS
    在加入网络时为此服务指定容器的静态IP地址。
version: '2.1'

services:
  app:
    image: busybox
    command: ifconfig
    networks:
      app_net:
        ipv4_address: 172.16.238.10
        ipv6_address: 2001:3984:3989::10

networks:
  app_net:
    driver: bridge
    enable_ipv6: true
    ipam:
      driver: default
      config:
      -
        subnet: 172.16.238.0/24
      -
        subnet: 2001:3984:3989::/64
28、extra_hosts
extra_hosts:
 - "somehost:162.242.195.82"
 - "otherhost:50.31.209.229"

将在此服务的容器内的/ etc / hosts中创建具有ip地址和主机名的条目,例如:

162.242.195.82  somehost
50.31.209.229   otherhost
29、volumes

在全局volumes选项中定义了命名卷并且被其他服务卷列表所参考。命名卷必须在全局中有定义

version: '2'

services:
  db:
    image: postgres
    volumes:
      - data:/var/lib/postgresql/data

volumes:
  data:
    external: true
	  name: actual-name-of-volume
  • driver
    指定应为此卷使用哪个卷驱动程序。默认为Docker Engine配置使用的任何驱动程序,在大多数情况下是本地的。如果驱动程序不可用,则当docker-compose尝试创建卷时,Engine将返回错误。

  • driver_opts
    将选项列表指定为键值对,以传递给此卷的驱动程序。

 driver_opts:
    foo: "bar"
    baz: 1
  • external

如果设置为true,则指定已在Compose之外创建此卷。 docker-compose up不会尝试创建它,如果它不存在则会引发错误。
external不能与其他卷配置键(driver,driver_opts)一起使用。
在下面的示例中,Compose不会尝试创建名为[projectname] _data的卷,而是查找仅称为数据的现有卷,并将其挂载到db服务的容器中。

version: '2'

services:
  db:
    image: postgres
    volumes:
      - data:/var/lib/postgresql/data

volumes:
  data:
    external: true

您还可以在Compose文件中与用于引用它的名称分别指定卷的名称:

volumes:
  data:
    external:
      name: actual-name-of-volume
  • labels
    使用Docker标签向容器添加元数据。您可以使用数组或字典。
    建议您使用反向DNS表示法来防止标签与其他软件使用的标签冲突。
30、domainname, hostname, ipc, mac_address, privileged, read_only, shm_size, stdin_open, tty, user, working_dir

每个都是单个值,类似于docker run对应物。

user: postgresql
working_dir: /code

domainname: foo.com
hostname: foo
ipc: host
mac_address: 02:42:ac:11:65:43

privileged: true


read_only: true
shm_size: 64M
stdin_open: true
tty: true
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值