我创建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上的我的博客文章
也许对某些人有用。