美文网首页树莓派Docker容器程序员
rpi-mongodb3 容器无法重启解决方案

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

作者: speculatecat | 来源:发表于2018-05-03 19:45 被阅读15次

    概述

    在上一篇文章《树莓派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 镜像容器的并不多,到目前为止除了以上两个解决方案之外并没有找到更好的解决办法。因此就只能到这里为止,日后有更新或者有解决方案,再补充一篇文章再作说明。

    相关文章

      网友评论

        本文标题:rpi-mongodb3 容器无法重启解决方案

        本文链接:https://www.haomeiwen.com/subject/nzdlrftx.html