概述
在上一篇文章《树莓派3B 使用 Docker 安装 MongoDB》中,我们尝试使用 rpi-mongodb3 来运行 docker mongodb。然而,在实际使用中,系统重启、关机或者将 mongodb 容器停止后,容器就不能再次被启动,本文将尝试找到其原因以及解决方案。
关键词 rpi-mongodb3
mongo.lock
问题描述
首先,我已经创建好一个 rpi-mongodb3 的容器,我们先查看容器的情况:
docker container ls>>CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c1514a9534be andresvidal/rpi3-mongodb3 "/docker-entrypoint.…" 2 hours ago Up 4 seconds 0.0.0.0:27017->27017/tcp, 28017/tcp mongodb_home
接下来,我们使用 docker stop
来将容器停止:
docker stop mongodb_home
我们再查看一下现在容器的状态:
docker container ls -a>>c1514a9534be andresvidal/rpi3-mongodb3 "/docker-entrypoint.…" 2 hours ago Exited (137) 2 minutes ago mongodb_home
接下来,我们尝试重新启动容器:
docker start mongodb_home docker container ls -a>>CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c1514a9534be andresvidal/rpi3-mongodb3 "/docker-entrypoint.…" 2 hours ago Exited (100) 3 seconds ago mongodb_home
我们可以看到,这里容器并没有正常被启动,我们使用 docker log
来查看一下日志:
docker logs -f mongodb_home --tail 10 --timestamps>>2018-05-03T11:15:08.601093125Z 2018-05-03T11:15:08.601+0000 I CONTROL [initandlisten] build info: Linux raspberrypi 4.9.41-v7+ #1023 SMP Tue Aug 8 16:00:15 BST 2017 armv7l BOOST_LIB_VERSION=1_49 2018-05-03T11:15:08.601208904Z 2018-05-03T11:15:08.601+0000 I CONTROL [initandlisten] allocator: system 2018-05-03T11:15:08.601368694Z 2018-05-03T11:15:08.601+0000 I CONTROL [initandlisten] options: { net: { http: { RESTInterfaceEnabled: true, enabled: true } }, security: { authorization: "enabled" } } 2018-05-03T11:15:08.625743003Z 2018-05-03T11:15:08.625+0000 W - [initandlisten] Detected unclean shutdown - /data/db/mongod.lock is not empty. 2018-05-03T11:15:08.656666026Z 2018-05-03T11:15:08.656+0000 I STORAGE [initandlisten] ************** 2018-05-03T11:15:08.656785816Z Unclean shutdown detected. 2018-05-03T11:15:08.656833159Z Please visit http://dochub.mongodb.org/core/repair for recovery instructions. 2018-05-03T11:15:08.656869096Z ************* 2018-05-03T11:15:08.662197879Z 2018-05-03T11:15:08.661+0000 I STORAGE [initandlisten] exception in initAndListen: 12596 old lock file, terminating 2018-05-03T11:15:08.662328867Z 2018-05-03T11:15:08.662+0000 I CONTROL [initandlisten] dbexit: rc: 100
可以看到日志,不能重新启动容器的原因是因为 mongo 非正常关闭,生成了 mongo.lock 文件。我们根据这个线索,来寻找解决方案。
解决方案一 —— 删除 mongo.lock
最为简单粗暴的方法是直接删除 mongo.lock 文件,我的 mongodb 容器挂载了数据卷在 /home/pi/db/mongo
之下,我们先删除 mongo.lock 文件,再尝试重启容器看看是否能成功。
sudo rm -rf /home/pi/db/mongo/mongod.lock docker start mongodb_home docker container ls >>CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c1514a9534be andresvidal/rpi3-mongodb3 "/docker-entrypoint.…" 3 hours ago Up 14 seconds 0.0.0.0:27017->27017/tcp, 28017/tcp mongodb_home
我们可以看到,我们的 mongodb 容器又能正常启动了。
解决方案二 —— 使用 kill 替代 stop 停止容器
在 rpi-mongodb3 的 Github 页面,有提到可以使用 kill 来停止容器,我们也尝试以下使用 kill 命令替代 stop 是否能正常停止和重启:
docker kill --signal=SIGINT mongodb_home docker container ls -a>>CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c1514a9534be andresvidal/rpi3-mongodb3 "/docker-entrypoint.…" 3 hours ago Exited (0) 4 seconds ago docker start mongodb_home>>docker start mongodb_home docker container ls>>CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c1514a9534be andresvidal/rpi3-mongodb3 "/docker-entrypoint.…" 3 hours ago Up 6 seconds 0.0.0.0:27017->27017/tcp, 28017/tcp mongodb_home
这里我们可以看到,使用 kill 替代 stop 停止容器,容器停止后,容器的状态是 Exited (0)
而使用 stop 停止容器,容器的状态是 Exted(100)
,可以猜测可能是因为 stop 命令使 mongo 容器无法正常停止,从而生成了 mongo.lock 文件,让容器的数据库锁死保护。
X86平台的 mongo 官网 docker 镜像
为探求这一问题是否 mongo 的 Docker 容器的 Bug,我尝试在 X86 平台上尝试,但并没有发现类似的问题,可能是由于这个 rpi-mongodb 容器的问题,由于在树莓派上使用 mongodb docker 镜像容器的并不多,到目前为止除了以上两个解决方案之外并没有找到更好的解决办法。因此就只能到这里为止,日后有更新或者有解决方案,再补充一篇文章再作说明。
作者:speculatecat
链接:https://www.jianshu.com/p/7702b7799a78