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

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

[ Hits: 648 ]

 


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

rc.local no Arch Linux

Alterando o MAC addrres de sua placa de rede

Target TTL do Iptables: Contornando bloqueios de compartilhamento

Instalar o CentOS a partir de um chaveiro USB

CBQ: controle efetivo

Leitura recomendada

Substituir o hotplug pelo udev no Debian

Seminário Linux em São Paulo - 22/10/2004 - entrada franca

Executando vários X-Windows ao mesmo tempo

Limpando o cache do seu Linux (de forma real)

Criando bibliotecas (shared library) *.so

  

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/

[2] Comentário enviado por CapitainKurn em 13/04/2019 - 02:37h


[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/


Que bom que gostou! Obrigado!



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts