Uma Máquina Virtual Completa Dentro do Docker com Interface Web
À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,alpinekali,nixos,gentoo,mint,manjarorocky,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:
- Hosts Linux com suporte a virtualização de hardware (Intel VT-x / AMD-V).
- 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
- 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.
- Execução segura de software. Verificar pacotes ou binários suspeitos em um ambiente isolado que pode ser recriado com um único comando.
- Aprendizado e experimentos. Explorar novas distribuições (por exemplo, NixOS ou Alpine) diretamente na janela do navegador sem lidar com pendrives.
- 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