OS X 10.13.3下,Docker新版本用Docker.raw时如何从虚拟机复制文件到主机?
从Docker for Mac(新版本,Docker.raw)虚拟机复制文件到OS X主机的方法
Got it,我来帮你搞定这个问题——在新版本Docker for Mac(使用Docker.raw镜像)里,确实没法像旧版本那样直接把虚拟机里的文件拷到本地/Users目录了,这是因为新版本取消了虚拟机直接挂载主机/Users的机制,转而用更安全的文件共享协议。不过有两个靠谱的方法能解决:
方法一:用临时容器做中转(最推荐,步骤简单)
这个方法利用Docker容器和主机的文件共享特性,几步就能完成:
- 进入Docker虚拟机:在OS X终端里执行这条命令,就能进入虚拟机的shell:
要退出虚拟机的话,按screen ~/Library/Containers/com.docker.docker/Data/vms/0/ttyCtrl+A然后按K,输入y确认即可。 - 在虚拟机里准备待复制的文件:把你要导出的文件移动到虚拟机的
/tmp目录(这个目录默认会被所有容器共享访问),比如:cp /path/to/your/vm/target_file ~/tmp/need_export.txt - 回到主机终端中转文件:别在虚拟机的shell里操作,切换回OS X的终端,运行这条命令——它会启动一个临时Alpine容器,同时挂载虚拟机的
/tmp和主机的~/Downloads目录,然后把文件复制过去:
执行完这条命令后,你要的文件就已经出现在主机的docker run -v /tmp:/vm_tmp -v ~/Downloads:/host_downloads --rm alpine cp /vm_tmp/need_export.txt /host_downloads/~/Downloads目录里了。
方法二:通过nsenter直接操作虚拟机文件系统
如果你想更直接地操作虚拟机的文件系统,也可以用这个方法:
- 进入虚拟机的命名空间:在OS X终端执行这条命令,直接进入虚拟机的shell(退出时直接输
exit就行,比screen更方便):docker run -it --privileged --pid=host alpine nsenter -t 1 -m -u -i sh - 挂载主机目录到虚拟机:在这个虚拟机shell里,先挂载主机的目录到虚拟机的临时挂载点,比如我们用主机的
~/Downloads/vm_export目录:
先在主机终端(别在虚拟机shell里)创建这个目录:
然后回到虚拟机shell,执行挂载命令:mkdir -p ~/Downloads/vm_exportmount -t 9p -o trans=virtio,version=9p2000.L host0 /mnt/host_mount - 复制文件到主机目录:现在就可以把虚拟机里的文件复制到挂载的目录了:
cp /path/to/your/vm/target_file /mnt/host_mount/ - 退出验证:输入
exit退出虚拟机shell,去主机的~/Downloads/vm_export里就能找到文件了。
小提示
新版本Docker for Mac用9p协议实现主机和容器的文件共享,虚拟机本身不能直接访问主机目录,所以必须借助容器作为中转,这两个方法都是利用了这个特性来完成文件传输的。
内容的提问来源于stack exchange,提问作者lutaoact




