当前位置:首页 > 编程语言 > 正文内容

什么是Docker Compose?举例说明如何使用它

a811625533年前 (2023-04-11)编程语言18

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

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

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

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

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

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

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

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

  1. 如何使用docker作为数据库主机(MongoDB)?
  2. 示例说明Docker Compose如何工作(Node *** 和MongoDB)

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

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

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

为什么我们需要Docker数据库?

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

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

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

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

如何使用Docker设置MongoDB

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

之一步,从Docker Hub拉出官方的Docker镜像。

Docker Hub中的MongoDB镜像

 

docker pull mongo:latest

从Docker Hub拉取Mongo镜像的终端命令

从Docker Hub拉取Mongo镜像的输出示例

一旦你完成了Mongo镜像的拉取,打开你的Docker桌面,你就可以看到它了。

Docker桌面中的可用Mongo镜像

让我们使用 docker run 命令来运行我们的MongoDB镜像。

docker run -d -p 27017:27017 --name mongo-server-local mongo: latest

在docker中运行mongodb的命令

在docker中运行mongodb的命令

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

在Docker Desktop中运行的Mongo容器

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

使用Docker运行MongoDB服务器时,”看起来你正试图通过HTTP访问MongoDB的本地驱动端口” 的输出示例

有意思吧?

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

重要说明

  1. 不建议将Docker作为生产用数据库使用
  2. 不要在大规模应用中使用Docker数据库

什么是docker-compose?

让我们再来看看docker-compose。

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

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

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

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

docker-compose.yml文件

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

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

从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:latest 和 mongo.
  • container_name 是每个容器的名称
  • restart 启动/重启一个服务容器
  • port 定义了运行该容器的自定义端口
  • working_dir 是服务容器的当前工作目录
  • environment 定义了环境变量,如DB凭证等。
  • command 是运行服务的命令

如何运行多容器

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

docker compose build

构建docker-compose.yml的命令

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

docker compose up

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

如果你想以分离模式运行容器,只需使用 -d 标志。

docker compose up -d

使用docker-compose以分离模式运行多个容器的命令

使用docker-compose以分离模式运行多个容器的输出示例

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

docker compose ps

列出正在运行的容器服务的命令

列出运行中的容器服务的输出样本

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

使用docker运行nodejs服务的输出样本

使用docker运行mongodb服务的输出样本

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

下面是它的屏幕截图。

mongodb compass中的MongoDB服务器视图

小结

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

扫描二维码推送至手机访问。

版权声明:本文由2345好导航站长资讯发布,如需转载请注明出处。

本文链接:http://www.2345hao.cn/blog/index.php/post/7985.html

分享给朋友:

“什么是Docker Compose?举例说明如何使用它” 的相关文章

什么是JavaScript?网络上最流行的脚本语言一瞥

什么是JavaScript?网络上最流行的脚本语言一瞥

谁在尝试访问某些网站时没有遇到过更新Java的请求? 虽然许多人通过交互式网站功能熟悉Java,但用户可能不太熟悉JavaScript——或者,实际上,他们可能错误地认为两者是相同的。 在本文中,我们将讨论JavaScript 是什么以及Java和JavaScript之间的区别。然后我们将概...

静态与动态IP地址有何区别?

静态与动态IP地址有何区别?

每台连接到Internet的计算机都有一个Internet协议 (IP) 地址。但是,并非所有IP地址的外观或行为都相同。 如果您使用计算机网络或服务器,了解动态IP和静态IP之间的区别至关重要。通过详细了解每个协议,您可以选择最适合您需求的解决方案。 在本文中,我们将讨论静态和动态IP之间...

宝塔面板教程之面板设置篇

宝塔面板教程之面板设置篇

宝塔面板设置主要涉及的是宝塔控制后台自身的参数,包括诸如面板的开关、自动更新及SSL、面板端口设置等。虽然这部分不涉及服务器自身的管理,但对宝塔面板的设置也有其重要。 特别是面板端口、安全入口及面板密码等涉及安全的参数设置。 启动和关闭面板 如果你长时间无需使用到宝塔面板,可以考虑...

宝塔面板教程之计划任务篇

宝塔面板教程之计划任务篇

宝塔面板的计划任务,主要用于安排和管理需要定时执行的任务,如备份、内存清理等。其实对于大部分站长来说,主要使用该板块的备份网站、备份数据库及释放内存的三个定时任务计划。   Shell脚本的添加 输入任务名称,选择执行周期,输入执行的脚本内容。 注意事项: 输入脚本内容...

MongoDB vs MySQL:哪个是更好的数据库管理系统?

MongoDB vs MySQL:哪个是更好的数据库管理系统?

由于市场上有各种可用的数据库,用户经常会就MongoDB与MySQL进行辩论,以找出更好的选择。 使用MySQL等关系数据库的组织在根据不断变化的需求管理和存储数据时可能会面临一定的困难。同时,新公司想知道选择什么数据库,这样他们就不会在开发过程中遇到问题。 同时,构建金融应用程序的开发人员...

15种最佳编程字体以帮助您更愉悦地敲代码

15种最佳编程字体以帮助您更愉悦地敲代码

经过几个小时的努力工作后,您是否感到眼睛疲劳或难以阅读代码?许多程序员在开始头疼之前从没想过要切换字体。 如果您经常发现在尝试扫描一千行代码时眼睛模糊不清,或者在停止编码数小时后头疼,那么可能是时候尝试一种新字体了。即使您没有遇到这些症状,设计良好的字体通常也比默认系统字体具有更好的可读性。...