Docker Compose 入门指南
多容器管理的挑战
如果你刚接触Docker,可能已经发现了使用docker run命令运行单个容器很方便。但当你的应用需要数据库、缓存时,情况就变得复杂了:
- 标签页1:运行长长的
docker run命令启动数据库 - 标签页2:另一个
docker run命令启动缓存 - 标签页3:庞大的
docker run命令启动Web应用,并尝试连接到前两个容器
这种配置容易遗忘、容易出错,并且难以与新团队成员共享。这就是Docker Compose的用武之地。
什么是Docker Compose?
可以将Docker Compose想象成烹饪菜肴的食谱。这个配置/食谱写在名为docker-compose.yml的单个文件中(YAML是一种配置文件格式)。
食谱列出了应用运行所需的成分列表。在Docker术语中,这些被称为"服务"。服务就是运行中的容器,例如:
mywebapp:你的Python、Node.js或Java应用db:Postgres或MySQL数据库cache:Redis缓存
通过在单个关键文件中定义所有服务/配置,你获得以下优势:
- 单一命令:只需输入
docker-compose up即可按正确顺序创建和启动每个应用及其依赖项 - 自动网络管理:Docker Compose将所有必要服务放在私有虚拟网络中
实战演示:Hello World计数器应用
让我们从经典的"Hello World"示例开始。每次刷新网页时,其计数器应该增加。此应用有两个简单服务:
mywebapp:基于Flask的简单应用,显示查看次数redis:实际存储计数器的Redis数据库
项目结构
|
|
步骤1:Python应用(app.py)
这是一个小型Web应用。注意host='redis'是我们与Redis通信的方式,这是我们在Docker Compose文件中定义的服务名称。
|
|
requirements.txt
|
|
步骤2:Dockerfile
这是我们Web服务的"说明书",只是一个标准的Python Dockerfile。
|
|
步骤3:Docker Compose魔法(docker-compose.yml)
这是经典的配方文件,所有魔法实际发生的地方。
|
|
逐行解析:
services::定义我们将在应用中交互的顶级服务mywebapp::我们给第一个服务的名称build: .:从本地当前目录构建此服务ports: ["5000:5000"]:将本地计算机的端口5000连接到容器的端口5000depends_on: [redis]:告诉在Redis应用启动运行之前不要启动此应用
redis::我们Redis数据库服务的名称image: "redis:alpine":使用Docker Hub上最新的redis:alpine镜像
步骤4:运行!
确保你在项目目录(/hello-docker)中,在终端中启动应用:
|
|
添加-d在后台运行:docker-compose up -d。
Docker将构建你的Web镜像,拉取Redis镜像,并启动两个容器。打开浏览器访问http://localhost:5000,你应该看到"Hello from Docker-Compose! The total count is {}"。刷新页面,计数将增加!你的Web容器成功与Redis容器通信。
停止应用:完成后,在终端中按Ctrl+C。如果在后台运行,输入:
|
|
此命令停止并移除所有容器和创建的网络。
结论
这些是Docker Compose的基础知识。通过单个文件和一个命令,我们可以轻松维护和管理多容器设置。通过单一命令,我们有效消除了运行多个docker run的需求,帮助提高本地开发设置的效率。
任何复杂的软件都可以通过Docker Compose的帮助进行容器化。添加缓存、数据库或任何其他服务只需添加几行YAML代码即可完成。