原文: What is Docker Compose? How to Use it with an Example

Docker 帮助你在你的机器上快速建立一个开发环境。完成整个过程只需要几分钟时间。

但是,让我们假设你被分配到一个项目上,该项目需要至少 10 个不同的服务处于运行状态来运行你的项目。例如,假设你的项目需要 Java 8、Node 14、MySQL、MongoDB、Ruby on rails、RabbitMQ 和其他。

在这种情况下,你必须从 Docker 中单独提取所有这些镜像,并在其容器中启动所有这些镜像。在某些时候,一个进程可能依赖于另一个进程来运行。所以,你必须给它们排序。

如果这是一个一次性的过程就好了。但是,不仅仅是一次——每天、每次你开始在你的项目上工作时——你都必须启动所有这些服务。

这是一个乏味的过程,对吗?

为了克服这个问题,Docker 引入了一个叫做多容器(Docker Compose)的概念。在学习 Docker Compose 之前,让我们快速了解一下如何在 Docker 中启动数据库主机。

在本教程的例子部分,我们将启动一个 NodeJS 容器和 MongoDB 容器。在一开始就学习 MongoDB,会让你在我们转向 Docker Compose 时有一个很好的理解。

我们将把本教程分成两个部分:

  • 如何使用 Docker 作为数据库主机(MongoDB)?
  • 通过一个例子了解 Docker Compose 如何工作(NodeJS 和 MongoDB)

如何使用 Docker 作为数据库主机

如果你有过后端开发的经验,你可能有机会处理多个数据库。例如,像 MySQL/Postgres 这样的数据库用来处理关系型数据,Cassandra/MongoDB 用来处理非结构化数据。

想知道一个秘密吗?你可以在不在本地机器上安装数据库的情况下进行后端开发工作。是的,你可以使用 Docker 作为数据库主机。它在特定的镜像文件中默认拥有所有的依赖项。

为什么我们需要 Docker 数据库

Docker 帮助我们在不同的平台和环境中保持一致的版本。假设你的团队中有一群人在 MongoDB 5.0 版本上工作。如果一个新成员加入你的团队,他们需要用精确的配置手动设置相同的版本。如果他们安装了最新版本的 MongoDB(6.0)呢?这将导致一些冲突。如果它蔓延到其他人的设备上,这将是一场噩梦。

为了解决这个问题,你可以在 Docker 中使用带有自定义配置的 MongoDB,并将 MongoDB 镜像推送到 Docker Hub。如果有新人加入,他们可以拉取镜像并开始实施,而无需任何手动配置。

让我们来看看在 Docker 中使用数据库的优势。

  • 通过使用这种实现方式,我们可以确保团队中的每个人都使用准确的运行时和配置,而无需任何外部资源。
  • 它非常容易设置,我们可以使用 Docker 桌面端快速启动/停止服务器

如何使用 Docker 设置 MongoDB

如果你不熟悉 Docker Hub,这里有一个简短的介绍。Docker hub 是一个平台,你可以在这里找到并分享公开或私有的 Docker 镜像。它与 GitHub / GitLab 非常相似。简而言之,它是一个 Docker 镜像的存储库。

第一步,从 Docker Hub 拉取官方的 MongoDB 镜像。

image-43
Docker Hub 中的 MongoDB 镜像
docker pull mongo:latest
从 Docker Hub 中拉取 MongoDB 镜像的控制台命令
image-44
从 Docker Hub 拉取 Mongo 镜像的输出示例

当你完成了 Mongo 镜像的拉取,打开你的 Docker 桌面端,你就能在那里看到它。

image-45
Docker 桌面端显示 Mongo 镜像

Let's run our MongoDB image using the docker run command.

docker run -d -p 27017:27017 --name mongo-server-local mongo: latest
在 Docker 中运行 MongoDB 的命令
image-46
在 Docker 中运行 MongoDB 的输出示例

我们已经成功运行了 Docker 镜像。现在我们可以看到容器在 Docker 桌面端运行。

image-48
Mongo 容器在 Docker 桌面端运行

