Docker 卷未与 Redis 一起使用(装载确实显示在检查中)
Docker volume not used with Redis (mount does show up with inspect)
我最后的结论是我无法设置 /c/users/...
位置,因为它没有在 "Docker". [=28] 中共享=]
在此之后,我能够看到 所有 我的容器实例中的/c/users/..
目录。然后我可以在每个实例上使用带有此目录的 -v
标志,基本上是将文件写入我的主机。
我仍然不明白的是,我不认为我现在实际上在使用 volumes
...但它有效...
我正在尝试让我的 Docker 托管的 Redis 实例保留其数据,但安装的卷似乎没有被使用。我在组合工作的地方使用 Docker 和 VirtualBox/boot2docker,但是我已经移动到 Docker for Windows 组合文件仍然有效,但我不确定volumes
属性.
我的 docker-compose.yml
文件:
vq-redis:
image: redis:latest
ports:
- "6379:6379"
volumes:
- /c/users/r/.docker/data/redis/data:/data
如果我添加或删除 volumes
定义并不重要,因为它总是会显示类似 docker inspect
的内容:
"Mounts": [
{
"Name": "40791b26771b5d62778d85b0ef24e74e516f95d32cf217424232ce8f8a1b8c6f",
"Source": "/var/lib/docker/volumes/40791b26771b5d62778d85b0ef24e74e516f95d32cf217424232ce8f8a1b8c6f/_data",
"Destination": "/data",
"Driver": "local",
"Mode": "rw",
"RW": true,
"Propagation": "rprivate"
}
],
volumes
属性 是否仍在为 Windows 使用 Docker 还是我漏掉了一点?
编辑:
如果我运行...
docker run --name vq-redis -d -v //c/users/r/.docker/data/vq-redis:/data redis redis-server --appendonly yes
...我可以看到容器出现在 Kitematic 中,并且 docker inspect
我可以看到一个挂载到我的本地文件夹。但是本地文件夹没有在 Kitematic 中显示...
如果我将数据添加到容器中托管的 Redis 服务器,然后停止容器并再次启动它,数据就会消失。
我尝试在 Kitematic 中手动设置本地文件夹。这似乎重新启动了容器,但我不确定是否再次传递了初始参数。你说:
"If the volumes aren't networked on run"
我猜他们 实际上是在 运行 上联网的,正如在控制台中看到的那样。
不过,我可以向容器中托管的 Redis 实例添加数据。但是一旦我重新启动容器它就消失了...
应该可以。我假设您没有收到任何错误(例如,权限问题等),并且您在重建之前删除了旧版本。是否创建了“/var/lib/docker/volumes/4079...”目录?
您可以尝试在 Windows 上使用双前导斜杠,这是某些版本的解决方法:
volumes:
- //c/users/r/.docker/data/redis/data:/data
Redis 与未创建的卷没有任何关系,但您是否尝试过其他服务甚至基本 docker create -v ...
或 docker run -v ...
?
更新:
您对 Docker 工作原理的理解可能存在一些差距,这可能会妨碍您的理解。
如果你这样做 docker run --name some-redis -d redis redis-server --appendonly yes
它将创建一个类似于你在 docker inspect
输出中的卷。很明显,您的 Windows 机器上没有 /var/lib/docker/volumes/...
目录——它位于 VM docker 主机中(例如,boot2docker)。访问 Docker 主机卷的方式因多种因素而异。
如果卷未在 run
上联网,重新启动将无济于事。执行 docker stop some-redis && docker rm some-redis
并重新 run
.
例如。 运行 这个命令
docker run --name some-redis -d -v $(pwd)/data:/data redis redis-server --appendonly yes
应该按你的预期工作。
ls ./data
=> appendonly.aof
。
一开始显然是空的。销毁容器并创建一个具有相同目录的新容器将显示数据仍然存在:
docker exec some-redis echo "set bar baz" | redis-cli
docker stop some-redis
docker rm some-redis
docker run --name some-redis2 -d -v $(pwd)/data:/data redis redis-server --appendonly yes
docker exec some-redis2 echo "get bar" | redis-cli
=> "baz"
(在销毁的容器中设置的 "bar" 的先前值)。
如果这对您不起作用,则可能存在一些特定于您的环境的问题——或许可以尝试基于 Vagrant 的解决方案或测试版 Docker 或本机 Linux 主机。
我最后的结论是我无法设置 /c/users/...
位置,因为它没有在 "Docker". [=28] 中共享=]
在此之后,我能够看到 所有 我的容器实例中的/c/users/..
目录。然后我可以在每个实例上使用带有此目录的 -v
标志,基本上是将文件写入我的主机。
我仍然不明白的是,我不认为我现在实际上在使用 volumes
...但它有效...
我正在尝试让我的 Docker 托管的 Redis 实例保留其数据,但安装的卷似乎没有被使用。我在组合工作的地方使用 Docker 和 VirtualBox/boot2docker,但是我已经移动到 Docker for Windows 组合文件仍然有效,但我不确定volumes
属性.
我的 docker-compose.yml
文件:
vq-redis:
image: redis:latest
ports:
- "6379:6379"
volumes:
- /c/users/r/.docker/data/redis/data:/data
如果我添加或删除 volumes
定义并不重要,因为它总是会显示类似 docker inspect
的内容:
"Mounts": [
{
"Name": "40791b26771b5d62778d85b0ef24e74e516f95d32cf217424232ce8f8a1b8c6f",
"Source": "/var/lib/docker/volumes/40791b26771b5d62778d85b0ef24e74e516f95d32cf217424232ce8f8a1b8c6f/_data",
"Destination": "/data",
"Driver": "local",
"Mode": "rw",
"RW": true,
"Propagation": "rprivate"
}
],
volumes
属性 是否仍在为 Windows 使用 Docker 还是我漏掉了一点?
编辑:
如果我运行...
docker run --name vq-redis -d -v //c/users/r/.docker/data/vq-redis:/data redis redis-server --appendonly yes
...我可以看到容器出现在 Kitematic 中,并且 docker inspect
我可以看到一个挂载到我的本地文件夹。但是本地文件夹没有在 Kitematic 中显示...
如果我将数据添加到容器中托管的 Redis 服务器,然后停止容器并再次启动它,数据就会消失。
我尝试在 Kitematic 中手动设置本地文件夹。这似乎重新启动了容器,但我不确定是否再次传递了初始参数。你说:
"If the volumes aren't networked on run"
我猜他们 实际上是在 运行 上联网的,正如在控制台中看到的那样。
不过,我可以向容器中托管的 Redis 实例添加数据。但是一旦我重新启动容器它就消失了...
应该可以。我假设您没有收到任何错误(例如,权限问题等),并且您在重建之前删除了旧版本。是否创建了“/var/lib/docker/volumes/4079...”目录? 您可以尝试在 Windows 上使用双前导斜杠,这是某些版本的解决方法:
volumes:
- //c/users/r/.docker/data/redis/data:/data
Redis 与未创建的卷没有任何关系,但您是否尝试过其他服务甚至基本 docker create -v ...
或 docker run -v ...
?
更新: 您对 Docker 工作原理的理解可能存在一些差距,这可能会妨碍您的理解。
如果你这样做 docker run --name some-redis -d redis redis-server --appendonly yes
它将创建一个类似于你在 docker inspect
输出中的卷。很明显,您的 Windows 机器上没有 /var/lib/docker/volumes/...
目录——它位于 VM docker 主机中(例如,boot2docker)。访问 Docker 主机卷的方式因多种因素而异。
如果卷未在 run
上联网,重新启动将无济于事。执行 docker stop some-redis && docker rm some-redis
并重新 run
.
例如。 运行 这个命令
docker run --name some-redis -d -v $(pwd)/data:/data redis redis-server --appendonly yes
应该按你的预期工作。
ls ./data
=> appendonly.aof
。
一开始显然是空的。销毁容器并创建一个具有相同目录的新容器将显示数据仍然存在:
docker exec some-redis echo "set bar baz" | redis-cli
docker stop some-redis
docker rm some-redis
docker run --name some-redis2 -d -v $(pwd)/data:/data redis redis-server --appendonly yes
docker exec some-redis2 echo "get bar" | redis-cli
=> "baz"
(在销毁的容器中设置的 "bar" 的先前值)。
如果这对您不起作用,则可能存在一些特定于您的环境的问题——或许可以尝试基于 Vagrant 的解决方案或测试版 Docker 或本机 Linux 主机。