什么是Docker-Compose
Docker-Compose 项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。
在单个机器上部署和管理繁多的Docker容器是困难的,而这正是 Docker Compose 要解决的问题。Docker Compose 并不是通过脚本和各种冗长的 docker 命令来将应用组件组织起来,而是通过一个声明式的配置文件描述整个应用,从而使用一条命令完成部署。应用部署成功后,还可以通过一系列简单的命令实现对其完整声明周期的管理。甚至,配置文件还可以置于版本控制系统中进行存储和管理。
Docker-Compose 项目由 Python 编写,调用 Docker 服务提供的API来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用Compose 来进行编排管理。
Compose、Machine 和 Swarm 是Docker 原生提供的三大编排工具。简称Docker三剑客。
Compose模板文件
Compose模板文件是一个定义服务、网络和卷的YAML文件,它定义一组相关联的应用容器为一个项目(project)。有了Docker-Compose,不需要使用shell命令来启动容器,而是使用Compose模板文件来配置应用程序需要的所有服务,然后使用一个命令,根据Compose模板文件的配置创建并启动所有服务。
.yml
或.yaml
作为文件扩展名,文件默认为 docker-compose.yml
,可通过环境变量 COMPOSB_FILE
或 -f
参数自定义文件名。version
、services
、networks
三大部分。安装Docker-Compose
1 | yum -y install docker-compose |
image
指定镜像名称或镜像id,使用此镜像。如果本地不存在这个镜像,Compose会从镜像仓库去拉取这个镜像
1 | services: |
build
指定Dockerfile所在文件夹的路径。Compose将会利用此文件夹中的Dockerfile文件自动构建这个镜像,然后使用这个镜像。
1 | services: |
command
覆盖容器启动后默认执行的命令。
1 | image: nginx:1.14 |
links
连接到其他服务容器,使用服务名称(同时作为别名)或服务别名(SERVICE:ALIAS)都可以
注意:用别名会自动在容器中的/etc/hosts 里创建解析名,相应的环境变量也会被创建。
1 | links: |
external_links
链接到docker-compose.yml外部的容器,甚至并非是Compose管理的容器。参数格式和links类似。
1 | external_links: |
ports
指定暴露的端口,或者仅仅指定容器的端口(宿主机器将会随机分配端口),格式:宿主机端口:容器端口
。
注意:建议采用字符串写法,因为如果使用的容器端口小于 60 可能会得到错误的结果,因为 YAML 会将解xx:yy这种数字格式解析为 60 进制。
1 | ports: |
expose
也是指定暴露的端口,与posts不同的是expose只是提供一个声明,便于使用。
1 | expose: |
volumes
设置卷挂载的路径,可以设置宿主机路径:容器路径
,也可以设置卷名:容器路径
(卷名若不存在会自动创建),或加上访问模式
1 | volumes: |
volumes_from
挂载另一个服务或容器的所有数据卷,使用相同的卷名和目录。
1 | volumes_from: |
environment
设置环境变量。如果只给定变量的名称则会自动加载它在Compose主机上的值,可以用来防止泄露不必要的数据。
1 | environment: |
env_file
从文件中获取环境变量,基于Compose模板文件的相对路径,可以为单独的文件或列表。如果有变量与environment指令冲突则以后者为准。
1 | env_file: .env |
注意:环境变量文件格式如下,每一行都必须有#开头的注释行
1 | # common.env: Set Rails/Rack environment |
net
设置网络模式,与docker run
命令中的 --network
选项一样
1 | net: "bridge" # 可选:none/host/container:容器名/自定义网络名 |
dns
配置DNS服务器。可以是一个值,也可以是一个列表
1 | dns: 8.8.8.8 |
depends_on
依赖的服务,优先启动
1 | depends_on: |
deploy
部署相关的配置都在这里,若无特殊需求,下面的例子可以通用
1 | deploy: |
命令格式:
1 | docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...] |
常用选项:
1 | -f 文件名 指定docker-compose模板文件,默认是当前目录下的docker-compose.yml |
1 | Commands: |
docker-compose up
启动项目中的容器
1 | docker-compose up [options] [--scale SERVICE=NUM...] [SERVICE...] |
1 | docker-compose up # 启动所有服务 |
docker-compose down
停止并且删除项目中定义的容器和网络
1 | docker-compose down [options] |
1 | docker-compose down --rmi 镜像类型 # 顺便把镜像也删了,all:删除所有用到的镜像;local:仅删除未指定标签的镜像 |
docker-compose ps
列出项目中目前的所有容器
1 | docker-compose ps [options] [SERVICE...] |
1 | docker-compose ps # 列出项目中目前的所有容器 |
docker-compose stop
停止正在运行的容器
1 | docker-compose stop [options] [SERVICE...] |
1 | docker-compose stop # 停止所有正在运行的容器 |
docker-compose start
启动已经存在的容器
1 | docker-compose start [SERVICE...] |
1 | docker-compose start # 启动已经存在的容器 |
docker-compose restart
重启正在运行的容器
1 | docker-compose restart [options] [SERVICE...] |
1 | docker-compose restart -t 20 # 重启运行中的容器,默认超时时间是10s |
docker-compose logs
查看服务容器的输出
1 | docker-compose logs [options] [SERVICE...] |
1 | docker-compose logs # 展示所有容器的输出 |
docker-compose build
构建(重新构建)项目中的容器,当更改了构建目录或者服务的Dockerfile文件时,可以使用此命令
1 | docker-compose build [options] [--build-arg key=val...] [SERVICE...] |
1 | docker-compose build # 重新构建所有容器 |