原文: 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 镜像。
当你完成了 Mongo 镜像的拉取,打开你的 Docker 桌面端,你就能在那里看到它。
Let's run our MongoDB image using the docker run
command.
我们已经成功运行了 Docker 镜像。现在我们可以看到容器在 Docker 桌面端运行。
所以,MongoDB 服务器正在你的机器上运行。让我们在浏览器中确认这一点。在你的浏览器上进入 http://localhost:27017,你应该能够看到下面截图中所示的信息:
有意思吧?
我们可以随时使用 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
指的是 docker-compose 的版本(最新的是 3)services
定义了我们需要运行的服务app
是你的一个容器的自定义名称image
指的是我们要拉取的镜像,这里我们使用的是node:latest
和mongo
container_name
是每个容器的名称restart
启动/重启一个服务容器port
定义了运行该容器的自定义端口working_dir
是服务容器的当前工作目录environment
定义了环境变量,如 DB 凭证等command
是运行该服务的命令
如何运行多容器
我们需要使用 docker build 来构建我们的多容器。
成功构建后,我们可以使用 up
命令运行容器。
如果你想在后台运行容器,只需使用 -d
标志(detach)。
好的,我们可以开始了。容器已经启动并运行。让我们检查一下容器列表。
很棒,我们可以看到有两个容器在同时运行。
为了查看你的 MongoDB 中的数据,你必须安装 MongoDB Compass。
下面是它的屏幕截图。
总结
在这篇文章中,你已经通过一个例子了解了 Docker Compose 是如何工作的。使用多个容器,你可以运行任何类型的服务,如 RabbitMQ 或 Apache Kafka,并在一个单一的服务源中运行。希望你喜欢阅读这篇文章。
如果你想了解更多关于 Docker 的信息,请在我的网站(https://5minslearn.gogosoon.com)上订阅我的文章,那里有我所有博客的综合列表。