Gra*_*ant 5 windows docker wsl2
我了解 docker-desktop 的 WSL2 后端通过创建 2 个发行版来工作:docker-desktop
& docker-desktop-data
。
我可以看到这些发行版的文件系统安装在我的 Ubuntu WSL2 发行版中:
grant@BeastMini-II:~$ ls -l /mnt/wsl
total 4
drwxr-xr-x 4 root root 100 Apr 1 09:12 docker-desktop
drwxr-xr-x 3 root root 60 Apr 1 09:12 docker-desktop-bind-mounts
drwxr-xr-x 4 root root 80 Apr 1 09:12 docker-desktop-data
-rw-r--r-- 1 root root 197 Apr 1 09:12 resolv.conf
Run Code Online (Sandbox Code Playgroud)
当我通过 Powershell 查看 docker-desktop-data 时,我可以看到文件系统中的各种文件:
PS C:\Users\grant> ls \\wsl$\docker-desktop-data
Directory: \\wsl$\docker-desktop-data
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 01/02/2023 18:36 lost+found
d----- 01/02/2023 18:36 .docker
d----- 01/02/2023 18:36 tmp
d----- 01/04/2023 09:12 etc
d----- 01/02/2023 18:36 isocache
d----- 01/04/2023 09:12 run
d----- 01/02/2023 18:36 sbin
d----- 01/02/2023 18:36 data
d----- 01/02/2023 18:36 bin
d----- 01/02/2023 18:36 mnt
d----- 01/04/2023 09:12 sys
d----- 01/02/2023 18:36 usr
d----- 01/04/2023 09:12 proc
d----- 01/04/2023 09:12 dev
------ 26/01/2023 12:11 1813552 wsl-keepalive
------ 01/01/1970 00:00 1955960 init
Run Code Online (Sandbox Code Playgroud)
...但是当我在 Ubuntu 中查看已安装的文件系统时,我只看到文件系统的一小部分:
grant@BeastMini-II:~$ ls -l /mnt/wsl/docker-desktop-data
total 4
drwxr-xr-x 2 root root 40 Apr 1 09:12 data
drwxr-xr-x 3 root root 4096 Feb 1 18:36 isocache
Run Code Online (Sandbox Code Playgroud)
/mnt/wsl/docker-desktop-data
为什么我在 Ubuntu WSL2 发行版中看不到整个文件系统?
是什么决定了哪些文件会出现在该安装的目录中,哪些不会出现?
在正在运行的发行版中 -与使用手动安装后有何/mnt/wsl/docker-desktop-data
不同?我可以清楚地看到后者中更多的文件系统。/some/mount/path
docker-desktop-data
sudo mount -t drvfs '\\wsl$\docker-desktop-data' /some/mount/path
如何查看docker-desktop-data
WSL2 发行版中的整个目录 - 我已经知道可以使用 `sudo mount -t drvfs '\wsl$\docker-desktop-data' /some/mount/pat 挂载它
注意:此答案中的信息已针对 WSL 1.2.0 和 Docker Desktop 4.18.0 进行了验证。下面讨论的方法在过去已经发生过变化,并且将来可能会再次发生变化。
在 WSL2 发行版中 - 是什么决定了出现在以下位置的文件:
/wsl/{some-other-distro}
问题标题有点含糊。我相信您正在询问/mnt/wsl/{some-other-distro}
,但您遗漏了这一/mnt
部分。或者您可能会询问共享\\wsl.localhost\<distro>
(又名\\wsl$\<distro>
)。
对于后者,发行版的 rootfs 通过共享提供\\wsl.localhost
(现在首选版本,而不是已弃用但仍然可用的版本\\wsl$\
)。
对于/mnt/wsl
,没有自动过程 - 每个发行版(甚至最终用户)都可以在 下安装他们喜欢的任何内容/mnt/wsl
。Docker 选择在启动时执行此操作,但您也可以使用类似我的答案的内容创建自己的安装。
就/mnt/wsl
其本身而言,WSL 会自动生成一些文件,以便它们在所有发行版中都可用:
resolv.conf
- 自动生成的解析器配置,然后符号链接到/etc/resolv.conf
.
(在最新版本的 WSL 中): /mnt/wsl/run
然后/mnt/wsl/user
将其绑定安装到各自的目录中。
/mnt/wsl/docker-desktop-data
为什么我在 Ubuntu WSL2 发行版中看不到整个文件系统?
在正在运行的发行版中 -与使用手动安装后有何
/mnt/wsl/docker-desktop-data
不同?我可以清楚地看到后者中更多的文件系统。/some/mount/path
docker-desktop-data
sudo mount -t drvfs '\\wsl$\docker-desktop-data' /some/mount/path
正如您所注意到的(或至少假设的),Docker Desktop 不会为docker-desktop-data
自身安装虚拟驱动器。相反,它会创建一个到该驱动器子目录的绑定安装(以及到其他子目录的许多其他绑定安装)。在较高的层面上,docker-desktop-data
似乎使用了一种类似于我在发行版之间共享文件的答案中的技术,因为在启动时,它会为主“共享目录”创建一个绑定安装。
从常规 WSL 发行版中,您可以使用以下命令查看实际安装:
$ findmnt | grep "version-pack-data\s"
| |-/mnt/wsl/docker-desktop-data/version-pack-data /dev/sdf[/version-pack-data] ext4 rw,relatime,discard,errors=remount-ro,data=ordered
Run Code Online (Sandbox Code Playgroud)
在这种情况下,dev/sdf
已分配给虚拟驱动器进行docker-desktop-data
分配。这可能会根据您开始分发的顺序(以及分发数量)而改变。
如果我们可以直接访问docker-desktop-data
发行版,则相当于运行(以 root 身份):
mount --bind / /mnt/wsl/docker-desktop-data/version-pack-data -o X-mount.mkdir
Run Code Online (Sandbox Code Playgroud)
虽然您可能已经知道这一点,但对于其他读者来说,请注意这/mnt/wsl
是tmpfs
由 WSL 本身在每次启动时创建的。它在所有 WSL 发行版中都是共享和可访问的,并且是短暂的——每次 WSL 关闭时,它的内容(挂载点,而不是挂载点下的数据)都会被删除。
是什么决定了哪些文件会出现在该安装的目录中,哪些不会出现?
考虑到上述内容,很明显您所看到的/mnt/wsl/docker-desktop-data
是每个绑定安装的组合,其中第一个是version-pack-data
.
有了完整的findmnt
,您还会注意到许多其他docker-desktop-data
坐骑。虽然对其中每一个进行逆向工程都超出了任何一个答案的范围,但还是有一些有趣的答案。从内部docker-desktop
运行:
mount | grep iso
Run Code Online (Sandbox Code Playgroud)
这将向您展示 Docker 如何自行交付可执行文件和库。这些 ISO 可以在 WindowsDocker
安装文件夹中找到(通常是C:\Program Files\Docker\Docker\resources
)。当 Docker 发布新版本时,ISO 文件会更新为最新版本,然后挂载到 WSL 中。
旁注:
您会注意到该mount
命令仅显示/dev/sdf
正在安装在/mnt/wsl/docker-desktop-data/version-pack-data
. 如果您在首选发行版中自己创建了绑定安装,也会发生同样的情况。例如:
$ sudo mount --bind /home /mnt/wsl/test -o X-mount.mkdir
$ mount | grep home
# Doesn't find anything
$ mount | grep test
/dev/sdc on /mnt/wsl/test type ext4 (rw,relatime,discard,errors=remount-ro,data=ordered)
Run Code Online (Sandbox Code Playgroud)
findmnt
但是,您可以从(如上所述)或以下位置获得更好的信息:
$ cat /proc/self/mountinfo | grep home
1734 71 8:32 /home /mnt/wsl/test rw,relatime shared:501 - ext4 /dev/sdc rw,discard,errors=remount-ro,data=ordered
Run Code Online (Sandbox Code Playgroud)
正如您现在可能已经意识到的那样,将docker-desktop-data
驱动器作为本机安装ext4
可能比使用更好drvfs
:
$ findmnt -a | grep "version-pack-data\s"
| |-/mnt/wsl/docker-desktop-data/version-pack-data /dev/sdf[/version-pack-data] ext4 rw,relatime,discard,errors=remount-ro,data=ordered
# Using the block device returned (sdf in this case):
$ sudo mount /dev/sdf /mnt/wsl/instances/docker-desktop-data -o X-mount.mkdir
$ cd /mnt/wsl/instances/docker-desktop-data
Run Code Online (Sandbox Code Playgroud)
这将提供本机权限、符号链接等。
在 WSL 的最新版本中,可以从根命名空间(也称为调试 Shell)执行更多探索。在管理 PowerShell 中,运行:
wsl --debug-shell
Run Code Online (Sandbox Code Playgroud)
此根命名空间显示每个发行版中的所有docker-desktop-data
正在运行的进程,包括.
只有一个进程在运行docker-desktop-data
(除了默认的init
和 Plan 9 服务器之外,那就是 )wsl-keepalive
。我将假设显而易见的名称——这只是一个长时间运行的进程,以保持docker-desktop-data
运行和可访问。
您可以通过以下方式演示这一点(同样,在调试 shell 中):
$ cat /proc/$(pgrep wsl-keepalive)/environ | xargs -0 -I{} echo {} | grep WSL_DISTRO_NAME
WSL_DISTRO_NAME=docker-desktop-data
Run Code Online (Sandbox Code Playgroud)
您还可以使用lsns
、nsenter
等探索其他发行版命名空间。但是,请注意,缺少 shell 或任何其他可执行文件docker-desktop-data
似乎无法使用它nsenter
来探索该特定名称空间。然而,探索/proc/<pid>
该分布仍然很有趣。
归档时间: |
|
查看次数: |
573 次 |
最近记录: |