首先,我们将看看在容器中运行数据库,以及我们如何使用卷和网络来持久化我们的数据并允许我们的应用程序与数据库对话。然后,我们将所有内容整合到一个 compose 文件中,这将允许我们使用一个命令设置和运行本地开发环境。最后,我们将看看将调试器连接到我们在容器内运行的应用程序。
我们可以使用 MongoDB 的 Docker 官方镜像并在容器中运行它,而不是下载 MongoDB、安装、配置然后将 Mongo 数据库作为服务运行。
在容器中运行 MongoDB 之前,我们希望创建几个卷,Docker 可以管理这些卷来存储我们的持久数据和配置。让我们使用 docker 提供的托管卷功能,而不是使用绑定安装。您可以在我们的文档中阅读有关卷的所有信息。
现在让我们创建我们的卷。我们将为数据创建一个,另一个用于 MongoDB 的配置。
$ docker volume create mongodb
$ docker volume create mongodb_config
现在我们将创建一个网络,我们的应用程序和数据库将使用该网络相互通信。该网络称为用户定义的桥接网络,它为我们提供了一个很好的 DNS 查找服务,我们可以在创建连接字符串时使用它。
$ docker network create mongodb
现在我们可以在容器中运行 MongoDB 并附加到我们上面创建的卷和网络。Docker 将从 Hub 拉取镜像并在本地为您运行。
$ docker run -it --rm -d -v mongodb:/data/db \
-v mongodb_config:/data/configdb -p 27017:27017 \
--network mongodb \
--name mongodb \
mongo
好的,现在我们有一个正在运行的 MongoDB,让我们更新server.js以使用 MongoDB 而不是内存数据存储。
const ronin = require( "ronin-server" )
const mocks = require( "ronin-mocks" )
const database = require( "ronin-database" )
const server = ronin.server()
database.connect( process.env.CONNECTIONSTRING )
server.use( "/", mocks.server( server.Router(), false, false ) )
server.start()
我们已经添加了ronin-database模块并更新了代码以连接到数据库并将内存中的标志设置为 false。我们现在需要重建我们的图像,以便它包含我们的更改。
首先让ronin-database我们使用 npm将模块添加到我们的应用程序中。
$ npm install ronin-database
现在我们可以建立我们的形象。
$ docker build --tag node-docker .
现在,让我们运行我们的容器。但是这次我们需要设置CONNECTIONSTRING环境变量,以便我们的应用程序知道使用什么连接字符串来访问数据库。我们将在docker run命令中正确执行此操作。
$ docker run \
-it --rm -d \
--network mongodb \
--name rest-server \
-p 8000:8000 \
-e CONNECTIONSTRING=mongodb://mongodb:27017/yoda_notes \
node-docker
让我们测试一下我们的应用程序是否已连接到数据库并能够添加注释。
$ curl --request POST \
--url http://localhost:8000/notes \
--header "content-type: application/json" \
--data "{"name": "this is a note", "text": "this is a note that I wanted to take while I was working on writing a blog post.", "owner": "peter"}"
您应该会从我们的服务中收到以下 json。
{"code":"success","payload":{"_id":"5efd0a1552cd422b59d4f994","name":"this is a note","text":"this is a note that I wanted to take while I was working on writing a blog post.","owner":"peter","createDate":"2020-07-01T22:11:33.256Z"}}