手记

rpi-mongodb3 容器无法重启解决方案

概述

在上一篇文章《树莓派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

0人推荐
随时随地看视频
慕课网APP