Webインターフェース付きDocker内の本格的な仮想マシン
時には怪しいスクリプトをすぐに確認したり、クリーンなディストリビューションでソフトウェアインストールをテストしたり、特定のカーネルを持つ環境をデプロイしたりする必要があります。VirtualBoxを起動するには面倒だし、ワークノートPCにProxmoxを設定するのはオーバースペックだし、通常のDockerコンテナではカーネルレベルの分離が提供されません。
最近、リポジトリ qemus/qemu を見つけました。このプロジェクトはQEMUとKVMアクセラレーションを通常のDockerコンテナにパッケージ化し、ブラウザでVM管理を直接公開しています。
プロジェクトの仕組み
Essentially, this is a wrapper around QEMU that handles all the tedious setup of the emulator, networking, disks, and noVNC client. You don't need to manually write long command-line flags or mess with XML configs libvirt.
All management boils down to passing environment variables to docker-compose.yml. The image automatically downloads the required Linux distribution, creates a virtual disk, connects KVM for near-native performance, and opens the web interface on port 8006.
このコンテナはローカル開発と、KubernetesやGitHub CodespacesでのVM実行の両方に適しています。
クイックスタート
起動するには、最小限のcomposeファイルだけで必要です。例えば、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
docker compose up -d を実行すると、サービスは自動的にMint ISOをダウンロードして仮想化を開始します。
ブラウザで http://localhost:8006 にアクセスすると、OSインストール画面が表示されます。追加のVNCクライアントをインストールする必要はありません。
# Если вы предпочитаете чистый 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
コンテナできること
ディストリビューションの自動ダウンロード
BOOT 変数には、一般的なディストリビューションの短い名前を指定できます。スクリプトは最新のイメージの取得先を知っています:
- Ubuntu、Debian、Fedora、Arch Linux、Rocky Linux
- AlmaLinux、openSUSE、Mint、CentOS、Clear
- NixOS、FreeBSD、Flatcar
必要なシステムがプリセットリストにない場合は、任意のイメージへの直接リンクを渡すことができます:
environment:
BOOT: "https://dl-cdn.alpinelinux.org/alpine/v3.19/releases/x86_64/alpine-virt-3.19.1-x86_64.iso"
コンテナはアーカイブをその場で展開し、qcow2、img、iso、vmdk、vhdf形式のイメージをサポートしています。ローカルファイルをコンテナルートに /boot.iso として直接マウントすることもできます。
ディスクとメモリの操作
デフォルトでは、VMは /storage ディレクトリ内にqcow2形式の64GBディスクを取得します。DISK_SIZE: "128G" 変数でいつでもサイズを変更できます。
ホストのRAMが不足した場合、コンテナはメモリバローニングをサポートしています。これにより、未使用のゲストメモリをホストに動的に返すことができます。
ホストとのファイル共有
ホストとVM間でファイルを転送するには、9pfsプロトコルが使用されます:
volumes:
- ./my_host_folder:/shared
実行中のゲストシステム内では、ディレクトリをマウントするだけです:
mount -t 9p -o trans=virtio shared /mnt/shared
ポートフォワーディングと完全なネットワーキング
標準のDockerブリッジモードでは、おなじみの ports ブロックでポートフォワーディングを設定します。SSHを外部にフォワードするには:
ports:
- 8006:8006
- 2222:22
VMがローカルネットワーク上で独自のIPアドレスを必要とする場合(ホームルーターがDHCP経由で отдельный адрес を割り当てるため)、コンテナは macvlan を介して接続できます。この場合、定常的なポートマッピングは不要です。
実際のハードウェアのパスsthrough
composeファイルを介して、実際の物理ドライブ( /dev/sdb:/disk1 )またはUSBデバイスをQEMUに識別子を渡すことによりパスsthroughできます:
environment:
ARGUMENTS: "-device usb-host,vendorid=0x1234,productid=0x5678"
devices:
- /dev/bus/usb
システム要件と制限事項
主な注意点はKVMサポートにあります。
/dev/kvm デバイスへの直接アクセスがないと、ハードウェアアクセラレーションが機能せず、純粋なソフトウェアCPUエミュレーションではパフォーマンスが忍受できないほど遅くなります。
スムーズに動作する環境:
- ハードウェア仮想化サポート付きのLinuxホスト(Intel VT-x / AMD-V)。
- ネストされた仮想化が有効になっているDocker DesktopまたはPodman Desktop搭載のWindows 11。
macOSおよびWindows 10のDocker Desktopは現在コンテナに /dev/kvm を渡さないため там、プロジェクトを実行することはできません。
Linuxでは標準ユーティリティでKVMの可用性を確認できます:
sudo apt install cpu-checker
sudo kvm-ok
コマンドが KVM acceleration can be used を出力する場合、コンテナは問題なく起動します。
用途
- テスト自動化シナリオ。 рабочую систему を壊すリスクなしに、隔離されたVMでクリーンなAnsibleまたはbashスクリプトインストールを実行。
- 安全なソフトウェア実行。 1つのコマンドで再作成できる隔離された環境で、怪しいパッケージやバイナリを確認。
- 学習と実験。 USBドライブを扱わずに、NixOSやAlpineなどの新しいディストリビューションをブラウザウィンドウで直接探索。
- CI/CDパイプライン。 Kubernetesランナー上で完全な仮想マシン内でカーネルパッケージをビルドしたり、システムソフトウェアをテストしたり。
まとめ
qemus/qemu プロジェクトは、軽量コンテナと重量ハイパーバイザーの間の隙間を完璧に埋めます。Linuxマシンやホームサーバーでテスト用に隔離された仮想マシンを定期的に必要とする場合、このイメージはイメージ準備とネットワーク設定に多くの時間を節約します。
リポジトリはqemus organizationによって積極的にメンテナンスされており、ARM64、Windows、macOS用の別個の適応ビルドもあります。
関連プロジェクト