前言

Docker在Windows上的默认安装路径为C:\Program Files\Docker,并且在安装过程中无法指定安装目录,镜像和容器数据通常存储在 C:\ProgramData\Docker

一般安装软件需要安装到其他盘、减少C盘的占用,此时需要通过类似于Linux系统创建软链接的方式将路径C:\Program Files\Docker映射到其他盘。

在安装时是无法选择Docker的存储目录和安装路径的,点击Docker Desktop Installer.exe只会显示如下界面,点击OK之后就安装到C盘上去了,光Docker程序本身就占了2GB空间,加上镜像和容器可能会占用更多存储空间,所以要把它安装和存储镜像容器到别的盘上,

docker安装界面

wsl安装

  1. 打开 PowerShell 或命令提示符(以管理员身份运行),输入以下命令来启用 WSL 功能:
1
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
  1. 输入以下命令来启用虚拟机平台:
1
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
  1. 重启电脑,再次管理员打开命令窗口,输入下面的命令,可能会有点慢 ,长时间没反应就回车一下,刷新显示
1
wsl --install -d Ubuntu
  1. 安装完成,输入密码的时候不会显示,自己把握好。

Ubuntu

安装docker

修改Docker安装目录

1.打开win+R打开运行窗口,输入cmd,同时按下快捷键CTRL+SHIFT+Enter即可以管理员身份打开

Windows自带的cmd命令行

注意:需要保证以管理员身份打开命令行,否则执行创建软链接命令时会提示拒绝访问。,无法创建成功。

1
mklink /j "C:\Program Files\Docker" "E:\Docker"

创建软链接

镜像存储路径配置(这个方法不行)

修改镜像存储位置

出现报错**”connect ENOENT \.\pipe\dockerBackendApiServer”**,这是一个常见的 Docker Desktop 错误,通常与管道通信问题或 Docker Desktop 后台服务未正确运行有关。最后还是没能修改

报错信息

软链接问题

使用软链接注意事项:在创建符号链接或联接时,必须使用管理员权限运行命令提示符,否则会提示权限不足。


安装docker之前C盘的存储空间为404GB,安装之后也是404GB,而安装docker程序所需的存储空间为2GB,说明了docker程序没有安装在C盘上,而是通过软链接安装在了E:\Docker

硬盘空间

疑惑

在C盘的C:\Program Files\Docker文件夹下也能看到docker的安装文件,而且还能正常点开和运行,地址栏的URL也是C盘的而不是跳转到E盘,我还以为docker重复安装在了两个位置,其实没有重复安装,而是在C盘上显示的一种错觉,实际上程序还是在E盘上

在C盘打开docker文件

用了软链接(mklink /j)后,两个目录的内容实际上是共享的。软链接的本质是创建一个指向原始位置的引用,而不是复制文件,因此在查看属性时,系统可能会错误地计算这两个位置的大小,导致它们看起来各自占用了2GB的空间。

使用 mklink /j 创建了一个目录联接,它会让 Windows 将所有对 C:\Program Files\Docker 的访问重定向到 E:\Docker。这样,C:\Program Files\Docker 实际上不再占用额外的磁盘空间。

还能通过创建文件夹的方式检验是否能够成功链接,例如C:\Program Files\Docker创建了 一个新的文件夹test,打开E:\Docker发现test文件夹也在。当我在E:\Docker删除了test文件夹,C:\Program Files\Docker中的test文件夹也消失了

test文件夹

软链接补充知识

硬链接(Hard Link)

作用

​ 为一个文件创建多个引用,多个引用指向相同的文件内容。像同一本书的多个目录入口,它们都指向同一内容。如果其中一个目录入口被删除,其他入口仍然可以访问那本书的内容。硬链接与目标文件共享同一块数据。硬链接和原始文件之间没有区别,都指向磁盘中的相同数据块。删除任意一个链接或原始文件,数据不会丢失,直到所有链接都删除时,数据才会从磁盘中释放。

特点:

​ 只能在同一卷中创建(不能跨磁盘)。

​ 硬链接和原始文件共享同一内容,即使删除了其中一个链接,文件内容仍然存在。

效果:

​ 下面示例展示了通过 C:\backup\report_link.txtC:\data\report.txt 访问同一个文件内容。

​ 无论在 report.txt 还是 report_link.txt 中修改内容,两者都会同步更新,因为它们指向同一块磁盘数据。

​ 如果删除了 report.txtreport_link.txt 依然存在,文件内容不会丢失

1
2
# 示例
mklink /H "C:\backup\report_link.txt" "C:\data\report.txt"

作用:

​ 软链接像一个指针,可以指向文件或目录,支持跨卷操作指向另一个文件或文件夹的位置。如果目标文件或文件夹被删除或移动,软链接会失效(就像坏掉的快捷方式)。

效果:

​ 在 D:\project\data 中有一个数据文件夹,但希望在 C:\work 中也能访问这个文件夹,而不复制它。做了下面这一步之后,可以从 C:\work\data_link 访问 D:\project\data 文件夹中的所有内容,如果在 C:\work\data_link 中创建、修改或删除文件,D:\project\data 中会同步变化。如果删除了 D:\project\data 目录,C:\work\data_link 会指向一个不存在的位置,访问时会出错。

1
mklink /D "C:\work\data_link" "D:\project\data"

二者的区别

软链接与硬链接的区别

目录联接(Junction)

本次方法采用的就是目录链接和软链接非常像。它是一种特殊的链接类型,只能用于目录之间的映射。它允许将一个目录的路径映射到另一个位置,但不支持文件的映射。当想将某个程序或文件夹的路径重定向到另一个磁盘(比如把 C:\Program Files 下的文件重定向到 D 盘),但不想改变原路径时,目录联接非常有用。

1
2
# 这会将 C:\Program Files\Docker 变成一个指向 E:\Docker 的目录联接。
mklink /J "C:\Program Files\Docker" "E:\Docker"
1
mklink [选项] <链接路径> <目标路径>

常用选项:

  • **/D**:创建一个指向目录的符号链接。
  • **/J**:创建目录联接(Junction)。
  • **/H**:创建文件的硬链接。
  • (无选项):默认创建文件的符号链接。