Criando uma imagem Docker a partir de uma máquina virtual

Publicado por Carlos Affonso Henriques. em 29/01/2019

[ Hits: 452 ]

 


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.

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 Linux

Como 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 2148532224

Em 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 GB

Agora 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.

Outras dicas deste autor

Kali - apt-get GPG error, invalid signature [Resolvido]

Conectores e terminais para Raspberry Pi, Arduino e outros dispositivos

Eliminando o splash screen do KDE

Wine rodando Dreamweaver MX

Lógica booleana com o test

Leitura recomendada

Recuperando senha do root sem Live-CD

Servidor de CD's simples no Linux

Instalando o pacote ZEOS Access no Lazarus 0.9.24

Samba - Erros que podem ocorrer durante o logon do cliente

DevStack - instale um ambiente Openstack

  

Comentários
[1] Comentário enviado por hrcerq em 05/02/2019 - 22:23h

Cara, muito boa essa dica. Vou favoritar. Há um bom tempo estava curioso sobre o Docker, mas recentemente resolvi mergulhar de cabeça nesse mundo de DevOps. É impressionante quanto conseguimos ser produtivos se soubermos usar as ferramentas e processos de automação que temos à disposição.

---

Atenciosamente,
Hugo Cerqueira

Devuan - https://devuan.org/



Contribuir com comentário