如何将Docker镜像转换为(vagrant)VirtualBox box?

19

我一直在研究Packer.io,并希望将其用于为我们的开发人员准备Vagrant(VirtualBox)虚拟机。

我知道可以使用VirtualBox Packer builder构建虚拟机,但发现Docker的层叠方式能够提供更快的虚拟机开发流程。

我该如何使用Dockerfile生成镜像并将其导出为Vagrant虚拟机?


这个问题的高赞率非常值得它成为最佳答案。 - jchook
3个回答

24

docker images 命令中查找 Docker 镜像的大小。

REPOSITORY   TAG    IMAGE ID       CREATED             SIZE
mybuntu   1.01   7c142857o35   2 weeks ago         1.94 GB

基于镜像启动一个容器 docker run mybuntu:1.01

从容器创建一个QEMU映像,同时在第一条命令中使用映像的大小 (seek=IMAGE_SIZE)。对于 docker export 命令,从 docker ps -a 中检索适当的容器ID。

dd if=/dev/zero of=mybuntu.img bs=1 count=0 seek=2G
mkfs.ext2 -F mybuntu.img
sudo mount -o loop mybuntu.img /mnt
docker export <CONTAINER-ID> | sudo tar x -C /mnt
sudo umount /mnt

使用qemu-utils将其转换为vmdk格式

sudo apt-get install qemu-utils
qemu-img convert -f raw -O vmdk mybuntu.img mybuntu.vmdk

可以在此查看有关可转换格式的更多信息。 现在您可以在virtualbox中导入vmdk文件。


你会在OSX下如何做到这一点? - Javier Buzzi
1
这看起来非常适合脚本化...我会尝试并告诉你。 - Andrew Wolfe

8
只要你的目标是VirtualBox,使用Vagrant可能会更好。Vagrant带有一个docker配置器,可以自动在虚拟机上安装docker并构建Dockerfile。请参考:http://docs.vagrantup.com/v2/provisioning/docker.html
Vagrant.configure("2") do |config|
  config.vm.provision "docker" do |d|
    d.build_image "/vagrant/app"
  end
end 

构建好镜像后,您可以使用vagrant package命令生成vagrant box。


1
是的,我非常清楚这一点,而这个问题的重点是不使用Packer的vagrant Builder,这正是你所提出的。 - Fredrik Wendt

1

这是我要尝试的路线:

这将使我能够使用Docker设置/提供机器,然后在Virtualbox中运行它,并通过vagrant进行控制。


1
事实证明,Docker版本0.10.0,构建dc9c28f与Ubuntu 12.10一起使用非常不稳定-它已经多次冻结我的服务器:它导致了内核崩溃。我现在已经暂停了这个尝试,但理论上没有理由为什么这种方法不应该奏效。 - Fredrik Wendt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接