8GBのRAMを搭載したRaspberry PI 4があります。 x86コンテナがあります。 x86/amd64サーバーではうまく機能します。ラズベリーパイに移植したいです。 Raspberryチームがリリースしたubuntu 22があります。 qemu-user-static、kvmがあることを読んで、arm64のx86 dockerコンテナがサポートされているようですが、結果は得られません.私のラズベリーがkvmをサポートしているのを見ることができます。
root@ubuntu:/home/ubuntu# virt-host-validate
QEMU: Checking if device /dev/kvm exists : PASS
QEMU: Checking if device /dev/kvm is accessible : PASS
QEMU: Checking if device /dev/vhost-net exists : PASS
QEMU: Checking if device /dev/net/tun exists : PASS
QEMU: Checking for cgroup 'cpu' controller support : PASS
QEMU: Checking for cgroup 'cpuacct' controller support : PASS
QEMU: Checking for cgroup 'cpuset' controller support : PASS
QEMU: Checking for cgroup 'memory' controller support : PASS
QEMU: Checking for cgroup 'devices' controller support : PASS
QEMU: Checking for cgroup 'blkio' controller support : PASS
QEMU: Checking for device assignment IOMMU support : WARN (Unknown if this platform has IOMMU support)
QEMU: Checking for secure guest support : WARN (Unknown if this platform has Secure Guest support)
LXC: Checking for Linux >= 2.6.26 : PASS
LXC: Checking for namespace ipc : PASS
LXC: Checking for namespace mnt : PASS
LXC: Checking for namespace pid : PASS
LXC: Checking for namespace uts : PASS
LXC: Checking for namespace net : PASS
LXC: Checking for namespace user : PASS
LXC: Checking for cgroup 'cpu' controller support : PASS
LXC: Checking for cgroup 'cpuacct' controller support : PASS
LXC: Checking for cgroup 'cpuset' controller support : PASS
LXC: Checking for cgroup 'memory' controller support : PASS
LXC: Checking for cgroup 'devices' controller support : PASS
LXC: Checking for cgroup 'freezer' controller support : FAIL (Enable 'freezer' in kernel Kconfig file or mount/enable cgroup controller in your system)
LXC: Checking for cgroup 'blkio' controller support : PASS
LXC: Checking if device /sys/fs/fuse/connections exists : PASS
何か間違っているようですが、この技術は明らかに簡単ではなく、すぐに理解する方法もありません。インターネットには多くの情報がありませんが、他の仕事に関する情報があります。たぶん誰かがこの道を行き、私を正しい方向に押してくれるかもしれません。
だから、通常、コンテナを次のように起動します。
docker run -d --privileged --restart unless-stopped --hostname mycontainer --net=host --name=mycontainer -it mycontainer:v1 /bin/bash /entrypoint.sh
そして、qemu-user-static、qemu-system、および他のすべてのqemuライブラリをインストールした後に起動しますが、機能しません。
次の内容を読みました。次のようにqemuコンテナ内で実行する必要があります。
docker run --rm -it --device=/dev/kvm:/dev/kvm --device=/dev/net/tun:/dev/net/tun --cap-add NET_ADMIN -v /home/ubuntu/mycontainer_v1.xz:/image jkz0/qemu:latest
次のエラーが発生します。
root@ubuntu:/home/ubuntu# docker run --rm -it --device=/dev/kvm:/dev/kvm --device=/dev/net/tun:/dev/net/tun --cap-add NET_ADMIN -v /home/ubuntu/readyImages/adapter2_2.xz:/image jkz0/qemu:latest
WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
udhcpd: started, v1.30.1
udhcpd: max_leases=235 is too big, setting to 1
udhcpd: can't open '/var/lib/misc/udhcpd.leases': No such file or directory
kvm version too old
qemu-system-x86_64: failed to initialize KVM: Function not implemented
以前この問題に対処した人はいますか?新鮮なアイデアが必要です。ありがとう、ドミトリー
答え1
だから私はdockerについてよく知りません。しかし、dockerは「ちょうど」OCIコンテナ用のランタイムです。多すぎる、それは私に必要ではない多くのことを行います)。同じ「Docker Container」を使用して実行することができpodman
(相対的に互換性のあるCLIを使用しても)、podman
すぐに仮想マシンでのコンテナの実行をサポートします。必要なのはx86_64だけです。coreOS 仮想マシンイメージ;仮想マシン構成を手動で調整する必要があり、podman
コマンドラインオプションはありません(まだ?)。
必要な小さな準備:qemuがどのマシンをサポートしているかわからないので、実行してニーズにqemu-system-x86_64 -cpu help | grep -v 'alias '
合ったマシンを選択してください。ただ使用しますNehalem-v2
。以下に示す合理的なマシンに置き換えることができます。
podman machine init \
--image-path YOUR_DOWNLOADED_FEDORA_COREOS-qemu.x86_64.qcow2.xz_IMAGE \
x86_64_machine
編集$XDG_CONFIG_HOME/containers/podman/machine/qemu/x86_64_machine.json
"CmdLine"
プロパティが見つかりました。そのリストの"-cpu"
次の行は次のとおりです"host"
。いいえ欲しいものはここにあります。必要なqemu CPUモデルと交換してください(Nehalem-v2
私の場合)。"-accel"
それがあることを確かめなさい"kvm"
。
これで正しく設定されているので、デフォルトで常に使用するようにpodmanを設定します。podman system connection default x86_64_machine
この方法。
仮想マシンを起動します。podman machine start x86_64_machine
Rpiでは時間がかかることがあります!
正常に起動すると、好みのドッカーコンテナを実行できます。podman run --rm -it fedora:39 uname -a
Fedora 39コンテナ(x86_64!)をインポートしてuname -a
実行する必要があります。完了すると、コンテナは--rm
再び削除されます。
答え2
アーキテクチャが異なっていて不可能なのでできません。
これを達成する2つの方法は次のとおりです。
説明に記載されているようにコンテナを再構築します。 https://www.padok.fr/en/blog/docker-arm-architectures https://www.docker.com/blog/faster-multi-platform-builds-dockerfile-cross-compilation-guide/ コンテナが「実サーバー」からインポートされても、簡単に再構築できます。ドッカーが誕生した理由だ。
x86/amd64 エミュレーションを使用して仮想マシンで docker を実行します。しかし、残念ながら、これを簡単に行う方法はありません。がんマシンでも全くできません。