
Docker帮助你在你的机器上快速建立一个开发环境。完成整个过程只需要几分钟时间。
但是,让我们假设你被分配到一个项目上,该项目需要至少10个不同的服务处于运行状态来运行你的项目。例如,假设你的项目需要Java 8、Node 14、MySQL、MongoDB、Ruby on rails、RabbitMQ和其他。
在这种情况下,你必须从Docker中单独提取所有这些镜像,并在其容器中启动所有这些镜像。在某些时候,一个进程可能依赖于另一个进程来运行。所以,你必须给它们排序。
如果这是一个一次性的过程就好了。但是,不仅仅是一次–每天,每次你开始在你的项目上工作时–你都必须启动所有这些服务。
这是一个乏味的过程,对吗?
为了克服这个问题,Docker引入了一个叫做多容器(Docker Compose)的概念。在学习Docker Compose之前,让我们快速了解一下如何在Docker中启动数据库主机。
在本教程的例子部分,我们将一起启动一个Node *** 容器和MongoDB容器。在一开始就学习MongoDB,会让你对我们转向Docker Compose时有一个很好的理解。
我们将把本教程分成两个部分:
如果你有过后端开发的经验,你可能有机会处理多个数据库。例如,像MySQL/Postgres这样的数据库来处理关系型数据,Cassandra/MongoDB来处理非结构化数据。
想知道一个秘密吗?你可以在不在本地机器上安装数据库的情况下进行后端开发工作。是的,你可以使用Docker作为数据库主机。它在特定的镜像文件中默认拥有所有的依赖项。
Docker帮助我们在不同的平台和环境中保持一致的版本。假设你的团队中有一群人在MongoDB 5.0版本上工作。如果一个新成员加入你的团队,他们需要用精确的配置手动设置相同的版本。如果他们安装了最新版本的MongoDB(6.0)呢?这将导致一些冲突。如果它蔓延到其他人的设备上,这将是一场噩梦。
为了解决这个问题,你可以在Docker中使用带有自定义配置的MongoDB,并将MongoDB镜像推送到Docker Hub内部。如果有新人进来,他们可以拉动镜像并开始实施,而无需任何手动配置。
让我们来看看在Docker中使用数据库的优势。
如果你不熟悉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服务器。
让我们再来看看docker-compose。
Docker Compose是一个工具,你可以用来定义和分享多容器应用程序。这意味着你可以使用一个单一的资源来运行一个具有多个容器的项目。
例如,假设你正在用Node *** 和MongoDB一起构建一个项目。你可以创建一个单一的镜像,将两个容器作为一个服务来启动–你不需要分别启动每个容器。
有意思吧?这就解决了我在本文一开始就提出的问题。
为了实现这个目标,我们需要定义一个 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,并在一个单一的服务源中运行。希望你喜欢阅读这篇文章。
Linux面板环境安装,主要支持LNMP和LAMP、Tomcat、node.js。不过对于大部分站长来说,主要是LNMP和LAMP两个环境的安装。 LNMP和LAMP两个环境的最大区别是,前者采用Nginx作为Web服务器,后者则采用Apache作为Web服务器。(选择哪个作为您的Web服务器,可...
本章节主要是对宝塔面板的主界面的各个版本进行一个简单的说明。 宝塔面板主界面主要包括:服务器操作系统、服务器状态、站点信息、软件管理及网络流量几个部分。 Windows面板有部分功能未实现,其余部分与Linux面板同步。 系统操作...
宝塔面板提供丰富的软件以一键安装,这让服务器环境搭建提供不少的便利性,站长可以根据实际需求快速编译安装以实现不同的功能需求。 软件管理,主要是宝塔提供的一些面板扩展插件。 Nginx Nginx是一个高性能的HTTP和反向代理服务器,具有轻量级、占用内存小,并发能力强等优势。 w...
对于初学者和那些刚刚进入WordPress开发的人来说,PHP是您可以开始的最佳起点之一。这是一种超级简单直接的语言,使其成为之一,因此相当容易上手,它构成了在线开发的支柱。另外,如果你想在WordPress后端工作,你肯定需要学习它。 但是,如果您不想在昂贵的大学课程上花费数月或数年时间怎么...
PHP开发:有些人认为它是,另一些人认为它是一种过时的技术,不值得花时间学习。但是这些数字说明了什么,尤其是当您查看PHP开发人员的薪水时? 虽然肯定有许多更新、更炫、更令人兴奋的语言,但PHP仍然是后端Web开发的可靠主食,也是许多雇主仍在寻找的技能。 有兴趣自己成为PHP开发人员吗?我们...
近年来,Web应用程序和网站的开发变得越来越简单。即使是我们当中最受技术挑战的人也已经相当熟练地使用WordPress和Wix等产品。 对于更高级的开发人员,有许多工具可以帮助简化开发过程。这些工具中最有用的工具之一是Laravel。 本文回答了“什么是Laravel?”这个问题。通过将其分...