>_ DevTrendspt

Idioma

Início

Linguagens

Seções

Frontend Backend Mobile DevOps AI / ML GameDev Blockchain Embarcados Segurança
Shell

Uma Máquina Virtual Completa Dentro do Docker com Interface Web

QEMU Docker Logo

Às vezes você precisa verificar rapidamente um script suspeito, testar a instalação de software em uma distribuição limpa ou implantar um ambiente com um kernel específico. Abrir o VirtualBox para isso é muito trabalho, configurar o Proxmox em um laptop de trabalho é exagero, e um container Docker comum não oferece isolamento a nível de kernel.

Recentemente encontrei um repositório qemus/qemu. O projeto empacota o QEMU com aceleração KVM dentro de um container Docker comum e expõe o gerenciamento de VMs diretamente no navegador.

Como o Projeto Funciona

Essencialmente, este é um wrapper em torno do QEMU que cuida de toda a configuração tediosa do emulador, rede, discos e cliente noVNC. Você não precisa escrever manualmente longas flags de linha de comando ou mexer com arquivos de configuração XML libvirt.

Todo o gerenciamento se resume a passar variáveis de ambiente para docker-compose.yml. A imagem baixa automaticamente a distribuição Linux necessária, cria um disco virtual, conecta o KVM para performance quase nativa e abre a interface web na porta 8006.

O container é adequado tanto para desenvolvimento local quanto para executar VMs no Kubernetes ou no GitHub Codespaces.

Início Rápido

Para iniciá-lo, você só precisa de um arquivo compose mínimo. Por exemplo, vamos implantar o Linux Mint:

services:
  qemu:
    image: qemux/qemu
    container_name: qemu
    environment:
      BOOT: "mint"
      RAM_SIZE: "4G"
      CPU_CORES: "2"
    devices:
      - /dev/kvm
      - /dev/net/tun
    cap_add:
      - NET_ADMIN
    ports:
      - 8006:8006
    volumes:
      - ./qemu_data:/storage
    restart: always
    stop_grace_period: 2m

Após executar docker compose up -d, o serviço baixa automaticamente o ISO do Mint e inicia a virtualização.

Navegue até http://localhost:8006 no seu navegador e você verá a tela de instalação do SO. Não é necessário instalar clientes VNC adicionais.

# Если вы предпочитаете чистый Docker CLI:
docker run -it --rm --name qemu \
  -e "BOOT=alpine" \
  -p 8006:8006 \
  --device=/dev/kvm \
  --device=/dev/net/tun \
  --cap-add NET_ADMIN \
  -v "${PWD}/qemu_data:/storage" \
  --stop-timeout 120 \
  docker.io/qemux/qemu

O Que o Container Pode Fazer

Download Automático de Distribuições

Na variável BOOT, você pode especificar um nome curto de uma distribuição popular. O script sabe de onde buscar as imagens mais recentes:

  • arch, debian, fedora, ubuntu, alpine
  • kali, nixos, gentoo, mint, manjaro
  • rocky, alma, cachy, tails

Se o sistema que você precisa não está na lista predefinida, você pode passar um link direto para qualquer imagem:

environment:
  BOOT: "https://dl-cdn.alpinelinux.org/alpine/v3.19/releases/x86_64/alpine-virt-3.19.1-x86_64.iso"

O container descompacta arquivos compactados em tempo real e suporta imagens nos formatos .iso, .qcow2, .vmdk, .vhdx e .vdi. Você também pode montar um arquivo local diretamente na raiz do container como /boot.iso.

Trabalhando com Discos e Memória

Por padrão, a VM recebe um disco de 64 GB no formato qcow2 dentro do diretório /storage. Você pode alterar o tamanho a qualquer momento através da variável DISK_SIZE: "128G".

Se o host ficar sem RAM, o container suporta memory ballooning. Isso ajuda a retornar dinamicamente a memória não utilizada do guest para o host.

Compartilhamento de Arquivos com o Host

Para transferir arquivos entre o host e a VM, é usado o protocolo 9pfs:

volumes:
  - ./my_host_folder:/shared

Dentro do sistema guest em execução, você só precisa montar o diretório:

mount -t 9p -o trans=virtio shared /mnt/shared

Redirecionamento de Portas e Rede Completa

Com o modo bridge padrão do Docker, o redirecionamento de portas é configurado através do bloco ports familiar. Para redirecionar SSH externamente:

ports:
  - 8006:8006
  - 2222:22

Se a VM precisar do seu próprio endereço IP na rede local (para que o roteador da sua casa atribua um endereço separado via DHCP), o container pode ser conectado via macvlan. Neste caso, não há necessidade de mapeamento constante de portas.

Passagem de Hardware Real

Através do arquivo compose, você pode passar discos físicos reais (/dev/sdb:/disk1) ou dispositivos USB passando seus identificadores para o QEMU:

environment:
  ARGUMENTS: "-device usb-host,vendorid=0x1234,productid=0x5678"
devices:
  - /dev/bus/usb

Requisitos do Sistema e Limitações

A principal ressalva está no suporte ao KVM.

Sem acesso direto ao dispositivo /dev/kvm, a aceleração de hardware não funcionará e a emulação pura de CPU por software tornará a performance insuportavelmente lenta.

Onde funciona perfeitamente:

  1. Hosts Linux com suporte a virtualização de hardware (Intel VT-x / AMD-V).
  2. Windows 11 com Docker Desktop ou Podman Desktop com virtualização aninhada habilitada.

O Docker Desktop no macOS e Windows 10 atualmente não passa /dev/kvm para os containers, então você não conseguirá executar o projeto lá.

Você pode verificar a disponibilidade do KVM no Linux com o utilitário padrão:

sudo apt install cpu-checker
sudo kvm-ok

Se o comando retornar KVM acceleration can be used, o container será iniciado sem problemas.

Para Que Você Pode Usar Isso

  1. Testar cenários de automação. Executar instalações limpas de Ansible ou scripts bash em uma VM isolada sem arriscar quebrar seu sistema de trabalho.
  2. Execução segura de software. Verificar pacotes ou binários suspeitos em um ambiente isolado que pode ser recriado com um único comando.
  3. Aprendizado e experimentos. Explorar novas distribuições (por exemplo, NixOS ou Alpine) diretamente na janela do navegador sem lidar com pendrives.
  4. Pipelines de CI/CD. Compilar pacotes de kernel ou testar software de sistema dentro de máquinas virtuais completas em runners do Kubernetes.

Resumo

O projeto qemus/qemu preenche perfeitamente o nicho entre containers leves e hipervisores pesados. Se você precisa regularmente de máquinas virtuais isoladas para testes em uma máquina Linux ou servidor doméstico, esta imagem economiza muito tempo na preparação de imagens e configuração de rede.

O repositório é ativamente mantido pela organização qemus, que também possui builds adaptados separados para ARM64, Windows e macOS.

Projetos relacionados