docker-compose.yml 详解

本文详细介绍了 Docker Compose 的配置文件 docker-compose.yml 的各项指令及其用法,包括 image、build、command、links 等关键配置项。

默认的模板文件是 docker-compose.yml,其中定义的每个服务都必须通过 image 指令指定镜像或 build 指令(需要 Dockerfile)来自动构建。

其它大部分指令都跟 docker run 中的类似。

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

image

指定为镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉去这个镜像。

例如:

image: ubuntu
image
: orchardup/postgresql
image
: a4bc65fd

build

指定 Dockerfile 所在文件夹的路径。 Compose 将会利用它自动构建这个镜像,然后使用这个镜像。

build: /path/to/build/dir

command

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

command: bundle exec thin -p 3000

链接到其它服务中的容器。使用服务名称(同时作为别名)或服务名称:服务别名 (SERVICE:ALIAS) 格式都可以。

links:
 
- db
 
- db:database
 
- redis

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

172.17.2.186  db
172.17.2.186  database
172.17.2.187  redis

相应的环境变量也将被创建。

链接到 docker-compose.yml 外部的容器,甚至 并非 Compose 管理的容器。参数格式跟 links 类似。

external_links:
 
- redis_1
 
- project_db_1:mysql
 
- project_db_1:postgresql

ports

暴露端口信息。

使用宿主:容器 (HOST:CONTAINER)格式或者仅仅指定容器的端口(宿主将会随机选择端口)都可以。

ports:
 
- "3000"
 
- "8000:8000"
 
- "49100:22"
 
- "127.0.0.1:8001:8001"

注:当使用 HOST:CONTAINER 格式来映射端口时,如果你使用的容器端口小于 60 你可能会得到错误得结果,因为 YAML 将会解析 xx:yy 这种数字格式为 60 进制。所以建议采用字符串格式。

expose

暴露端口,但不映射到宿主机,只被连接的服务访问。

仅可以指定内部端口为参数

expose:
 
- "3000"
 
- "8000"

volumes

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

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

volumes_from

从另一个服务或容器挂载它的所有卷。

volumes_from:
 
- service_name
 
- container_name

environment

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

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

environment:
  RACK_ENV
: development
  SESSION_SECRET
:

environment
:
 
- RACK_ENV=development
 
- SESSION_SECRET

env_file

从文件中获取环境变量,可以为单独的文件路径或列表。

如果通过 docker-compose -f FILE 指定了模板文件,则 env_file 中路径会基于模板文件路径。

如果有变量名称与 environment 指令冲突,则以后者为准。

env_file: .env

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

环境变量文件中每一行必须符合格式,支持 # 开头的注释行。

# common.env: Set Rails/Rack environment
RACK_ENV
=development

extends

基于已有的服务进行扩展。例如我们已经有了一个 webapp 服务,模板文件为 common.yml。

# common.yml
webapp
:
  build
: ./webapp
  environment:
    - DEBUG=
false
    - SEND_EMAILS=
false

编写一个新的 development.yml 文件,使用 common.yml 中的 webapp 服务进行扩展。

# development.yml
web
:
 
extends:
    file
: common.yml
    service
: webapp
  ports
:
   
- "8000:8000"
  links
:
   
- db
  environment
:
   
- DEBUG=true
db
:
  image
: postgres

后者会自动继承 common.yml 中的 webapp 服务及相关环节变量。

net

设置网络模式。使用和 docker client 的 –net 参数一样的值。

net: "bridge"
net
: "none"
net
: "container:[name or id]"
net
: "host"

pid

跟主机系统共享进程命名空间。打开该选项的容器可以相互通过进程 ID 来访问和操作。

pid: "host"

dns

配置 DNS 服务器。可以是一个值,也可以是一个列表。

dns: 8.8.8.8
dns
:
 
- 8.8.8.8
 
- 9.9.9.9

cap_add, cap_drop

添加或放弃容器的 Linux 能力(Capabiliity)。

cap_add:
 
- ALL

cap_drop
:
 
- NET_ADMIN
 
- SYS_ADMIN

配置 DNS 搜索域。可以是一个值,也可以是一个列表。

dns_search: example.com
dns_search
:
 
- domain1.example.com
 
- domain2.example.com

working_dir, entrypoint, user, hostname, domainname, mem_limit, privileged, restart, stdin_open, tty, cpu_shares

这些都是和 docker run 支持的选项类似。

cpu_shares: 73

working_dir
: /code
entrypoint: /
code/entrypoint.sh
user
: postgresql

hostname
: foo
domainname
: foo.com

mem_limit
: 1000000000
privileged
: true

restart
: always