所以,MongoDB 服务器正在你的机器上运行。让我们在浏览器中确认这一点。在你的浏览器上进入 http://localhost:27017,你应该能够看到下面截图中所示的信息:

image-49
使用 Docker 运行 MongoDB 服务器时的输出示例

有意思吧?

我们可以随时使用 Docker 停止/启动 MongoDB 服务器。

重要提示

  • 不建议在生产中使用 Docker 作为数据库。
  • 不要在大规模应用中使用 Docker 数据库。

什么是 docker-compose

让我们再来看看 docker-compose。

Docker Compose 是一个工具,你可以用来定义和分享多容器应用程序。这意味着你可以使用一个单一的资源来运行一个有多个容器的项目。

例如,假设你正在用 NodeJS 和 MongoDB 一起构建一个项目。你可以创建一个单一的镜像,将两个容器作为一个服务来启动——你不需要分别启动每个容器。

有意思吧?这就解决了我在本文一开始就提出的问题。

为了实现这个目标,我们需要定义一个 docker-compose.yml

docker-compose.yml 文件

compose 文件是一个 YML 文件,定义了 Docker 容器的服务、网络和卷。有几个版本的 compose 文件格式可用——1、2、2.x 和 3.x。

在进一步开展工作之前,这里有一个 Docker Compose 团队给我们的重要说明。

从 2023 年 6 月底开始,Compose V1 将不再被支持,并将从所有 Docker 桌面版本中移除。

我们在本文中使用的是版本 3。

version: '3'
services:
  app:
    image: node:latest
    container_name: app_main
    restart: always
    command: sh -c "yarn install && yarn start"
    ports:
      - 8000:8000
    working_dir: /app
    volumes:
      - ./:/app
    environment:
      MYSQL_HOST: localhost
      MYSQL_USER: root
      MYSQL_PASSWORD: 
      MYSQL_DB: test
  mongo:
    image: mongo
    container_name: app_mongo
    restart: always
    ports:
      - 27017:27017
    volumes:
      - ~/mongo:/data/db
volumes:
  mongodb:
使用 docker compose 运行多个容器的命令

让我们来拆解一下上面的代码,并逐条理解:

  • version 指的是 docker-compose 的版本(最新的是 3)
  • services 定义了我们需要运行的服务
  • app 是你的一个容器的自定义名称
  • image 指的是我们要拉取的镜像,这里我们使用的是 node:latestmongo
  • container_name 是每个容器的名称
  • restart 启动/重启一个服务容器
  • port 定义了运行该容器的自定义端口
  • working_dir 是服务容器的当前工作目录
  • environment 定义了环境变量,如 DB 凭证等
  • command 是运行该服务的命令

如何运行多容器

我们需要使用 docker build 来构建我们的多容器。

docker compose build
构建 docker-compose.yml 的命令

成功构建后,我们可以使用 up 命令运行容器。

docker compose up
使用 docker-compose 运行多容器的命令

如果你想在后台运行容器,只需使用 -d 标志(detach)。

docker compose up -d
使用 docker-compose 在后台运行多个容器的命令
image-50
使用 docker-compose 在后台运行多个容器的输出示例

好的,我们可以开始了。容器已经启动并运行。让我们检查一下容器列表。

docker compose ps
列出正在运行的容器服务的命令
image-51
列出正在运行的容器服务的输出示例

很棒,我们可以看到有两个容器在同时运行。

image-54
使用 docker 运行 nodejs 服务的输出示例
image-55
使用 docker 运行 mongodb 服务的输出示例

为了查看你的 MongoDB 中的数据,你必须安装 MongoDB Compass。

下面是它的屏幕截图。

image-56
mongodb compass 中的 MongoDB 服务器视图

总结

在这篇文章中,你已经通过一个例子了解了 Docker Compose 是如何工作的。使用多个容器,你可以运行任何类型的服务,如 RabbitMQ 或 Apache Kafka,并在一个单一的服务源中运行。希望你喜欢阅读这篇文章。

如果你想了解更多关于 Docker 的信息,请在我的网站(https://5minslearn.gogosoon.com)上订阅我的文章,那里有我所有博客的综合列表。