你有没有遇到过这样的场景:要开发一个Node.js应用,需要用到MongoDB。你打开官网,找到下载链接,下载安装包,下一步下一步,配置环境变量,启动服务……折腾半小时,终于跑起来了。换台电脑,再来一遍。

烦不烦?

今天我们用Docker来彻底解决这个问题。一条命令,MongoDB就跑起来了;再一条命令,可视化管理界面也有了。换电脑?换系统?一样的命令,一样的体验。

一、我们要搭什么?

一个简单的Node.js后端应用,连接MongoDB数据库,再加一个Mongo Express做可视化管理界面。

架构很简单:

  • Node.js:跑在宿主机上(暂时不打成镜像)

  • MongoDB:跑在Docker容器里

  • Mongo Express:也跑在Docker容器里

两个容器需要能互相通信,并且Node.js要能访问MongoDB。

二、第一步:拉取镜像

先把需要的镜像拉下来:

docker pull mongo
docker pull mongo-express

MongoDB是数据库本体,Mongo Express是它的Web管理界面,类似phpMyAdmin之于MySQL。

三、第二步:创建Docker网络

两个容器需要互相通信。Docker的默认网络模式是bridge,但为了让它们能通过容器名互相访问,最好创建一个自定义网络:

docker network create mongo-network

查看一下:

docker network ls

你会看到新创建的mongo-network

四、第三步:启动MongoDB容器

docker run -p 27017:27017 -d \
  -e MONGO_INITDB_ROOT_USERNAME=admin \
  -e MONGO_INITDB_ROOT_PASSWORD=password \
  --name mongodb \
  --net mongo-network \
  mongo

参数解释:

参数 作用
-p 27017:27017 把容器的27017端口映射到宿主机,供Node.js访问
-d 后台运行
-e 设置环境变量,初始化root账号密码
--name mongodb 给容器起个名字,方便其他容器通过这个名字访问
--net mongo-network 把容器加入我们创建的网络

启动后,用docker logs mongodb看一下日志,看到“waiting for connections”就说明好了。

五、第四步:启动Mongo Express容器

docker run -p 8081:8081 -d \
  -e ME_CONFIG_MONGODB_ADMINUSERNAME=admin \
  -e ME_CONFIG_MONGODB_ADMINPASSWORD=password \
  -e ME_CONFIG_MONGODB_SERVER=mongodb \
  --name mongo-express \
  --net mongo-network \
  mongo-express

注意这一行:

-e ME_CONFIG_MONGODB_SERVER=mongodb

这里填的是MongoDB的容器名,不是IP,也不是localhost。因为两个容器在同一个自定义网络里,Docker会自动做DNS解析,让它们能通过容器名找到对方。

这是容器互联最关键的一点,也是初学者最容易踩的坑。

启动后,访问http://localhost:8081,就能看到Mongo Express的界面了。用admin/password登录,创建一个叫user-account的数据库。

六、第五步:Node.js应用连接数据库

在Node.js代码里,连接MongoDB的URI是:

mongodb://admin:password@localhost:27017

因为Node.js跑在宿主机上,不是容器里,所以用localhost加映射出来的端口27017

配置好连接信息,启动Node.js应用。修改用户信息,保存,刷新页面——数据还在。去Mongo Express里刷新,也能看到数据已经写进去了。

大功告成。

七、如果出问题了怎么办?

docker logs查看日志。

比如查看MongoDB的日志:

docker logs mongodb

实时跟踪日志:

docker logs -f mongodb

这样你就能看到连接有没有成功,认证有没有通过,错误在哪里。

写在最后

这个例子虽然简单,但它展示了一个非常实用的本地开发模式:

  • 依赖服务(数据库、缓存、消息队列)用Docker跑

  • 主应用代码跑在宿主机上,方便调试

  • 所有环境配置一条命令搞定,换电脑也不怕

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