You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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容器和主机的文件共享特性,几步就能完成:

  1. 进入Docker虚拟机:在OS X终端里执行这条命令,就能进入虚拟机的shell:
    screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
    
    要退出虚拟机的话,按Ctrl+A然后按K,输入y确认即可。
  2. 在虚拟机里准备待复制的文件:把你要导出的文件移动到虚拟机的/tmp目录(这个目录默认会被所有容器共享访问),比如:
    cp /path/to/your/vm/target_file ~/tmp/need_export.txt
    
  3. 回到主机终端中转文件:别在虚拟机的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直接操作虚拟机文件系统

如果你想更直接地操作虚拟机的文件系统,也可以用这个方法:

  1. 进入虚拟机的命名空间:在OS X终端执行这条命令,直接进入虚拟机的shell(退出时直接输exit就行,比screen更方便):
    docker run -it --privileged --pid=host alpine nsenter -t 1 -m -u -i sh
    
  2. 挂载主机目录到虚拟机:在这个虚拟机shell里,先挂载主机的目录到虚拟机的临时挂载点,比如我们用主机的~/Downloads/vm_export目录:
    先在主机终端(别在虚拟机shell里)创建这个目录:
    mkdir -p ~/Downloads/vm_export
    
    然后回到虚拟机shell,执行挂载命令:
    mount -t 9p -o trans=virtio,version=9p2000.L host0 /mnt/host_mount
    
  3. 复制文件到主机目录:现在就可以把虚拟机里的文件复制到挂载的目录了:
    cp /path/to/your/vm/target_file /mnt/host_mount/
    
  4. 退出验证:输入exit退出虚拟机shell,去主机的~/Downloads/vm_export里就能找到文件了。

小提示

新版本Docker for Mac用9p协议实现主机和容器的文件共享,虚拟机本身不能直接访问主机目录,所以必须借助容器作为中转,这两个方法都是利用了这个特性来完成文件传输的。

内容的提问来源于stack exchange,提问作者lutaoact

火山引擎 最新活动