容许用户经过一个单独的 docker-compose.yml
模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。php
两个重要的概念:mysql
一个项目能够由多个服务(容器)关联而成,Compose 面向项目进行管理。nginx
默认的模板文件名称为 docker-compose.yml
,格式为 YAML 格式。web
每一个服务都必须经过 image
指令指定镜像或 build
指令(须要 Dockerfile)等来自动构建生成镜像。redis
若是使用 build
指令,在 Dockerfile
中设置的选项(例如:CMD, EXPOSE, VOLUME, ENV 等) 将会自动被获取,无需在 docker-compose.yml
中再次设置。sql
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
复制代码
指定 Dockerfile
所在文件夹的路径(能够是绝对路径,或者相对 docker-compose.yml 文件的路径)。 Compose 将会利用它自动构建这个镜像,而后使用这个镜像。docker
build: docker/redis
# 使用 context 指令指定 Dockerfile 所在文件夹的路径
# 使用 dockerfile 指令指定 Dockerfile 文件名
# 使用 arg 指令指定构建镜像时的变量。
# 使用 cache_from 指定构建镜像的缓存
build:
context: .
dockerfile: docker/nginx-php7/Dockerfile
args:
buildno: 1
cache_from:
- alpine:latest
- corp/web_app:3.14
复制代码
指定为镜像名称或镜像 ID。若是镜像在本地不存在,Compose 将会尝试拉取这个镜像。ubuntu
image: ubuntu
复制代码
覆盖容器启动后默认执行的命令缓存
command: echo "hello world"
复制代码
指定容器名称。默认将会使用 项目名称_服务名称_序号 这样的格式。bash
container_name: docker-web-container
复制代码
指定设备映射关系
devices:
- "/dev/ttyUSB1:/dev/ttyUSB0"
复制代码
解决容器的依赖、启动前后的问题。如下例子中会先启动 redis db 再启动 web
version: '3'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
复制代码
自定义 DNS 服务器。能够是一个值,也能够是一个列表。
dns: 8.8.8.8
dns:
- 8.8.8.8
- 114.114.114.114
复制代码
从文件中获取环境变量,能够为单独的文件路径或列表。
env_file: .env
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
复制代码
设置环境变量。若是变量名称或者值中用到 true|false,yes|no 等表达 布尔 含义的词汇,最好放到引号里
environment:
RACK_ENV: development
SESSION_SECRET:
environment:
- RACK_ENV=development
- SESSION_SECRET
复制代码
暴露端口,但不映射到宿主机,只被链接的服务访问,仅能够指定内部端口为参数
expose:
- "3000"
- "8000"
复制代码
暴露端口信息。使用宿主端口:容器端口 (HOST:CONTAINER) 格式,或者仅仅指定容器的端口(宿主将会随机选择端口)均可以。
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
复制代码
为容器添加 Docker 元数据(metadata)信息。例如能够为容器添加辅助说明信息。
labels:
com.startupteam.description: "webapp for a startup team"
com.startupteam.department: "devops department"
com.startupteam.release: "rc3 for v1.0"
复制代码
配置容器链接的网络
networks:
some-network:
other-network:
复制代码
存储敏感数据,例如 mysql 服务密码。
mysql:
image: mysql
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_password
secrets:
- db_root_password
- my_other_secret
复制代码
数据卷所挂载路径设置。能够设置宿主机路径 (HOST:CONTAINER) 或加上访问模式 (HOST:CONTAINER:ro)。
该指令中路径支持相对路径。
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro
复制代码
Compose 模板文件支持动态读取主机的系统环境变量和当前目录下的 .env 文件中的变量。经过${变量名}
读取
# ${MONGO_VERSION}会读取env文件中的值
version: "3"
services:
db:
image: "mongo:${MONGO_VERSION}"
复制代码
对于 Compose 来讲,大部分命令的对象既能够是项目自己,也能够指定为项目中的服务或者容器。若是没有特别的说明,命令对象将是项目,这意味着项目中全部的服务都会受到命令影响。
构建(从新构建)项目中的服务镜像
运行 compose 项目
# 在后台启动并运行全部的容器
$ docker-compose up -d
复制代码
中止 up 命令所启动的容器,并移除网络
验证 Compose 文件格式是否正确,若正确则显示配置,若格式错误显示错误缘由。
进入指定的容器
$ docker-compose exec <容器名(docker-compose.yml定义的名)> bash
复制代码
列出 Compose 文件中包含的镜像
强制中止服务容器
$ docker-compose kill [容器名(docker-compose.yml定义的名)]
复制代码
$ docker-compose log [容器名(docker-compose.yml定义的名)]
复制代码
暂停服务容器
$ docker-compose pause [容器名(docker-compose.yml定义的名)]
复制代码
列出项目中目前的容器
$ docker-compose ps [容器名(docker-compose.yml定义的名)]
# 只打印容器ID
$ docker-compose ps -q [容器名(docker-compose.yml定义的名)]
复制代码
拉取服务依赖的镜像
$ docker-compose pull [容器名(docker-compose.yml定义的名)]
复制代码
重启项目中的服务
$ docker-compose restart [容器名(docker-compose.yml定义的名)]
复制代码
删除全部(中止状态的)服务容器。
须要执行 docker-compose stop 命令来中止容器。
$ docker-compose rm [容器名(docker-compose.yml定义的名)]
复制代码
$ docker-compose start [容器名(docker-compose.yml定义的名)]
复制代码
$ docker-compose stop [容器名(docker-compose.yml定义的名)]
复制代码