如何保存 Docker Redis 容器

32

我创建Docker Redis容器的镜像时遇到了麻烦,因为我需要将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 volume 的路径。然后,您可以按如下方式将其挂载到新容器中:

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

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


我把我现在发现的一切都放在了一个博客文章中:在medium.com上的我的博客文章

也许对某些人有用。

2个回答

30

在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服务器。

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

Source: https://github.com/dockerfile/redis


你首先停止容器(容器中的数据会丢失),然后再提交它。也许你可以在停止之前提交? - Frenus
啊,我想我误解了你的问题。你想要保存图像内部的数据。据我所知,很抱歉这是不可能的 :-(。 - Frenus
你试过在停止容器之前提交吗? - Frenus
是的,它没有帮助 :( - ehrt1974
1
你说得对,它确实会生成一个数据卷。我也无法让它工作。丑陋的解决方案是手动共享RDB文件,我想 :-(。 - Frenus
显示剩余3条评论

4

使用数据卷和手动共享RDB文件并不丑陋,事实上这正是数据卷的设计初衷,将数据与容器分离。

但如果您确实需要/希望将数据保存到映像中并以此方式共享,您只需将Redis的工作目录从卷/data更改为其他位置即可:

  • Option 1 is changing --dir when start the redis container:

    docker run -d redis --dir /tmp
    

    Then you can follow your steps to create new image. Note that only /tmp could be used by this method due to permission issue.

  • Option 2 is creating a new image with changed WORKDIR:

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

    Then docker build -t redis-new-image and use this image to do your job.


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接