avatar

目录
Docker用法总结之compose文件

书接上文,上一篇介绍了dockerfiledocker-compose的关系,以及dockerfile中的常用指令。本篇将介绍docker-compose文件的写法。

Compose file

Docker-compose.yml是主要用于启动docker容器的配置文件,yaml格式,简单讲就配置容器怎样启动,比如使用哪个镜像、怎样映射端口、如何挂载volume,执行什么命令等等,相当于docker run的参数配置文件。

docker-compose命令根据Docker-compose.yml的内容生成镜像或管理容器(开启/停止/重启/查看/删除…)

此外,Docker-compose还可以用来定义和运行由多个容器组成的应用。

Define and run multi-container applications with Docker
https://docs.docker.com/compose/

格式

yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}

最开头的是版本号,兼容性见下表

Compose file format Docker Engine release
3.7 18.06.0+
3.6 18.02.0+
3.5 17.12.0+
3.4 17.09.0+
3.3 17.06.0+
3.2 17.04.0+
3.1 1.13.1+
3.0 1.13.0+
2.4 17.12.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文件中定义的内容包括services, networksvolumes
默认的compose文件为./docker-compose.yml

services

容器的配置信息在services中定义。即:定义应用中包含的每个容器该如何启动

image

定义容器使用的镜像

yaml
1
2
3
4
5
version: "3"
services:
webapp:
image: redis:4
# ...

build

定义通过docker-compose build命令创建镜像时使用的Dockerfile

yaml
1
2
3
4
version: "3"
services:
webapp:
build: ./dir

通过build来定义Dockerfile所在的目录

也可以通过以下的详细配置,自定义Dockerfile:

yaml
1
2
3
4
5
6
7
8
version: "3"
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1

其中args是在Dockerfile中定义的变量,比如:

dockerfile
1
2
3
4
5
ARG buildno
ARG gitcommithash

RUN echo "Build number: $buildno"
RUN echo "Based on commit: $gitcommithash"

另一种定义格式:

dockerfile
1
2
3
4
build:
context: .
args:
- buildno=1

此外,buildimage可以一起使用,image用于定义生成的镜像名

yaml
1
2
3
4
5
version: "3"
services:
webapp:
image: taqini/myapp
build: ./dir

user

定义默认用户

restart

定义容器挂掉后是否自动重启

environment

定义环境变量

yaml
1
2
3
4
5
6
environment:
- UPLOAD_FOLDER=/var/uploads
- WORKERS=1
- LOG_FOLDER=/var/log/xxx
- ACCESS_LOG=-
- ERROR_LOG=-

volumes

定义挂载的数据卷

yaml
1
2
3
4
5
volumes:
- ./file/bin:/home/ctf:ro
- ./file/config/motd:/etc/motd:ro
- ./file/config/issue:/etc/issue:ro
- ./file/config/legal:/etc/legal:ro

末尾加:ro可控制容器中数据卷权限为只读

若容器中存在同名文件(夹),本地文件将覆盖容器中文件(夹)

注意:若覆盖文件,文件权限也会覆盖

挂载数据卷,可以使得容器与数据(应用程序数据、配置信息等等)分离,这样在更新容器的时候不会丢失数据

ports

定义端口映射 本地:容器

yaml
1
2
3
ports:
- "10080:80"
- "10022:22"

networks

定义网络

command

定义容器默认执行的命令

格式和dockerfile差不多:

yaml
1
2
3
4
5
6
version: "3"
services:
webapp:
build: ./
command: bundle exec thin -p 3000
#command: ["bundle", "exec", "thin", "-p", "3000"]

compose中定义的command会覆盖dockerfile中的CMD

entrypoint

和command类似,不多说了

Next

下一篇介绍docker命令和docker-compose命令

docker命令比较基础,但是命令繁杂

docker-compose像是一个容器管理工具,用起来比较简便

文章作者: TaQini
文章链接: http://taqini.space/2020/03/04/note-for-docker-2/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 TaQini
打赏
  • Wechat
    Wechat
  • Alipay
    Alipay

评论