I've been looking at Packer.io, and would love to use it to provision/prepare the vagrant (VirtualBox) boxes used by our developers.
I know I could build the boxes with VirtualBox using the VirtualBox Packer builder, but find the layer stacking of Docker to provide a much faster development process of the boxes.
How do I produce the image with a Dockerfile and then export it as a Vagrant box?
The Vagrant Docker provisioner can automatically install Docker, pull Docker containers, and configure certain containers to run on boot. The docker provisioner is ideal for organizations that are using Docker as a means to distribute things like their application or services.
Docker machines runs as a VirtualBox virtual machine as you're using the VirtualBox Docker Machine driver. So, it uses up your system memory (RAM). You may not want to run all the Docker machines at the same time. Instead, run only the machines you need.
I'm the author of Docker. The short answer is that if you want to manage machines, you should use Vagrant. And if you want to build and run applications environments, you should use Docker. Vagrant is a tool for managing virtual machines.
Find the size of the docker image from docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mybuntu 1.01 7c142857o35 2 weeks ago 1.94 GB
Run a container based on the image docker run mybuntu:1.01
Create a QEMU image from the container,
Also, use the size of the image in the first command (seek=IMAGE_SIZE
).
And, for the docker export
command retrieve the appropriate container id from docker ps -a
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
Use qemu-utils
to convert to vmdk
sudo apt-get install qemu-utils
qemu-img convert -f raw -O vmdk mybuntu.img mybuntu.vmdk
More info on formats that are available for conversion can be found here. Now you can import the vmdk file in virtualbox
Provided that your target is VirtualBox, it could be probably better if you use Vagrant for the whole process.
Vagrant ships with a docker provisioner that could automatically install docker on the vm and build a Dockerfile
:
Vagrant.configure("2") do |config|
config.vm.provision "docker" do |d|
d.build_image "/vagrant/app"
end
end
Once your image is built, you can produce a vagrant box using the vagrant package
command.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With