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

相同的服务可以在不同的网络有不同的别名。