Docker Compose
是 Docker 官方编排(Orchestration)项目之一,负责快速的部署分布式应用。
一、简介
Compose
项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。从功能上看,跟 OpenStack
中的 Heat
十分类似。
其代码目前在 https://github.com/docker/compose 上开源。
Compose
定位是 「定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)」,其前身是开源项目 Fig。
通过第一部分中的介绍,我们知道使用一个 Dockerfile
模板文件,可以让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。
Compose
恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml
模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
Compose
中有两个重要的概念:
- 服务 (
service
):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。 - 项目 (
project
):由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml
文件中定义。
Compose
的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。
Compose
项目由 Python 编写,实现上调用了 Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用 Compose
来进行编排管理。
目前 Docker 官方用 GO 语言 重写 了 Docker Compose,并将其作为了 docker cli 的子命令,称为 Compose V2
。你可以参照官方文档安装,然后将熟悉的 docker-compose
命令替换为 docker compose
,即可使用 Docker Compose。
二、安装与卸载
1、先决条件
- 已安装 Docker 引擎(Docker Compose 依赖 Docker 运行)。
- 若未安装 Docker,请先参考官方文档安装 Docker:
2、Linux 系统安装 Docker Compose
方法 1:使用官方二进制包(推荐)
下载最新版 Docker Compose
打开终端,执行以下命令(替换 <版本号> 为最新版本,如 v2.27.1 ):
# 查看最新版本号:https://github.com/docker/compose/releases DOCKER_COMPOSE_VERSION=<版本号> # 例如 DOCKER_COMPOSE_VERSION=v2.27.1 sudo curl -L "https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
赋予可执行权限
sudo chmod +x /usr/local/bin/docker-compose
验证安装
docker-compose --version # 输出应类似:Docker Compose version v2.27.1
PIP 安装
注: x86_64
架构的 Linux 建议按照上边的方法下载二进制包进行安装,如果您计算机的架构是 ARM
(例如,树莓派),再使用 pip
安装。
这种方式是将 Compose 当作一个 Python 应用来从 pip 源中安装。
执行安装命令:
sudo pip install -U docker-compose
可以看到类似如下输出,说明安装成功。
Collecting docker-compose Downloading docker-compose-1.27.4.tar.gz (149kB): 149kB downloaded ... Successfully installed docker-compose cached-property requests texttable websocket-client docker-py dockerpty six enum34 backports.ssl-match-hostname ipaddress
方法 2:使用包管理器(以 Ubuntu/Debian 为例)
sudo apt update sudo apt install docker-compose-plugin # 验证 docker compose version
3、macOS 系统安装 Docker Compose
macOS 用户推荐直接安装 Docker Desktop,已内置 Docker Compose。
- 下载 Docker Desktop
访问 Docker Desktop for Mac 下载并安装。
验证安装
docker compose version # 或旧版命令 docker-compose --version
4、Windows 系统安装 Docker Compose
Windows 用户同样推荐使用 Docker Desktop。
- 下载 Docker Desktop
访问 Docker Desktop for Windows 下载并安装。 - 启用 WSL2 或 Hyper-V
安装时选择使用 WSL2 后端(推荐)或 Hyper-V。
验证安装
docker compose version # 或旧版命令 docker-compose --version
5、升级 Docker Compose
Linux 用户手动升级
# 删除旧版本 sudo rm /usr/local/bin/docker-compose # 重新下载新版本(替换为最新版本号) sudo curl -L "https://github.com/docker/compose/releases/download/v2.27.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose
6、常见问题解决
权限问题
如果提示 Permission denied,尝试:
sudo chmod +x /usr/local/bin/docker-compose
命令未找到
检查是否将 /usr/local/bin 加入 PATH 环境变量:
echo $PATH
国内加速下载
若 GitHub 下载慢,可替换 URL 为国内镜像:
# 例如使用 DaoCloud 镜像 https://get.daocloud.io/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-$(uname -s)-$(uname -m)
7、快速开始示例
创建 docker-compose.yml 文件:
version: '3' services: web: image: nginx:alpine ports: - "80:80"
启动服务:
docker-compose up -d
查看运行状态:
docker-compose ps
8、卸载
如果是二进制包方式安装的,删除二进制文件即可。
sudo rm /usr/local/bin/docker-compose
如果是通过 pip
安装的,则执行如下命令即可删除。
sudo pip uninstall docker-compose
三、使用
术语
首先介绍几个术语。
- 服务 (
service
):一个应用容器,实际上可以运行多个相同镜像的实例。 - 项目 (
project
):由一组关联的应用容器组成的一个完整业务单元。
可见,一个项目可以由多个服务(容器)关联而成,Compose
面向项目进行管理。
场景
最常见的项目是 web 网站,该项目应该包含 web 应用和缓存。
下面我们用 Python
来建立一个能够记录页面访问次数的 web 网站。
web 应用
新建文件夹,在该目录中编写 app.py
文件
from flask import Flask from redis import Redis app = Flask(__name__) redis = Redis(host='redis', port=6379) @app.route('/') def hello(): count = redis.incr('hits') return 'Hello World! 该页面已被访问 {} 次。\n'.format(count) if __name__ == "__main__": app.run(host="0.0.0.0", debug=True)
Dockerfile
编写 Dockerfile
文件,内容为
FROM python:3.6-alpine ADD . /code WORKDIR /code RUN pip install redis flask CMD ["python", "app.py"]
docker-compose.yml
编写 docker-compose.yml
文件,这个是 Compose 使用的主模板文件。
version: '3' services: web: build: . ports: - "5000:5000" redis: image: "redis:alpine"
运行 compose 项目
docker-compose up
此时访问本地 5000
端口,每次刷新页面,计数就会加 1。