Criando uma imagem Docker a partir de uma máquina virtual
Dica publicada em Linux / Avançado
Criando uma imagem Docker a partir de uma máquina virtual
Imagine o seguinte cenário: você quer criar uma imagem a partir de uma máquina virtual, em que você instalou uma distribuição que não esteja disponível para baixar nos repositório do Docker ou que você deseje um nível de customização muito específico e que por qualquer motivo o Docker não lhe faculte fazer, ou ainda, em casos em que a política de segurança da empresa não permita o emprego de imagens feitas por terceiros.
Em meu caso usei uma VM criada pelo QEMU/KVM CentOS7 hospedada em um host CentOS 7.
cd /var/lib/libvirt/images/
fdisk -l CentOS7.img
A minha saída foi a seguinte:
# losetup -a
Não havendo, podemos criar o /dev/loop0.
# losetup -o $((512*4196352)) /dev/loop0 /var/lib/libvirt/images/Centos7.img
Onde -o é a opção para definir o offset da imagem, ou seja, a partir de que ponto iremos lê-la, 512 é o tamanho em bytes de um setor e 4196352 é onde na VM começa a segunda partição. Repetimos o losetup -a para checar se o loop foi criado corretamente e a saída deverá ser parecida com isso:
# mount /dev/loop0 /mnt/chroot0/
No meu caso defini o ponto de montagem em um diretório que chamei de chroot0 em /mnt.
cd /mnt/chroot0
# tar -c . | docker import - testezero0
Onde testezero0 é o nome que atribuí a imagem Docker.
Após feito verificaremos se a imagem Docker foi criada.
docker images
A saída deverá ser parecida com isso:
# docker run -it testezero0 /bin/bash
Agora desmontamos o dispositivo de loop e o deletamos.
cd /root
# umount /dev/loop0
# losetup -d /dev/loop0
Pronto! Bom trabalho a todos.
Em meu caso usei uma VM criada pelo QEMU/KVM CentOS7 hospedada em um host CentOS 7.
1º passo
Vá para o diretório onde está sua imagem de VM.cd /var/lib/libvirt/images/
2º passo
Faça um fdisk -l para ele exibir a estrutura de partições da imagem, no meu caso:fdisk -l CentOS7.img
A minha saída foi a seguinte:
Disk Centos7.img: 10.7 GB, 10737418240 bytes, 20971520 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos Disk identifier: 0x0000527e Device Boot Start End Blocks Id System Centos7.img1 * 2048 4196351 2097152 83 Linux Centos7.img2 4196352 20971519 8387584 83 LinuxComo a imagem docker usa o Kernel da máquina host (hospedeira), iremos montar apenas partição do fs raiz e não a partição do /boot.
3º passo
Agora vamos criar o dispositivo loop vinculando-o a referida partição root. Primeiro verificamos se há algum dispositivo de loop ocupado com o comando:# losetup -a
Não havendo, podemos criar o /dev/loop0.
# losetup -o $((512*4196352)) /dev/loop0 /var/lib/libvirt/images/Centos7.img
Onde -o é a opção para definir o offset da imagem, ou seja, a partir de que ponto iremos lê-la, 512 é o tamanho em bytes de um setor e 4196352 é onde na VM começa a segunda partição. Repetimos o losetup -a para checar se o loop foi criado corretamente e a saída deverá ser parecida com isso:
/dev/loop0: [2050]:262146 (/var/lib/libvirt/images/Centos7.img), offset 2148532224Em seguida montamos o dispositivo de loop.
# mount /dev/loop0 /mnt/chroot0/
No meu caso defini o ponto de montagem em um diretório que chamei de chroot0 em /mnt.
4º passo
Agora criaremos a imagem Docker a partir da sua imagem de sua VM.cd /mnt/chroot0
# tar -c . | docker import - testezero0
Onde testezero0 é o nome que atribuí a imagem Docker.
Após feito verificaremos se a imagem Docker foi criada.
docker images
A saída deverá ser parecida com isso:
REPOSITORY TAG IMAGE ID CREATED SIZE testezero0 latest 5a29f7a17ab2 11 seconds ago 1.73 GBAgora vamos subir um container a partir dessa imagem.
# docker run -it testezero0 /bin/bash
Agora desmontamos o dispositivo de loop e o deletamos.
cd /root
# umount /dev/loop0
# losetup -d /dev/loop0
Pronto! Bom trabalho a todos.
---
Atenciosamente,
Hugo Cerqueira
Devuan - https://devuan.org/