stdin_open
: true
tty
: true
<think>好的,用户现在想了解docker-compose.yml文件的详细用法,特别是文件格式和命令详解。首先,我需要回顾之前的对话历史。用户之前遇到了LibreOffice处理PDF时的报错问题,我提供了解决方案和相关问题。现在用户转向了Docker Compose的主题,可能是在开发或部署环境中遇到了相关问题。 用户引用了站内的一篇关于docker-compose.yml配置的文章,但提到该引用可能不是他们的真实需求,需要更多参考他们之前的问题和我的回答。之前的回答结构清晰,分步骤说明,并附带了相关问题和引用,所以这次也应该保持类似的结构。 首先,我需要确定用户的需求层次。他们可能刚接触Docker Compose,需要从基础的文件结构讲起,包括常用命令、配置项的作用,以及实际示例。同时,用户提到“命令详解”,可能需要区分docker-compose的命令和docker命令的区别,比如up、start、build等。 接下来,我应该组织内容结构。根据用户提供的引用,他们可能对docker-compose.yml的配置、常用命令、执行顺序、卷的类型以及yml和yaml的区别感兴趣。但用户明确说引用仅供参考,所以需要以他们的实际需求为主,即文件格式和命令详解。 需要涵盖的主要内容点包括: 1. docker-compose.yml的基本结构和语法(YAML格式)。 2. 核心配置项的解释,如services、volumes、networks等。 3. 常用命令的详细说明,如up、down、build、logs等,以及它们的参数。 4. 可能的高级用法,如环境变量、依赖管理、扩展配置等。 5. 示例代码,帮助用户理解如何编写自己的docker-compose文件。 6. 常见问题解答或相关问题的推荐,如用户可能遇到的网络问题、卷挂载问题等。 同时,需要注意用户可能对docker-composedocker命令的区别不太清楚,需要明确说明。例如,docker-compose up与docker-compose start的区别,以及docker-composedocker run的对应关系。 还要考虑用户的实际应用场景,比如多容器应用的编排、开发环境与生产环境的配置差异等。可能需要提供不同场景下的配置示例,例如带有数据库、Web服务器和缓存服务的典型应用栈。 此外,需要确保内容符合格式要求:使用中文,行内数学表达式用$...$,独立公式用$$...$$(不过可能在Docker主题中用得较少),正确使用LaTeX语法,生成相关问题等。 最后,检查是否有需要引用的地方,比如Docker官方文档或最佳实践指南,并添加引用标识。例如,关于版本兼容性或特定配置项的官方说明。 现在需要将这些思考整理成一个结构化的回答,分步骤详细解释docker-compose.yml的各个方面,确保清晰易懂,并附带示例代码和相关问题。同时,保持与之前回答一致的风格,如使用标题、代码块、表格等元素来增强可读性。</think>### Docker Compose配置文件与命令详解 --- #### 一、核心文件结构 Docker Compose采用YAML格式(扩展名`.yml`或`.yaml`),基础结构包含三个核心层级: ```yaml version: "3.8" # 指定语法版本[^1] services: # 容器服务定义 web: image: nginx:alpine ports: - "80:80" volumes: # 持久化存储定义 db_data: {} networks: # 自定义网络配置 app_net: driver: bridge ``` --- #### 二、关键配置项解析 **1. 服务定义(services)** 每个服务对应一个容器实例,支持完整Docker参数: ```yaml app: build: ./dir # 构建上下文路径 image: myapp:1.0 # 优先级高于build depends_on: # 启动顺序控制 - redis - db environment: - NODE_ENV=production env_file: .env # 环境变量文件 ports: - "8080:80" # 主机端口:容器端口 volumes: - type: bind source: ./data target: /app/data ``` **2. 网络配置(networks)** 支持自定义网络隔离: ```yaml networks: frontend: driver: bridge ipam: config: - subnet: 172.28.0.0/24 ``` **3. 存储卷(volumes)** 两种挂载方式对比: | 类型 | 示例 | 数据位置 | |------------|--------------------------|-----------------------| | 命名卷 | `db_data:/var/lib/mysql` | Docker管理目录 | | 绑定挂载 | `./cache:/tmp/cache` | 主机指定路径 | --- #### 三、常用命令操作指南 **1. 生命周期管理** ```bash # 完整构建启动(重建镜像) docker-compose up --build # 仅启动已有容器 docker-compose start # 停止并删除容器 docker-compose down -v # -v清除关联卷 ``` **2. 调试与监控** ```bash # 查看实时日志(带时间戳) docker-compose logs -f --tail=100 --timestamps # 执行容器内命令 docker-compose exec web sh # 资源使用统计 docker-compose stats ``` **3. 扩展操作** ```bash # 水平扩展服务实例 docker-compose up --scale web=3 -d # 强制重建镜像(跳过缓存) docker-compose build --no-cache # 配置验证 docker-compose config ``` --- #### 四、高级配置模式 **1. 多环境配置** 通过`-f`指定多个配置文件: ```bash # 基础配置+覆盖配置 docker-compose -f docker-compose.yml -f docker-compose.prod.yml up ``` 覆盖文件示例: ```yaml services: web: environment: - DEBUG=0 deploy: resources: limits: cpus: '2' memory: 4G ``` **2. 动态变量注入** 使用`${VARIABLE}`语法: ```yaml environment: - API_KEY=${API_KEY:-default} ``` **3. 健康检查配置** ```yaml services: db: healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 10s timeout: 5s retries: 3 ``` --- #### 五、常见问题解答 **Q1: `docker-compose up`与`docker run`有何对应关系?** `docker-compose up`相当于组合执行: ```bash docker build -t image_name . # 如果配置了build docker run -p ports -v volumes image_name ``` **Q2: 如何查看服务依赖关系图?** ```bash docker-compose config --services # 列出所有服务 docker-compose ps --services # 显示运行状态 ``` **Q3: 版本兼容性问题如何解决?** 使用版本检测命令: ```bash docker-compose version # 输出包含:Docker Compose version v2.17.2 ``` 各版本对照表: | Compose文件版本 | Docker Engine最低版本 | |----------------|-----------------------| | 3.8 | 19.03.0+ | | 3.7 | 18.06.0+ | | 2.4 | 17.12.0+ | --- ### 相关问题 1. 如何实现Docker Compose的跨主机部署? 2. Docker Swarm与Docker Compose的主要区别是什么? 3. 如何通过Compose实现容器间的负载均衡? [^1]: Docker官方建议使用与Docker Engine版本兼容的Compose文件格式(参考Docker文档Compose文件版本矩阵)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值