1 docker-compose.yml 结构
docker-compose.yml文件分为三个主要部分:services、networks、volumes
.
- services主要用来定义各个容器。
- networks定义需要使用到的network.
- volumes定义services使用到的volume.
服务(service)定义包含应用于为该服务启动的每个容器的配置,就像传递命令行参数给docker container create一样。同样,网络和卷的定义类似于给 docker network create 和 docker volume create传递参数。
正如 docker container create 在 Dockerfile 指定选项,如 CMD、 EXPOSE、VOLUME、ENV,在默认情况下,不需要在docker-compose.yml中再次指定它们。
2 services
2.1 build
使用当前目录下的Dockerfile进行构建。
version: '3'
services:
web:
build: ./
假设当前文件夹名为composetest,构建出来的镜像名 composetest_web,运行出来的容器名:composetest_web_1
如果docker-compose up的时候,composetest_web镜像不存在,才会构建。docker-compose build 会重新构建镜像,原来的镜像变成
build也可以指定文件路径,Dockerfile的名字.
version: '3'
services:
web:
build:
context: ./
dockerfile: mydockerfile
2.2 image
指定运行容器使用的镜像。以下格式都可以。
- image: redis
- image: ubuntu:14.04
- image: tutum/influxdb
- image: example-registry.com:4000/postgresql
- image: a4bc65fd
如果本地不存在指定的镜像,则会从repository pull下来。
如果定义了build,那么image指定的就是build后的镜像的名字和tag。
version: '3'
services:
web:
build: ./
image: web:1.0
2.3 container_name
默认运行出来的容器名:composetest_web_1, 是当前目录名+定义service名+数量
想要修改的话,指定container_name字段。
version: '3'
services:
web:
build: ./
image: web:1.0
container_name: myweb
2.4 command
覆盖容器启动后默认执行的命令(Dockerfile定义的CMD)。当Dockerfile定义了entrypoint的时候,docker-comose.yml定义的command会被覆盖。
version: '3'
services:
web:
build: ./
command: env
2.5 entrypoint
可以覆盖Dockerfile中定义的entrypoint命令。
version: '3'
services:
web:
build: ./
entrypoint: python app.py
还可以写成如下格式
version: '3'
services:
web:
build: ./
entrypoint:
- python
- app.py
entrypoint没有执行启动server的命令,而是echo hello world, 那么在docker-compose up的过程中不会打印出hello worl, docker logs 查看容器才能看到hello world
version: '3'
services:
web:
build: ./
entrypoint:
- echo
- hello world
[vagrant@docker composetest]$ docker logs composetest_web_1
hello world
2.6 env_file
定义了在docker-compose.yml中使用的变量, 封装变化,提高docker-compose.yml文件的灵活性。
env_file: .env
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
.env文件中格式 key:value
RACK_ENV=development
DB_PORT=3306
使用方式和bash一样, $DB_PORT 的值为3306.
.env文件中定义的变量。会被写入到容器中,成为容器中的环境变量。
2.7 environment
enviroment定义的变量会覆盖.env文件中定义的重名环境变量
environment:
RACK_ENV: development
SHOW: 'true'
SESSION_SECRET:
environment:
- RACK_ENV=development
- SHOW=true
- SESSION_SECRET
2.8 ports
将容器的端口80映射到宿主机的端口8080
ports:
- "8080:80"
- "127.0.0.1:8080:80"
注意:当使用HOST:CONTAINER格式来映射端口时,如果你使用的容器端口小于60你可能会得到错误得结果,因为YAML将会解析xx:yy这种数字格式为60进制。所以建议采用字符串格式。
3 volumes
挂载一个目录或者一个已存在的数据卷容器,
HOST:CONTAINER 格式定义共享的目录
HOST:CONTAINER:RO 定义容器只读的目录。
volumes:
- ./conf.d:/etc/nginx/conf.d
# nginx.conf对容器来说只读
- ./nginx.conf:/etc/nginx/nginx.conf:ro
4 networks
加入指定网络
services:
some-service:
networks:
- some-network
- other-network
关于这个标签还有一个特别的子标签aliases,这是一个用来设置服务别名的标签
services:
some-service:
networks:
some-network:
aliases:
- alias1
- alias3
other-network:
aliases:
- alias2
相同的服务可以在不同的网络有不同的别名。