Docker Compose是一种集成于Docker内的工具,它可以简化管理多容器应用的流程。
Docker Compose提供的好处很多,包括:
-
轻松管理容器网络:在 Docker Compose 中通过 Docker 网络连接两个容器非常简单:定义网络,并告诉容器连接到该网络即可。此外,Docker Compose可以在创建和销毁容器本身时自动创建和销毁网络。
-
容器依赖:如果一个Docker 容器需要依赖于另一个 Docker 容器来启动和运行(比如一个数据库),可以使用Docker Compose为容器定义依赖项,并要求依赖项先于容器启动和运行。
-
可复制的系统设置:容器运行前的设置信息可以方便地复制到其他系统中。虽然理论上可以手动在 Bash 里做同样的事,但就不会那么灵活,也更难适应变化。
在 Linux 上安装 Docker Compose
Docker Compose可以在在大多数Linux发行版的存储库中获得。
在基于Ubuntu和 Debian 的发行版上,以使用以下命令安装Docker Compose:
sudo apt install docker-compose
复制代码
在 Arch 和 Manjaro 上,可以使用:
sudo pacman -S docker-compose
复制代码
在 Fedora 上,您可以使用 dnf 命令:
sudo dnf install docker-compose
复制代码
在 CentOS 上安装Docker Compose可能要稍微麻烦些。
对于其他发行版,可以查看安装文档以获取相关信息。
创建我们的第一个 Docker Compose 文件
本指南假设您已经熟悉并熟悉 docker CLI 工具。如果还没有,请先去了解一下。
Docker Compose的配置信息通常存储在名为docker-compose.yml
的文件中,在执行docker-compose命令时会在同一目录中找默认查找叫这个名字的配置文件。配置文件采用了YAML形式。
如果想了解更多YAML相关的的知识,可以先看一下这个:每个DevOps工程师都必须知道的YAML基础知识
我们先来创建一个 NextCloud 实例的yaml文件,然后再一起过一下它。
首先,需要在系统上创建一个空目录,并创建一个叫docker-compose.yml
的文件,如下:
然后用以下内容填充文件:
version: '3.5'
services:
nextcloud_app:
container_name: nextcloud_app
image: nextcloud
restart: unless-stopped
networks:
- nextcloud
ports:
- 80:80
volumes:
- ./data/app:/var/www/html
depends_on:
- nextcloud_mariadb
nextcloud_mariadb:
container_name: nextcloud_mariadb
image: mariadb
restart: unless-stopped
networks:
- nextcloud
volumes:
- ./data/mariadb:/var/lib/mysql
environment:
MARIADB_ROOT_PASSWORD: 'mariadb'
networks:
nextcloud:
name: nextcloud_docker_network
复制代码
接下来,唯一需要做的就是运行如下命令:
docker-compose up -d
复制代码
如下图所示,表明NextCloud容器已经启动成功了:
关于如何在Linux上用Docker部署一个NextCloud,可以参考一下这篇介绍。
打开浏览器,访问http://localhost, 应该可以看到 Nextcloud 的登录页面,如下所示:
了解Docker Compose配置文件
既然已经验证了这个yaml文件确实有效,那我们再回顾一下文件的内容,了解一下它到底在做什么。
“version” 标签
version: '3.5'
复制代码
首先,version标签指定了 Docker Compose 文件格式的版本,因为不同的版本会有不同的语法。通常我们会使用最新版本,但并非必须如此,如果您有一些遗留文件,可能会需要使用特定版本。
“services” 标签
services:
nextcloud_app:
container_name: nextcloud_app
image: nextcloud
restart: unless-stopped
networks:
- nextcloud
ports:
- 80:80
volumes:
- ./data/app:/var/www/html
depends_on:
- nextcloud_mariadb
nextcloud_mariadb:
container_name: nextcloud_mariadb
image: mariadb
restart: unless-stopped
networks:
- nextcloud
volumes:
- ./data/mariadb:/var/lib/mysql
environment:
MARIADB_ROOT_PASSWORD: 'mariadb'
复制代码
接下来是services
标签。它包含了docker-compose up -d
启动时所创建的所有应用程序的列表。
我们看看第一个容器nextcloud_app
。这个名字作为特定应用程序的标识符,可供其他Docker Compose命令使用。请注意,这不是容器本身的名称,后面会说明。
接下来的内容定义了有关容器本身的配置信息。下面列举了所有相关字段的含义。如果您已经了解 Docker,大多数字段应该是不言自明的:
container_name
– 定义容器的名称。相当于–name选项。image
– 定义要从容器中提取的镜像。restart
– 定义容器的重启策略。相当于–restart。networks
– 定义容器要连接到的网络。该网络可以是新建的或者是已经存在的。该值将使用在”networks”标签中定义的网络标识符,而不是实际的网络名称。ports
– 定义容器可以连接到的主机端口。相当于–publish。volumes
– 定义容器的磁盘卷。相当于–volume。environment
– 定义容器的环境变量。相当于–env。此选项支持两种语法类型:一是variable: value
;或者如果您习惯docker cli的语法,则可能更熟悉另一个选项是- variable=value
。depends_on
– 指定容器的依赖项。依赖项启动之前当前容器不会启动。
“networks” 标签
networks:
nextcloud:
name: nextcloud_docker_network
复制代码
networks标签用于定义我们在容器的networks
配置中列出的网络。
在networks
配置中,先是列出了services中用到了network的容器的标识符, 即nextcloud
。
后面又定义了network的名称nextcloud_docker_network
。
可以使用
docker network ls
来查看一下network的定义:
如果想让容器加入一个已经存在的网络,可以使用以下语法,将其中的”network_name”替换为实际存在的Docker网络的名称即可:
networks:
nextcloud:
external: true
name: network_name
复制代码
OK, 关于docker compose的配置文件就简单聊完了。
配置文件
docker-compose.yml
的名称不是必须的,可以是任意名称,不过如果叫其他名字,需要在启动命令中加参数指明,如docker-compose up -f mycompose.yml
。
结语
现在,相比你已经了解了Docker Compose的基本知识,以及使用它的好处。