Docker-Compose是Docker的一种编排服务,是一个用于在Docker上定义并运行复杂应用的工具,可以让用户在集群中部署分布式应用。
通过Docker-Compose用户可以很容易地用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。Docker-Compose解决了容器与容器之间如何管理编排的问题。
Docker Compose 工作原理图
安装Docker-Compose
Docker-Compose
- 如Docker-Compose文件格式为2.0,Docker Engine版本必须大于1.10.0
- 如Docker-Compose文件格式为1.0,Docker Engine版本必须大于1.9.1
安装Docker-Compose
这里使用的是阿里云镜像安装,速度比官方的快一些。
1 | $ curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh - |
- 方法一
通过pip安装(推荐)
1 | Note: pip version 6.0 or greater is required |
验证安装成功
1 | $ pip list|grep compose |
- 方法二
直接使用二进制文件
1 | $ curl -L https://github.com/docker/compose/releases/download/1.7.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose |
你可以通过修改URL中的版本,可以自定义您的需要的版本。
Docker Compose存放在GitHub,国内访问比较慢。你可以也通过执行下面的命令,使用国内镜像安装Docker Compose。
1 | $ curl -L https://get.daocloud.io/docker/compose/releases/download/1.7.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose |
验证安装成功
1 | $ docker-compose --version |
添加SHELL的TAB补全
- Bash
安装bash-completion
Debian/Ubuntu
1 | $ apt-get install bash-completion |
Centos
1 | $ yum install bash-completion |
MAC
1 | $ brew install bash-completion |
下载docker-compose脚本
1 | $ curl -L https://raw.githubusercontent.com/docker/compose/$(docker-compose version --short)/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose |
重新登陆后就生效了
- ZSH
下载脚本
1 | $ mkdir -p ~/.zsh/completion |
编辑zshrc
1 | $ vim ~/.zshrc |
- Oh My ZSH
1 | $ vim ~/.zshrc |
- 重新加载SHELL
1 | $ exec $SHELL -l |
卸载Docker-Compose
- 通过二进制文件
1 | $ rm /usr/local/bin/docker-compose |
- 通过pip安装
1 | $ pip uninstall docker-compose |
使用Docker-Compose
Docker-Compose常用命令
查看docker-compose的用法
1 | $ docker-compose |
Docker-Compose命令说明
大部分命令都可以运行在一个或多个服务上。如果没有特别的说明,命令则应用在项目所有的服务上。
执行docker-compose [COMMAND] --help
查看具体某个命令的使用说明。
基本的使用格式
1 | docker-compose [options] [COMMAND] [ARGS...] |
常用选项
1 | -f, --file FILE 指定启动模版文件(一个非docker-compose.yml命名的yaml文件,默认为docker-compose.yml) |
常用命令
- build
构建或重新构建服务。
服务一旦构建后,将会带上一个标记名,例如 web_db。
可以随时在项目目录下运行 docker-compose build 来重新构建服务。
- help
获得一个命令的帮助。
- kill
通过发送SIGKILL信号来强制停止服务容器。支持通过参数来指定发送的信号,例如 docker-compose kill -s SIGINT
- logs
查看服务的输出。
- port
打印绑定的公共端口。
- ps
输出运行的容器列表。
- pull
拉取服务镜像。
- rm
删除停止的服务容器。
- run
在一个服务上执行一个命令。例如:docker-compose run ubuntu ping docker.com
将会启动一个ubuntu 服务,执行 ping docker.com
命令。
默认情况下,所有关联的服务将会自动被启动,除非这些服务已经在运行中。该命令类似启动容器后运行指定的命令,相关卷、链接等等都将会按照期望创建。
如果不希望自动启动关联的容器,可以使用 --no-deps
选项,例如 docker-compose run --no-deps web python manage.py shell
将不会启动 web 容器所关联的其它容器。
- scale
设置同一个服务运行的容器个数。
通过 service=num 的参数来设置数量。例如:docker-compose scale web=2 worker=3
- start
启动一个已经存在的服务容器。
- stop
停止一个已经运行的容器,但不删除它。通过 docker-compose start
可以再次启动这些容器。
- restart
重启服务容器
- up
构建,(重新)创建,启动,链接一个服务相关的容器。链接的服务都将会启动,除非他们已经运行。
默认情况, docker-compose up
将会整合所有容器的输出,并且退出时,所有容器将会停止。如果使用 docker-compose up -d
,将会在后台启动并运行所有的容器。
默认情况,如果该服务的容器已经存在, docker-compose up
将会停止并尝试重新创建他们(保持使用 volumes-from
挂载的卷),以保证 docker-compose.yml
的修改生效。如果你不想容器被停止并重新创建,可以使用 docker-compose up --no-recreate
。如果需要的话,这样将会启动已经停止的容器。
- pause
暂停容器服务
- version
显示Docker-Compose版本信息
- 环境变量
环境变量可以用来配置Compose的行为。
以DOCKER_开头的变量和用来配置 Docker 命令行客户端的使用一样。
COMPOSE_PROJECT_NAME
设置通过Compose启动的每一个容器前添加的项目名称,默认是当前工作目录的名字。
COMPOSE_FILE
设置要使用的 docker-compose.yml
的路径。默认路径是当前工作目录。
DOCKER_HOST
设置Docker daemon的地址。默认使用unix:///var/run/docker.sock
,与Docker客户端采用的默认值一致。
DOCKER_TLS_VERIFY
如果设置不为空,则与 Docker daemon 交互通过 TLS 进行。
DOCKER_CERT_PATH
配置TLS通信所需要的验证(ca.pem、cert.pem 和 key.pem)文件的路径,默认是 ~/.docker
。
docker-compose命令对比
- image vs build
image:如果镜像在本地不存在,Compose 将会尝试拉去这个镜像。
build:指定 Dockerfile
所在文件夹的路径。 Compose 将会利用它自动构建这个镜像,然后使用这个镜像。
- links vs external_links
links:链接到其它服务中的容器。使用服务名称(同时作为别名)或服务名称:服务别名 (SERVICE:ALIAS) 格式都可以。使用的别名将会自动在服务容器中的 /etc/hosts 里创建。
external_links:链接到 docker-compose.yml 外部的容器,甚至 并非 Compose 管理的容器。
- ports vs expose
ports
暴露端口信息。使用:宿主:容器 (HOST:CONTAINER)格式或者仅仅指定容器的端口(宿主将会随机选择端口)都可以。
当使用 HOST:CONTAINER 格式来映射端口时,如果你使用的容器端口小于 60 你可能会得到错误得结果,因为 YAML 将会解析 xx:yy 这种数字格式为 60 进制。所以建议采用字符串格式。
expose
暴露端口,但不映射到宿主机,只被连接的服务访问。
- volumes vs volumes_from
volumes
卷挂载路径设置。可以设置宿主机路径 (HOST:CONTAINER) 或加上访问模式 (HOST:CONTAINER:ro)。ro就是readonly的意思,只读模式。
volumes_from
从另一个服务或容器挂载它的所有卷。
Docker-Compose YAML语法使用说明
默认的模板文件是 docker-compose.yml
,其中定义的每个服务都必须通过image指令指定镜像或build指令(需要 Dockerfile)来自动构建。其它大部分指令都跟docker run中的类似。
如果使用build指令,在Dockerfile中设置的选项(例如:CMD, EXPOSE, VOLUME, ENV 等) 将会自动被获取,无需在docker-compose.yml中再次设置。
- build
这个是创建docker镜像时的选项,通过本地的dockerfile来创建,而不是通过image id来pull。
其中build还有一些小选项。
1 | build: |
context上下文是docker build中很重要的一个概念。构建镜像必须指定context。context是 docker build 命令的工作目录。默认情况下,如果不额外指定 Dockerfile 的话,会将 Context 下的名为 Dockerfile 的文件作为 Dockerfile。
dockerfile选项是值得备选的dockerfile。args是一些提供的参数。
- image: 生成镜像的ID
指定为镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉去这个镜像。
例如:
1 | image: ubuntu |
- links
链接到其它服务中的容器,使一个容器可以主动的去和另外一个容器通讯。使用服务名称(同时作为别名)或服务名称:服务别名 (SERVICE:ALIAS) 格式都可以。
1 | links: |
使用的别名将会自动在服务容器中的 /etc/hosts 里创建。例如:
1 | 172.17.2.186 db |
相应的环境变量也将被创建。
- external_links
链接到 docker-compose.yml 外部的容器,甚至 并非 Compose 管理的容器。参数格式跟 links 类似。
1 | external_links: |
- expose
这个是给link用的,将一些端口暴露给link到这个container上的containers。暴露端口,但不映射到宿主机,只被连接的服务访问。
1 | expose: |
- ports
暴露端口信息,这个是将端口和本机端口映射的选项,写法如下,其实跟docker -p
一样。使用宿主:容器 (HOST:CONTAINER)格式或者仅仅指定容器的端口(宿主将会随机选择端口)都可以。
1 | ports: |
注:当使用 HOST:CONTAINER 格式来映射端口时,如果你使用的容器端口小于 60 你可能会得到错误得结果,因为 YAML 将会解析 xx:yy 这种数字格式为 60 进制。所以建议采用字符串格式。
- environment:
设置环境变量。你可以使用数组或字典两种格式。
只给定名称的变量会自动获取它在 Compose 主机上的值,可以用来防止泄露不必要的数据。
1 | environment: |
- env_file
从文件中获取环境变量,可以为单独的文件路径或列表。
如果通过 docker-compose -f FILE
指定了模板文件,则 env_file 中路径会基于模板文件路径。
如果有变量名称与 environment 指令冲突,则以后者为准。
1 | env_file: .env |
环境变量文件中每一行必须符合格式,支持 # 开头的注释行。
1 | # common.env: Set Rails/Rack environment |
- volumes
将本机的文件夹挂载到container中,这一点在使用zmq的ipc通讯方式时用到了。
1 | volumes: |
卷挂载路径设置。可以设置宿主机路径 (HOST:CONTAINER) 或加上访问模式 (HOST:CONTAINER:ro)。
1 | volumes: |
- volumes_from
从另一个服务或容器挂载它的所有卷。
1 | volumes_from: |
- extends
基于已有的服务进行扩展。例如我们已经有了一个webapp服务,模板文件为 common.yml。
1 | # common.yml |
编写一个新的 development.yml 文件,使用 common.yml 中的 webapp 服务进行扩展。
1 | # development.yml |
后者会自动继承 common.yml 中的 webapp 服务及相关环节变量。
- net
设置网络模式。使用和 docker client 的 –net 参数一样的值。
1 | net: "bridge" |
- pid
跟主机系统共享进程命名空间。打开该选项的容器可以相互通过进程 ID 来访问和操作。
1 | pid: "host" |
- dns
配置 DNS 服务器。可以是一个值,也可以是一个列表。
1 | dns: 8.8.8.8 |
- cap_add, cap_drop
添加或放弃容器的 Linux 能力(Capabiliity)。
1 | cap_add: |
- dns_search
配置 DNS 搜索域。可以是一个值,也可以是一个列表。
1 | dns_search: example.com |
- command
覆盖容器启动后默认执行的命令。
1 | command: bundle exec thin -p 3000 |
- 其它选项
working_dir, entrypoint, user, hostname, domainname, mem_limit, privileged, restart, stdin_open, tty, cpu_sharesv 这些都是和 docker run 支持的选项类似。
1 | cpu_shares: 73 |
Docker-Compose使用实例
创建一个Wordpress应用,首先建立一个应用的目录
1 | $ mkdir wordpress |
创建 docker-compose.yml
1 | $ vim docker-compose.yml |
MySQL的数据目录挂载到当前目录下,./.data/db不存在时会自动创建。
启动应用
1 | $ docker-compose up -d |
确认启动成功
1 | $ docker-compose ps |
访问应用
初始化设置后,就可以看到Wordpress的页面
其它
Docker Compose UI,一个可在网页上的直观的进行Docker Compose操作的项目。
项目地址:https://github.com/francescou/docker-compose-ui
参考文档
http://www.google.com
https://docs.docker.com/compose/compose-file/
https://coding.net/u/twang2218/p/docker-lnmp/git
http://www.cnblogs.com/ee900222/p/docker_5.html