如何在Windows机器上访问Docker数据卷?

12

我有一个像这样的 docker-compose.yml 文件:

version: '3'
services:
  mysql:
    image: mysql
    volumes:
      - data:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=$ROOT_PASSWORD

volumes:
  data:

我的挂载点看起来像这样:/var/lib/docker/volumes/some_app/_data,我想访问该挂载点上的数据,但不确定如何在 Windows 机器上做到。也许我可以创建另一个容器来传递 Docker 虚拟机中的数据到我的目录中?

当我像这样挂载文件夹时:

volumes:
  - ./data:/var/lib/mysql

尝试使用本地目录时,由于权限问题无法成功。我读到“正确的方法”是使用docker卷。

更新:MySQL容器仅是示例。我希望为我的代码库使用这种行为,并使用Docker进行本地开发。

2个回答

18
对于在Windows下运行的Linux容器,Docker实际上是在一个Linux虚拟机上运行的,因此您的命名卷是将该VM中的本地目录映射到容器中的目录。所以,您得到的/var/lib/docker/volumes/some_app/_data实际上是该VM中的一个目录。要检查它,您可以执行以下操作:
docker run --rm -it -v /:/vm-root alpine:edge ls -l /vm-root/var/lib/docker/volumes/some_app/_data
total 188476
-rw-r-----    1 999      ping            56 Jun  4 04:49 auto.cnf
-rw-------    1 999      ping          1675 Jun  4 04:49 ca-key.pem
-rw-r--r--    1 999      ping          1074 Jun  4 04:49 ca.pem
-rw-r--r--    1 999      ping          1078 Jun  4 04:49 client-cert.pem
-rw-------    1 999      ping          1679 Jun  4 04:49 client-key.pem
-rw-r-----    1 999      ping          1321 Jun  4 04:50 ib_buffer_pool
-rw-r-----    1 999      ping      50331648 Jun  4 04:50 ib_logfile0
-rw-r-----    1 999      ping      50331648 Jun  4 04:49 ib_logfile1
-rw-r-----    1 999      ping      79691776 Jun  4 04:50 ibdata1
-rw-r-----    1 999      ping      12582912 Jun  4 04:50 ibtmp1
drwxr-x---    2 999      ping          4096 Jun  4 04:49 mysql
drwxr-x---    2 999      ping          4096 Jun  4 04:49 performance_schema
-rw-------    1 999      ping          1679 Jun  4 04:49 private_key.pem
-rw-r--r--    1 999      ping           451 Jun  4 04:49 public_key.pem
-rw-r--r--    1 999      ping          1078 Jun  4 04:49 server-cert.pem
-rw-------    1 999      ping          1675 Jun  4 04:49 server-key.pem
drwxr-x---    2 999      ping         12288 Jun  4 04:49 sys

这是运行一个辅助容器,将该虚拟机的整个根文件系统 / 挂载到容器目录 /vm-root 中。

为了获取某些文件,在后台使用某个命令运行容器(在我的情况下是 tail -f /dev/null),然后可以使用 docker cp 命令:

docker run --name volume-holder -d -it -v /:/vm-root alpine:edge tail -f /dev/null
docker cp volume-holder:/vm-root/var/lib/docker/volumes/volumes_data/_data/public_key.pem .

如果你想对那个虚拟机进行透明的SSH连接,截至2017年6月,似乎还不支持。这里有一位Docker员工说过这件事情。请参考链接:https://forums.docker.com/t/how-can-i-ssh-into-the-betas-mobylinuxvm/10991/8

将这个容器添加到我的 docker-compose.yml 中以便将来使用,这是一个好的方法吗?或者您能否建议更好的代码同步方式? - Oleksandr Savchenko
1
我认为这样做没问题。 - Robert
1
这还有效吗? - Thomas Fauskanger
2
上述方法是可行的。然而,它非常繁琐,在Windows上使用Docker时,使卷概念几乎无法使用。 - Holger Brandl
filebrowser 可能会有所帮助。 - petrosmm

0
当使用WSL2集成时,卷存储在\\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes\中。
可以通过Windows资源管理器直接访问这些文件。
通过创建一个新的容器来测试您的mysql示例。
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=not-secure -d mysql:latest

我在先前提到的路径下得到一个新的卷(目录),其中mysql数据位于<volume-id>\_data下。例如完整路径:\\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes\32475b20a9ddbf656ece0d00f33e35c543a4e08cd4ce108807b4952743a91ee1\_data\performance_schema

附注:我不认为建议将数据从Windows系统复制粘贴或移动到WSL-Network路径。权限、行结尾和所有权可能不会按照您的预期结果。


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