使用 Docker 进行 MongoDB 容器的迁移(在创建镜像时创建数据库和集合)

这是一个关于某事的背景信息。

出于对本地环境的MongoDB使用更加轻松便捷的想法,我决定将其转换为Docker容器。
在将MongoDB转换为容器时,我尝试使用DockerHub上的MongoDB官方镜像,并在容器创建时进行迁移操作,但由于一些问题无法成功,所以我决定自己制作镜像。这是作为一个对这种官方镜像无奈的记录。

创建图像

基础镜像将使用debian:wheezy-slim。

安装MongoDB

使用的MongoDB版本是3.6。

将Mongo安装到Debian Wheezy可以采用Mongo官方网站的方法。

# 鍵の追加
RUN  apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6

# apt update && MongoDB install
RUN apt-get update \
    && apt-get install -y --no-install-recommends \
          mongodb-org=${MONGO_INSTALL_VAERSION}\
          mongodb-org-server=${MONGO_INSTALL_VAERSION}\
          mongodb-org-shell=${MONGO_INSTALL_VAERSION}\
          mongodb-org-mongos=${MONGO_INSTALL_VAERSION}\
          mongodb-org-tools=${MONGO_INSTALL_VAERSION}

CMD ["mongod"]

如果继续这样下去,Mongo进程就会死掉。
看起来,在/var/下无法写入数据和日志?
参考官方的Dockerfile,经过一番试验和错误,我改变了配置和Dockerfile如下。

systemLog:
  path: "/data/log/mongodb/mongod.log"
storage:
  dbPath: "/data/db"

RUN rm -rf /var/lib/mongodb \
    && mkdir -p /data/db /data/log/mongodb \
    && chown -R mongodb:mongodb /data/db /data/log/mongodb

现在,起初我们已经成功启动了Mongo容器,接下来我们将进行迁移的工作。

MongoDB 数据迁移

MongoDB用户可以使用.js文件将迁移数据从外部文件加载,并且从之前使用的MongoDB中提取dump并通过mongorestore工具进行恢复。

在创建图像阶段,由于Mongo进程未启动,需要使用mongod来启动Mongo服务器。
在此过程中,通过mongod.conf配置文件进行配置。

processManagement:
  fork: flase

要等待与2017年连接的端口,并且在有输入之前会停止处理。

processManagement:
-  fork: flase
+  fork: true 

留下来。

然后,在”monogo –quiet”命令中,使用良好的js文件创建用户,然后使用mongoretore将BSON流入。

js文件和BSON被复制并在使用后被删除。

COPY initialize /usr/src/init/

ENV MONGO_HOST localhost
ENV MONGO_PORT 27017

RUN mongod --config /etc/mongod.conf \
    && mongo --quiet ${MONGO_HOST}:${MONGO_PORT}/admin /usr/src/init/create_user/admin.js \
    && mongo --quiet ${MONGO_HOST}:${MONGO_PORT}/demo /usr/src/init/create_user/demo.js \
    && mongorestore --db demo --host ${MONGO_HOST} --port ${MONGO_PORT} /usr/src/init/dump/demo \
    && rm -rf /usr/src/init/

尝试迁移MongoDB容器时容易遇到的问题。

    1. 如果使用默认的Mongo配置,则Mongo进程将会崩溃。

 

    1. -> 将数据和日志保存位置从/var/更改为其他位置。

 

    1. -> 我会研究一下这是否是Docker的规定。如果有人知道,请告诉我。

无法在等待连接端口2017上进行下一步操作。
-> 将processManagement.fork设置为true。

无法熟练使用官方的镜像 ( º﹃º )
-> 我会找时间努力学习一下…

还有其他很多问题,但一结束就不记得卡在了哪里…
过去的事情就像过眼云烟。非常抱歉。。。m(_ _)m

最终

公式的映像很方便,但是自己創建Dockerfile也能學到很多東西。
當映像建立好之後,為了使其更輕量化,進行種種處理時,自然會調查Docker的機制,所以效率至上,使用公式映像也不錯,但是在閒暇時,也可以考慮自己創建映像呢。

从来没有完全掌握过官方形象的借口( ; ; )

代码已上传至GitHub,请参考GitHub存储库获取详细信息。

广告
将在 10 秒后关闭
bannerAds