Docker+MongoDB+EggJS(1):在Docker中搭建MongoDB

最近工作需要用到了EggJS和MongoDB,为了部署和迁移更方便,所以决定把工程都docker化。从头开始搭环境肯定会遇到很多问题,想把这个过程都记下来,作为自己的积累,也可以给大家一些参考。

整理一下生产环境搭建大概会有这些过程。

  1. 在Docker中搭建MongoDB
  2. MongoDB中启用SSL/TSL方式连接
  3. 在Docker中运行EggJS工程
  4. 在Docker中使用 Nginx 作为Web Service托管网站
  5. 在Docker中使用 Nginx 转发后台
  6. 在Linux服务器上自动启动项目相关服务与手动停止,重启项目相关服务

搭建MongoDB,实过程挺简单的,网上很多教程都很容易把MongoDB在Docker中运行起来。可当需要使用Docker的某些能力实现项目的需求时,就需求到处找其他参考。这篇文章主要是把我的操作步骤写记下来,可能一些解决问题的点对你们也有用。

Docker中运行MongoDB

1. 获取 MongoDB的 docker 镜像

Docker Hub上的mongdb的tag优点迷,mongo:latest拉下来是mongo 7.0 的,感觉太新了。我在最新tag里面看到有 6.0.3就用的这个版本,有个确定的版本心里踏实一点。

docker pull mongo:6.0.3

2. docker-compose 配置

为了后面跟后台服务配合,我这里直接使用的docker-compose这种方式来启动MongoDB,详细配置如下:

# docker-compose.yml
version: '3.9'

services:
  mongo:
    #服务的名字
    image: mongo:6.0.3 #对应的docker镜像的名字,可指定版本,如mongo:1.0,不指定则为最新版
    container_name: mongodb_ch4 #docker容器的名字
    restart: always #当docker重启时,容器自动启动。
    environment:
      #容器内部默认的设置
      MONGO_INITDB_ROOT_USERNAME: root #mongo默认的账号
      MONGO_INITDB_ROOT_PASSWORD: root #mongo默认的密码
    ports:
      #容器运行的端口号和对应的容器内部的端口号
      - 27078:27017
    volumes:
      # 数据持久化
      - /Users/mac/docker/mongodb/project/data/db:/data/db # 挂载数据文件,根据实际路径修改 :前的路径
      - /Users/mac/docker/mongodb/project/data/logs:/var/log/mongodb  # 挂载日志文件,根据实际路径修改 :前的路径
      - /Users/mac/docker/mongodb/project/config/mongod.conf:/etc/mongo/mongo.conf # 挂载配置文件,根据实际路径修改 :前的路径

    command '--config /etc/mongod.conf'
    # 或者
    #command ['mongod', '--config','/etc/mongod.conf']

对于上面的配置直接运行 docker-compose up 数据库就跑起来了,但有两点值得一说

2.1 数据持久化

数据持久化我的理解就是,不把数据放在mongodb容器中,以免容器出现问题造成数据丢失。我查到了docker中的数据可以放在三个位置,下面的图可以帮助理解

  1. 容器的存储空间中
  2. Docker的存储空间
  3. 宿主机器的存储存储空间

Docker 数据存储
图片引用自Docker 数据存储

 volumes:
      # 数据持久化
      - /Users/mac/docker/mongodb/ch4/data/db:/data/db # 挂载数据文件,根据实际路径修改 :前的路径
      - /Users/mac/docker/mongodb/ch4/data/log:/var/log/mongodb  # 挂载日志文件,根据实际路径修改 :前的路径
      - /Users/mac/docker/mongodb/ch4/mongod.conf:/etc/mongod.conf # 挂载配置文件,根据实际路径修改 :前的路径

我这里直接用是放到了 宿主机器的存储存储空间,感觉迁移和备份的时候会方便一点,volume的映射规则为

# 宿主机路径:容器路径
hostPath:containerPath

2.2 使用自己的 mongod.conf

mongod.conf 也是放在宿主机器上的,这样修改配置和迁移的时候会方便的。

# 我的实现    
volumes: 
       ...
 - /Users/mac/docker/mongodb/ch4/mongod.conf:/etc/mongod.conf # 挂载配置文件,根据实际路径修改 :前的路径

command '--config /etc/mongod.conf'
# 或者
command ['mongod', '--config','/etc/mongod.conf']

有一点值得一提,在配置config的时候,并不是梳理,网上的文章中文是直接在config后面跟宿主机器上的绝对路径,但是我运行时就报错

# !!!教程使用的是宿主机器上的绝对路径
# !!!未成功运行的配置
command '--config /Users/mac/docker/mongodb/ch4/mongod.conf'

Untitled 1.png

后面我查了一些docker下面 mongod.conf 的配置相关文章,理解造成这个问题的原因是:

容器里面确实无法找到宿主机器上的绝对路径。

解决思路:

volumes 下面配置mongod.conf的路径映射,如果/data/db 能成功映射到宿主机器上,那么对于容器中运行 /etc/mongod.conf 是容器实例也应该按照映射路径找到 /Users/mac/docker/mongodb/ch4/mongod.conf

所以最后才有这个最后的command配置


command '--config /etc/mongod.conf'
# 或者
command ['mongod', '--config','/etc/mongod.conf']

如果使用容器中的 mongo.conf 成功运后是下面这个样子

Untitled 2.png

如果使用自己宿主机器上的配置,则界面会卡在 attaching那一步。但mongodb确实是启动起来了,连接也是正常,数据持久化也实现了。我在网上查了,说是没什么影响,可以用 docker-compose up -d 后台运行来避开这个看起来不舒服的界面 😅

Untitled 3.png

参考文章

  1. http://docker.baoshu.red/data_management/volume.html
  2. https://blog.csdn.net/ber_bai/article/details/122766597
  3. https://stackoverflow.com/questions/37063662/docker-mongodb-config-file
  4. https://www.freecodecamp.org/chinese/news/docker-mount-volume-guide-how-to-mount-a-local-directory/
© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容