Compose 项目是 Docker 官方的开源项目,实现对 Docker 容器集群的快速编排。
官方文档:https://docs.docker.com/compose/
代码开源(Github):https://github.com/docker/compose
Compose 定位是 「定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)」,其前身是开源项目 Fig。
当碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。
Compose 恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
一、Compose安装
Compose 支持 Linux、macOS、Windows三大平台。
Docker Desktop for Mac/Windows 自带 docker-compose 二进制文件,安装 Docker 之后可以直接使用。
通过以下命令查看Compose版本:
1 | docker-compose --version |
如果没有安装的话,按以下方法安装一下(Linux系统)。
1.pip安装
Compose 项目由 Python 编写的,所以跟Python第三方的库一样用pip安装就行。
1 | sudo pip install -U docker-compose |
安装成功后可以查看一下版本。
2.卸载
1 | sudo pip uninstall docker-compose |
二、docker-compose.yml配置文件详解
编写之前,注意下Compose和Docker兼容性:
- Compose 文件格式有3个版本,分别为1, 2.x 和 3.x
- 目前主流的为 3.x 其支持 docker 1.13.0 及其以上的版本
docker-compose.yml配置文件中的指令关键字虽然挺多,但大部分基本上docker run的参数都有对应的,比较好理解的。
docker-compose配置文件中有几个最常见的一级参数(就是顶格写的):
- version
- services
- volumes
- networks
1.docker-compose.yml 举例一(EwoMail邮件服务器)
EwoMail邮件服务器的docker-compose.yml配置文件如下:
1 | mail: |
1).image: bestwu/ewomail
指定docker镜像:bestwu/ewomail
指定镜像名称或镜像 ID。如果镜像本地不存在,Compose 将会拉取这个镜像。
注意每个服务都必须通过 image 指令指定镜像或 build 指令(需要 Dockerfile)等来自动构建生成镜像。
如果使用 build 指令,在 Dockerfile 中设置的选项(例如:CMD, EXPOSE, VOLUME, ENV 等) 将会自动被获取,无需在 docker-compose.yml 中重复设置。
2).container_name: ewomail
指定容器名称:ewomail。默认将会使用 项目名称_服务名称_序号
这样的格式。
3).hostname: mail.abcd.com
这个 docker run中的对应参数一样的。
指定容器主机名:mail.abcd.com
除这个外,还有:
指定容器中搜索域名 domainname: abcd.com
指定容器mac地址 mac_address: 08-00-27-00-0C-0A
4).restart: always
这个 docker run中的对应参数一样的。
指定容器退出后的重启策略为始终重启。该命令对保持服务始终运行十分有效,在生产环境中推荐配置为 always 或者 unless-stopped。
5).ports
映射端口。
格式:
宿主端口:容器中端口 (HOST:CONTAINER)
或者仅仅指定容器的端口(宿主将会随机选择端口)都可以。
比如以下就是把容器中的3306端口映射到主机的3307端口上。
1 | ports: |
注意用上引号,以防止小的端口号报错。
6).volumes
数据卷所挂载路径设置。
格式 两种:
- 宿主机路径:容器中路径(HOST:CONTAINER)
- 数据卷名称:容器中路径(VOLUME:CONTAINER),必须在文件中配置数据卷。
并且可以设置访问模式只读ReadOnly(HOST:CONTAINER:ro)。
数据卷的更多介绍看这篇文章:Docker 数据卷(volumes)介绍
举例:数据卷mysql_data所挂载的是容器中的/var/lib/mysql目录。
1 | version: "3" |
7).environment
设置环境变量。你可以使用数组或字典两种格式。
只给定名称的变量会自动获取运行 Compose 主机上对应变量的值,可以用来防止泄露不必要的数据。
用上面和下面的这种都可以。
1 | version: "3" |
8).expose
暴露端口,但不映射到宿主机,只被连接的服务访问。
1 | expose: |
9).depends_on
解决容器的依赖、启动先后的问题。以下例子中会先启动 redis db 再启动 web:
1 | version: "3" |
10).network_mode
设置网络模式。使用和 docker run 的 -network
参数一样的值。
1 | network_mode: "bridge" |
11).networks
配置容器连接的网络。
networks是一级参数,与version和services是同级对齐。
在这篇文章中compose配置文件模板中有实际用到:Docker版Selenium使用方法
docker-compose配置文件更多介绍 参考文章:
2.docker-compose.yml 举例二(部署Flask应用)
数据库用的mysql,image是自己用Dockfile制作的competition_sys:v1.0。
1 | version: "3" |
三、docker-compose常用命令
docker-compose 命令的基本的使用格式是:
1 | docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...] |
1 | -f,--file FILE指定使用的Compose模板文件,默认为docker-compose.yml,可以多次指定。 |
1 | # 1.部署一个Compose应用 |
- 本文标题:Docker-Compose详解
- 本文作者:HDUZN
- 创建时间:2022-06-19 12:04:36
- 本文链接:http://hduzn.cn/2022/06/19/Docker-Compose详解/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!