解决Docker for Windows无法共享磁盘的问题

絕刀狂花
发布: 2025-09-27 09:14:24
原创
888人浏览过

docker for windows 简化了windows下使用docker的流程,而且其有一项非常好的功能就是共享本地磁盘给docker(docker mount),但在实际使用中发现无法共享磁盘给docker,报错为:

解决Docker for Windows无法共享磁盘的问题
0x01 错因分析

错误提示很明确,因为防火墙的问题导致无法正常共享磁盘。这里要提一下,Docker for Windows本质也是通过一个运行在hyper-v上Linux虚拟机来实现的,而其共享磁盘的方案也是通过samba来,也就是说,Windows作为samba服务器,然后运行docker的虚拟机通过smbclient访问Windows的samba服务。samba服务使用的是445端口,也就是说,docker虚拟机无法访问主机的445端口。可以通过下面的命令来验证:

代码语言:txt复制
<code class="txt">docker run --rm -it --net=host alpine /bin/shnc -vz 10.0.75.1 445</code>
登录后复制
解决Docker for Windows无法共享磁盘的问题run.png

上图中10.0.75.1为docker网络设置的网关,可以看到,如果端口无法访问,会在等待一段时间超时后报错。

那为什么防火墙会拦截samba服务了。首先我们要先分析一下防火墙的规则了。打开控制面板,依次选择“系统和安全”->“Windows Defender 防火墙”,然后打开左侧“高级设置”中的“入站规则”

解决Docker for Windows无法共享磁盘的问题firewall.png

可以看到入站规则中有很多“阻止的规则”,但是也有一条明确放通10.0.75.1445端口的访问,可为什么还是不行呢?

通过Google,发现Windows的防火墙规则并不是按照规则先后顺序执行的,而是“阻止规则”优先级大于“放通规则”,参见:https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc755191(v=ws.10)。

0x02 解决方法

那如何处理呢?当然可以通过关闭防火墙来直接验证。但是这只是一种临时的验证方式,因为关闭防火墙很不安全而且公司本身也不允许。

无涯·问知
无涯·问知

无涯·问知,是一款基于星环大模型底座,结合个人知识库、企业知识库、法律法规、财经等多种知识源的企业级垂直领域问答产品

无涯·问知40
查看详情 无涯·问知

分析一下阻止规格,并不是所有源IP都被禁止了访问445端口,这就给我们提供了一个解决方式,找一个没有被禁止访问445端口IP端作为Docker for Windows的subnet address。

首先打开cmd,使用下面命令将所有入站的规则导出到文件中:

代码语言:txt复制
<code class="txt">netsh advfirewall firewall show rule name=all dir=in type=dynamic status=enabled > d:/firewall_rules.txt</code>
登录后复制

然后将所有操作为阻止,协议为TCP的规则中的远程IP全部复制出来。然后上python处理,这里使用了IPy库进行网关的判断和处理。

代码语言:txt复制
<code class="txt">from IPy import IP# netsh advfirewall firewall show rule name=all dir=in type=dynamic status=enabled > d:/firewall_rules.txtfirewall_rules = """169.254.2.0/2410.3.128.0/179.19.161.0/26,9.19.161.64/26,10.3.224.0/19"""net_sets = []for line in firewall_rules.strip().split('\n'):    line = line.strip()    line_seg = line.split(',')    for net_string in line_seg:        print(net_string)        net_sets.append(IP(str(net_string)))        for net in net_sets:    for l2 in range(0, 255):        for l3 in range(0, 255):            ip_net = "10.%s.%s.0" % (l2, l3)            if ip_net in net:                continue            print("Net %s is available" % ip_net)</code>
登录后复制

然后从打印出的网段中找一个更新到Docker网络中,然后就可以愉快的共享磁盘了。

解决Docker for Windows无法共享磁盘的问题Image.png

以上就是解决Docker for Windows无法共享磁盘的问题的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号