Docker Compose 入门指南
如果你刚接触 Docker,可能已经发现了使用 docker run 命令可以轻松运行单个容器。但是,如果你的应用需要数据库怎么办?需要缓存怎么办?很快你就会陷入终端标签页的噩梦:
- 标签页 1 有一个冗长的
docker run命令来启动你的数据库 - 标签页 2 也有一个
docker run命令来启动你的缓存 - 在第三个标签页中,有一个巨大的
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 down - 自动网络管理:Docker Compose 将所有必要的服务放在一个私有虚拟网络中。这意味着你的
mywebapp服务可以通过使用名称 “db” 轻松与你的db服务通信
简单演示
让我们从经典的"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 通过 docker-compose.yml 施展魔法
这是经典的配方文件。这是所有魔法实际发生的地方。
|
|
让我们逐行分析:
services::定义我们将在应用中交互的顶级服务mywebapp::我们给第一个服务的名称build: .:“从本地当前目录构建此服务”ports: ["5000:5000"]:“这行告诉将本地计算机的端口 5000 连接到容器的端口 5000(Flask 应用运行的地方)”depends_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 代码即可完成。
祝你在接下来的编码旅程中 Docker Compose 愉快!