Docker for Windows 簡化了windows下使用docker的流程,,而且其有一項(xiàng)非常好的功能就是共享本地磁盤給docker(docker mount),但在實(shí)際使用中發(fā)現(xiàn)無法共享磁盤給docker,,報(bào)錯為:
0x01 錯因分析錯誤提示很明確,,因?yàn)榉阑饓Φ膯栴}導(dǎo)致無法正常共享磁盤。這里要提一下,,Docker for Windows本質(zhì)也是通過一個運(yùn)行在hyper-v上Linux虛擬機(jī)來實(shí)現(xiàn)的,,而其共享磁盤的方案也是通過 docker run --rm -it --net=host alpine /bin/sh nc -vz 10.0.75.1 445 上圖中10.0.75.1為docker網(wǎng)絡(luò)設(shè)置的網(wǎng)關(guān),,可以看到,,如果端口無法訪問,會在等待一段時(shí)間超時(shí)后報(bào)錯,。 那為什么防火墻會攔截samba服務(wù)了,。首先我們要先分析一下防火墻的規(guī)則了。打開控制面板,,依次選擇“系統(tǒng)和安全”->“Windows Defender 防火墻”,,然后打開左側(cè)“高級設(shè)置”中的“入站規(guī)則” 可以看到入站規(guī)則中有很多“阻止的規(guī)則”,但是也有一條明確放通 通過Google,發(fā)現(xiàn)Windows的防火墻規(guī)則并不是按照規(guī)則先后順序執(zhí)行的,,而是“阻止規(guī)則”優(yōu)先級大于“放通規(guī)則”,參見:https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc755191(v=ws.10),。 0x02 解決方法那如何處理呢,?當(dāng)然可以通過關(guān)閉防火墻來直接驗(yàn)證。但是這只是一種臨時(shí)的驗(yàn)證方式,,因?yàn)殛P(guān)閉防火墻很不安全而且公司本身也不允許,。 分析一下阻止規(guī)格,并不是所有源IP都被禁止了訪問445端口,,這就給我們提供了一個解決方式,,找一個沒有被禁止訪問445端口IP端作為Docker for Windows的subnet address。 首先打開cmd,,使用下面命令將所有入站的規(guī)則導(dǎo)出到文件中: netsh advfirewall firewall show rule name=all dir=in type=dynamic status=enabled > d:/firewall_rules.txt 然后將所有操作為阻止,,協(xié)議為TCP的規(guī)則中的遠(yuǎn)程IP全部復(fù)制出來。然后上 from IPy import IP # netsh advfirewall firewall show rule name=all dir=in type=dynamic status=enabled > d:/firewall_rules.txt firewall_rules = """ 169.254.2.0/24 10.3.128.0/17 9.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) 然后從打印出的網(wǎng)段中找一個更新到Docker網(wǎng)絡(luò)中,然后就可以愉快的共享磁盤了,。 |
|