Docker のマルチCPUアーキテクチャーを使って、Docker Desktop for Windowsでx86_64(amd64)とArm64(AArch64)の2つのアーキテクチャーに対応したイメージを作成し、Arm64に対応したイメージをJetson NanoのJetpackにプレセットされているNVIDIA Dockerで動かしてみます(あぁ、ややこしい!)。
例えばWindowsプラットフォーム(x86_64)で複数のアーキテクチャに対応したイメージを作成します。
Firefoxを起動するイメージ
マルチCPUアーキテクチャについてはコチラのページ参照
前段はほぼこのページを参考にしています。手順のみざっくりと。
後段はJetson Nanoでのイメージの実行です。
事前準備1
Windows 10 Pro (64bit) にDocker Desktop for Windows をインストールする方法やFirefoxをGUIで表示する方法などは
Docker Desktop for Windows で X Window を使ってGUI表示
事前準備2
Docker Hubにアカウントを作っておきます。
ローカルDockerは自身で動作するイメージを扱うことを前提にしていますから「異なる環境のイメージは保持できない」そうです。
そこで、ビルドしたDockerイメージをローカルに保持することなく「Docker Hub」へ直接出力するために、ご自分用のアカウントが必要になります。
詳細はコチラのページを見ていただくとして、ざっくりと手順のみ
Docker のマルチCPUアーキテクチャをつかうために、Dockerの実験的機能「buildx」なるものを有効化しておきます。
Docker DesktopのDashboardから
PowerShellを起動して確認
1 |
docker --help |
ビルダーインスタンスというものを使う
デフォルトのビルダーインスタンスを確認してみます。
1 |
docker buildx ls |
「default」の横に「*」マークが付いていますが、これは「現在使用するビルダーインスタンス」です。
「マルチCPUアーキテクチャー」に対応したイメージのビルドは、デフォルトのビルダーインスタンスを使って行うことはできません。
新規に「mybuilder」という名前のビルダーインスタンスを作成します。
1 |
docker buildx create --name mybuilder |
次に、使用するビルダーインスタンスを「mybuilder」にするように変更します。
1 |
docker buildx use mybuilder |
さらにビルダーインスタンスを起動して有効化します。
1 |
docker buildx inspect --bootstrap |
ビルダーインスタンスの一覧を確認します。
1 |
docker buildx ls |
「mybuilder」の横に「*」マークが移動し、「mybuilder」の状態が「running」になっています。
これでOKです。
DockerイメージとDockerコンテナの一覧を確認してみます。
「moby/buildkit」というDockerイメージがロードされていて、イメージからDocekrコンテナが起動されていることも分かります。
これが「mybuilder」のビルダーインスタンスの実体で、このコンテナを使ってビルドが行われます。
「buildx」コマンドを使ってDockerイメージのビルドを実行します。
適当なフォルダーを作ってそこにDockerファイルを作ります。
Ubuntu 18.04 で Firefox を使うイメージです。WindowsでEmEditorというエディターを使っています(なんでもいいです)。
1 2 3 4 |
mkdir my-firefox cd my-firefox emeditor Dockerfile |
【Dockerfile】
1 2 3 4 5 6 |
FROM ubuntu:18.04 RUN apt update && apt upgrade -y RUN apt install firefox -y CMD ["bin/bash"] |
「マルチCPUアーキテクチャ」に対応したイメージのビルド
ビルド実行時に「プラットフォーム」を指定します。
「マルチCPUアーキテクチャー」対応イメージをDocker Hubへ直接出力するようにします。
1 |
docker login |
ご自分のアカウントとパスワードでDocker Hub にログインします。
イメージ名は「my-firefox:latest」だとします。
注意が必要なのはpushでHubにビルドする場合、「-t」オプションでは、Docker_Hub_ID/イメージ名になります。
アカウントIDがxxxxの場合、以下のコマンドを実行します。
amd64とarm64の2つのアーキテクチャに対応したイメージ
1 |
docker buildx build --platform linux/amd64,linux/arm64 -t xxxx/my-firefox:latest --push . |
そこそこお時間かかります。
終了後、確認。
Docker Hub上に出力された (プッシュされた) Dockerイメージを確認。
自分のDocker Hubアカウントのページに行く。
「Tags」タブを選択すると、Dockerイメージが対応するOS/アーキテクチャの一覧が表示されます。
ちゃんと「linux/amd64」「linux/arm64」の2つが登録されています。
コマンドで確認する方法もあります。
1 |
docker buildx imagetools inspect wisteriahill/my-firefox:latest |
Docker Hubのイメージをpull して arm64アーキテクチャーのJetson Nano で使ってみます。
OSはJetpack(ver 4.4)です。
Jetpack(ver 4.4)にはNVIDIA Docker がプレセットされています。
ご参考までに、Jetson NanoでDockerを試してみる
Docker HubからDockerイメージをプルします。
以下のxxxxはご自分のアカウントIDで置き換えてください。
1 |
sudo docker image pull xxxx/my-firefox:latest |
プルしたDockerイメージを確認します。
1 |
sudo docker image ls |
Dockerイメージの内容を確認しましょう。
1 |
sudo docker image inspect xxxx/my-firefox:latest |
arm64アーキテクチャに対応しています。
以下のコマンドを実行してFirefoxを立ち上げます。
イメージIDのyyyyはご自分ので書き換え。
sudo xhost +si:localuser:root
sudo docker run --runtime nvidia --network host -it -e DISPLAY=$DISPLAY -v /tmp/.X11-unix/:/tmp/.X11-unix yyyy
1 |
firefox |
Moduleのロードに失敗していますが、気にしない。
後始末
WindowsでDocker Hub にログインしていたら、
1 |
docker logout |
ビルダーインスタンスを戻しておく
1 |
docker buildx use default |
Leave a Reply