【问题标题】:how to save a docker redis container如何保存 docker redis 容器
【发布时间】:2017-09-06 13:23:57
【问题描述】:

我无法使用 redis 数据库中的数据创建 docker redis 容器的映像。目前我正在这样做:

docker pull redis
docker run --name my-redis -p 6379:6379 -d redis
redis-cli
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> save
OK
127.0.0.1:6379> exit
docker stop my-redis
docker commit my-redis redis_with_data
docker run --name my-redis2 -p 6379:6379 -d redis_with_data
redis-cli
127.0.0.1:6379> keys *
(empty list or set)

我显然不了解这里的一些非常基本的东西。 docker commit 不会从现有容器创建新镜像吗?


好的,我一直在做一些挖掘工作。 hub.docker 上的默认 redis 映像使用数据卷,然后将其安装在容器中的 /data 处。为了在容器之间共享此卷,您必须使用以下参数启动一个新容器:

docker run -d --volumes-from <name-of-container-you-want-the-data-from> \
  --name <new-container-name> -p 6379:6379 redis

注意参数的顺序很重要,否则 docker run 会静默失败。

docker volume ls

会告诉你 docker 已经在你的计算机上创建了哪些数据卷。我还没有找到一种方法来给这些卷起一个简单的名字,而不是一个长的随机字符串。

我还没有找到挂载数据卷的方法,而只是使用--volumes-from 命令。


好的。我现在可以使用它了,但它很笨拙。

docker volume ls
docker volume inspect <id of docker volume>

您可以在本地文件系统上找到 docker 卷的路径。 然后,您可以将其挂载到新容器中,如下所示:

docker run -d -v /var/lib/docker/volumes/<some incredibly long string>/_data:/data \
   --name my-redis2 -p 6379:6379 redis

这显然不是你应该这样做的方式。我会继续挖掘。


我将我迄今为止发现的所有内容都写在了一篇博文中:my blog post on medium.com

也许这对某人有用

【问题讨论】:

    标签: docker redis


    【解决方案1】:

    docker 中的数据不是持久的,当您重新启动容器时,您的数据将消失。为了防止这种情况,您必须与您的容器共享主机上的地图。当您的容器重新启动时,它将从主机上的地图中获取数据。

    您可以在 Docker 文档中了解更多信息:https://docs.docker.com/engine/tutorials/dockervolumes/#data-volumes

    来自 redis 容器文档:

    运行 redis-server

    docker run -d --name redis -p 6379:6379 dockerfile/redis
    

    使用持久数据目录运行 redis-server。 (创建 dump.rdb)

    docker run -d -p 6379:6379 -v <data-dir>:/data --name redis dockerfile/redis
    

    使用持久数据目录和密码运行 redis-server。

    docker run -d -p 6379:6379 -v <data-dir>:/data --name redis dockerfile/redis redis-server /etc/redis/redis.conf --requirepass <password>
    

    来源: https://github.com/dockerfile/redis

    【讨论】:

    • 我可以停止并重新启动容器并且数据仍然存在。我想将所有数据都包含在图像中,这样我就可以将图像发送给某人,他们就可以运行它。
    • 你首先停止容器(容器上的数据)然后你提交它。也许你可以在停止之前提交?
    • 容器停止时数据不会消失。它(至少在我的系统上)是持久的。
    • 啊,我想我理解错了你的问题。您想将数据保存在图像中。据我所知,这是不可能的对不起:-(。
    • 你说得对,它确实会产生数据量。我也无法让它工作。丑陋的解决方案是手动共享我认为的 RDB 文件:-(。
    【解决方案2】:

    使用数据卷并手动共享RDB文件并不难看,实际上这就是数据卷的设计目的,将数据与容器分开。

    但如果您真的需要/想要将数据保存到映像并以这种方式共享,您可以将 redis 工作目录从卷 /data 更改为其他位置:

    • 选项1在启动redis容器时更改--dir

      docker run -d redis --dir /tmp
      

      然后您可以按照您的步骤创建新图像。请注意,由于权限问题,此方法只能使用/tmp

    • 选项 2 正在创建一个更改了 WORKDIR 的新图像:

      FROM redis
      
      RUN mkdir /opt/redis && chown redis:redis /opt/redis
      WORKDIR /opt/redis
      

      然后docker build -t redis-new-image 并使用此图像完成您的工作。

    【讨论】:

      猜你喜欢
      • 2017-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-07
      • 2017-07-11
      • 2020-05-31
      • 1970-01-01
      • 2019-06-06
      相关资源
      最近更新 更多