Docker-Compose详解
HDUZN

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
mail:
image: bestwu/ewomail
hostname: mail.abcd.com
container_name: ewomail
restart: always
ports:
- "25:25"
- "143:143"
- "587:587"
- "993:993"
- "109:109"
- "110:110"
- "465:465"
- "995:995"
- "80:80"
- "8080:8080"
- "3307:3306"
volumes:
- `pwd`/ewomail/mysql:/ewomail/mysql/data
- `pwd`/ewomail/vmail:/ewomail/mail
- `pwd`/ewomail/rainloop:/ewomail/www/rainloop/data
- `pwd`/ewomail/ssl/certs/:/etc/ssl/certs/
- `pwd`/ewomail/ssl/private/:/etc/ssl/private/
- `pwd`/ewomail/ssl/dkim/:/ewomail/dkim/
environment:
- "MYSQL_ROOT_PASSWORD=123MYSQL456"
- "MYSQL_MAIL_PASSWORD=111111MYSQL"

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
2
ports:
- "3307:3306"

注意用上引号,以防止小的端口号报错。

6).volumes

数据卷所挂载路径设置。

格式 两种

  • 宿主机路径:容器中路径(HOST:CONTAINER)
  • 数据卷名称:容器中路径(VOLUME:CONTAINER),必须在文件中配置数据卷。

并且可以设置访问模式只读ReadOnly(HOST:CONTAINER:ro)。

数据卷的更多介绍看这篇文章:Docker 数据卷(volumes)介绍

举例:数据卷mysql_data所挂载的是容器中的/var/lib/mysql目录。

1
2
3
4
5
6
7
8
9
10
version: "3"

services:
my_src:
image: mysql:8.0
volumes:
- mysql_data:/var/lib/mysql

volumes:
mysql_data:

7).environment

设置环境变量。你可以使用数组或字典两种格式。

只给定名称的变量会自动获取运行 Compose 主机上对应变量的值,可以用来防止泄露不必要的数据。

用上面和下面的这种都可以。

1
2
3
4
5
6
7
8
9
10
11
12
version: "3"
services:
my_src:
image: mysql:8.0
volumes:
- mysql_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: 123MYSQL456
MYSQL_DATABASE: my_db

volumes:
mysql_data:

8).expose

暴露端口,但不映射到宿主机,只被连接的服务访问。

1
2
3
expose:
- "3000"
- "8000"

9).depends_on

解决容器的依赖、启动先后的问题。以下例子中会先启动 redis db 再启动 web:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
version: "3"

services:
web:
build: .
depends_on:
- db
- redis

redis:
image: redis

db:
image: postgres

10).network_mode

设置网络模式。使用和 docker run 的 -network 参数一样的值。

1
2
3
4
5
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"

11).networks

配置容器连接的网络。

networks是一级参数,与version和services是同级对齐。

在这篇文章中compose配置文件模板中有实际用到:Docker版Selenium使用方法

docker-compose配置文件更多介绍 参考文章:

2.docker-compose.yml 举例二(部署Flask应用)

数据库用的mysql,image是自己用Dockfile制作的competition_sys:v1.0。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
version: "3"
services:
app:
image: competition_sys:v1.0
container_name: my_competition
restart: always
ports:
- "5002:5002"
- "5023:22"
volumes:
- ./docker_app:/app
environment:
MYSQL_HOST: db
MYSQL_USER: root
MYSQL_ROOT_PASSWORD: 1234MYSQL
MYSQL_DATABASE: competition_sys
db:
image: mysql:8.0
restart: always
ports:
- "3308:3306"
environment:
MYSQL_ROOT_PASSWORD: 1234MYSQL
MYSQL_DATABASE: competition_sys
volumes:
- ./db_data:/docker-entrypoint-initdb.d/:ro

三、docker-compose常用命令

docker-compose 命令的基本的使用格式是:

1
docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
1
2
3
4
-f,--file FILE指定使用的Compose模板文件,默认为docker-compose.yml,可以多次指定。
-p,--project-name NAME指定项目名称,默认将使用所在目录名称作为项目名。
--verbose 输出更多调试信息。
-v,--version 打印版本并退出。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 1.部署一个Compose应用
docker-compose up
# 默认情况下该命令会读取名为 docker-compose.yml,也可以使用-f指定其他文件名。
# 通常情况下,会使用-d参数令应用在后台启动。
docker-compose up -d
docker-compose -f docker-compose-v3.yml up -d

# 2.列出Compose应用中的各个容器
docker-compose ps
docker ps -a # 显示包括停止的容器

# 3.停止Compose应用相关的所有容器,但不会删除它们
docker-compose stop

# 4.重启已停止的Compose应用
docker-compose restart

# 5.停止并删除运行中的Compose应用,会删除容器和网络,但是不会删除卷和镜像。
docker-compose down

# 6.查看帮助
docker-compose help

官方文档:https://docs.docker.com/compose/reference/up/

  • 本文标题:Docker-Compose详解
  • 本文作者:HDUZN
  • 创建时间:2022-06-19 12:04:36
  • 本文链接:http://hduzn.cn/2022/06/19/Docker-Compose详解/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论