Docker-compose 编排

  • 日常 docker-compose 编排时的一些坑及绕过

  • 资料来源:

    https://github.com/hedzr/docker-compose-file-format

  • 更新

    1
    2
    2021.03.22 初始
    2021-05-16 填坑

导语

一不小心又忘了这个坑还没填…

同理,这一篇不是教程,只是个人写 docker-compose 时一些总结.

避免重复编译

有多个 docker 每个都指定 build 时,docker-compose 会按照容器名生成 image 名..于是有了一堆相同 image 却是不同名.

其实只要同时指定 image 就可以了这个应该刚开始使用 docker-compse 时没好好找资料的锅

1
2
3
build:
context: ./docker
image: image:latest

第一次 build 时会使用 image:latest 作为 image 名字.

以后每次 up 时都会看看有没有 image:latest 存在,没有再进行编译.

远程仓库 build 避免 git clone

有时直接使用 github 开源的 dockerfile 总是少不了 git clone.

依旧是后知后觉, build: context可以直接写入 git repository 的 url.避免每次手动的 git clone.

ps: context 还支持相对路径/绝对路径.

限制 log 文件大小

从网上抄的,出处忘记了.这里指定文件最大 50mb 最大存到 10 个文件.

1
2
3
4
5
logging:
driver: json-file
options:
max-size: "50m"
max-file: "10"

相同网络主机名互通

不同容器之间互通,注重性能就都用 host 网络,通过端口区分.不太介意可以分配到同一个 network 下直接使用名称互相访问.还能指定别名或多个别名.

1
2
3
4
5
6
7
8
9
10
services:
some-service:
networks:
some-network:
aliases:
- alias1
- alias3
other-network:
aliases:
- alias2

环境变量/拓展字段重用

docker-compose 是可以直接读取系统的环境变量的.使用 $(VAR)$VAR.

还可以在 docker-compose 的文件夹下新建 .env 文件,提供环境变量的默认值,定义新的环境变量.

这样能够将部分变动的配置从 yml 中分离出来.但是还不够.期望重用网络/ log 限制等配置需要使用拓展字段.(3.4/3.7 以上适用)

拓展字段

拓展字段类似大段的宏定义.

  • 必须要在 yml 文件顶级声明.
  • x- 开始
  • & 后面是名称
  • name 字段可有可无

拓展字段的结果是纯文本添加,不能识别层级或其他错误

1
2
3
4
5
6
x-logging:
&default-logging
options:
max-size: '12m'
max-file: '5'
driver: json-file

使用

  • 可以直接 logging: *default-logging,全部展开,不替换,
  • << : *default-logging,使用 yaml 的语法,替换部分默认值.
1
2
3
4
5
6
7
8
9
10
services:
web:
image: myapp/web:latest
logging: *default-logging

web2:
image: myapp/web:latest
logging:
<< : *default-logging
max-file: '4'

拓展字段是个人使用后感觉最重要的,终于告别大段的重复配置了.

启动多个 docker-compose 文件

docker-compose 支持 -f 导入多个文件,会自动合成一个执行动作.

但是就是懒,-f 麻烦的要死,version 2 中有个关键词 extend..但是 version 3 没了..(类似的还有网络定义中 ipv6 的支持…)

曲线救国

  • 默认文件 docker-compose.ymldocker-compose.override.yml
  • docker-compose 会读取 docker-compose.ymldocker-compose.override.yml 合并,不需要 -f
  • 曲线偷懒吧…