使用 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容器时容易遇到的问题。
-
- 如果使用默认的Mongo配置,则Mongo进程将会崩溃。
-
- -> 将数据和日志保存位置从/var/更改为其他位置。
-
- -> 我会研究一下这是否是Docker的规定。如果有人知道,请告诉我。
无法在等待连接端口2017上进行下一步操作。
-> 将processManagement.fork设置为true。
无法熟练使用官方的镜像 ( º﹃º )
-> 我会找时间努力学习一下…
还有其他很多问题,但一结束就不记得卡在了哪里…
过去的事情就像过眼云烟。非常抱歉。。。m(_ _)m
最终
公式的映像很方便,但是自己創建Dockerfile也能學到很多東西。
當映像建立好之後,為了使其更輕量化,進行種種處理時,自然會調查Docker的機制,所以效率至上,使用公式映像也不錯,但是在閒暇時,也可以考慮自己創建映像呢。
从来没有完全掌握过官方形象的借口( ; ; )
代码已上传至GitHub,请参考GitHub存储库获取详细信息。