>_ DevTrendsja

言語

ホーム

言語

セクション

フロントエンド バックエンド モバイル DevOps AI / ML ゲーム開発 ブロックチェーン 組み込み セキュリティ
Shell

Webインターフェース付きDocker内の本格的な仮想マシン

QEMU Docker Logo

時には怪しいスクリプトをすぐに確認したり、クリーンなディストリビューションでソフトウェアインストールをテストしたり、特定のカーネルを持つ環境をデプロイしたりする必要があります。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エミュレーションではパフォーマンスが忍受できないほど遅くなります。

スムーズに動作する環境:

  1. ハードウェア仮想化サポート付きのLinuxホスト(Intel VT-x / AMD-V)。
  2. ネストされた仮想化が有効になっている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 を出力する場合、コンテナは問題なく起動します。

用途

  1. テスト自動化シナリオ。 рабочую систему を壊すリスクなしに、隔離されたVMでクリーンなAnsibleまたはbashスクリプトインストールを実行。
  2. 安全なソフトウェア実行。 1つのコマンドで再作成できる隔離された環境で、怪しいパッケージやバイナリを確認。
  3. 学習と実験。 USBドライブを扱わずに、NixOSやAlpineなどの新しいディストリビューションをブラウザウィンドウで直接探索。
  4. CI/CDパイプライン。 Kubernetesランナー上で完全な仮想マシン内でカーネルパッケージをビルドしたり、システムソフトウェアをテストしたり。

まとめ

qemus/qemu プロジェクトは、軽量コンテナと重量ハイパーバイザーの間の隙間を完璧に埋めます。Linuxマシンやホームサーバーでテスト用に隔離された仮想マシンを定期的に必要とする場合、このイメージはイメージ準備とネットワーク設定に多くの時間を節約します。

リポジトリはqemus organizationによって積極的にメンテナンスされており、ARM64、Windows、macOS用の別個の適応ビルドもあります。

関連プロジェクト