仮想化通信

日本仮想化技術株式会社の公式エンジニアブログ

Rancher DesktopでDocker Buildxを使ったマルチアーキテクチャビルドを試してみた

先日、こんな記事を書きました。今回はその続きで、Rancher DesktopでDocker Buildxを使って、イメージのマルチアーキテクチャビルドを試してみます。

tech.virtualtech.jp

Rancher DesktopとDocker Desktop

Docker Desktop周りのこと

Docker DesktopはWindowsやMacでDcokerコンテナを使えるソフトウェアです。リリース当初はどのような使い方であれ無料で利用できましたが、2021年9月に有料化が開始され、従業員数250人以上で年間売り上げ1000万ドル以上の組織の場合、有償ライセンスが必要となりました。無料版からの移行にかかる経過措置として猶予期間が2022年1月31日まで設けられていましたが、もう気がつけば2月です。該当する企業はなんらかの対応をしなければならないということです。

ただし、私はこのDocker Desktopの有料化には反対ではありません。Docker自体はオープンソースで開発されているものですが、GUI付きのDocker Desktopは製品です。開発を持続するのはコストがかかります。また、Docker Desktopの有償版にはDocker Hubの利用に対する優遇が受けられます。例えばDocker Hubのプライベートリポジトリーが無制限になったり、コンテナイメージの取得が1日5000回までに緩和されたりするためです。月額料金は月払いの場合7ドルですが、年額払いにすると月換算5ドルで済みます。

f:id:virtualtech:20220204104605p:plain

Rancher Desktop 1.0がリリース!

そんな中、2022年1月27日にRancher Desktop 1.0がリリースされました。これはDocker DesktopのようにWindowsやMacでDockerやcontainerd、Kubernetesを利用できるようにするソフトウェアで、Linux版も存在します。Docker Desktopと異なり、Rancher Desktop自体もオープンソースで開発されています。

Rancher Desktopの特徴としてはコンテナランタイムをDockerにすることで、Docker DesktopのようにDockerが利用できること、コンテナランタイムをcontainerdに切り替えることで、ランタイムを切り替えてコンテナアプリケーションの互換性を確認するのに使えること、Kubernetesのバージョンを選んで普段使いのOS上でアプリケーションのテストができることが挙げられます。動作するKubernetesはk3sを利用しているため、フルバージョンのKubernetesほど動作要件が厳しくありません。コマンドラインツールもバンドルされているため、このアプリケーションでチェックを入れるだけで利用可能になります(既にCLIが存在する場合はそちらが優先されて使われます)。

Rancher DesktopでもランタイムをDockerにしていると、Visual Studio CodeのDockerを必要とする拡張機能が普通に使えます。Remote Container拡張とDocker拡張を使った開発も可能でした。

f:id:virtualtech:20220204104658p:plain

私はバージョン0.7でM1 Macのサポートが追加されたのでその時点でRancher Desktopに移行してしまいましたが、一点だけ困っていたのが「マルチアーキテクチャビルド」のサポートでした。しかし、先日Rancher Desktop 1.0で試したら問題なく動くことを確認したので、その方法をご紹介しようと思います。

セットアップの流れ

% cd ~/Downloads/
% mv buildx-v0.7.1.darwin-arm64 docker-buildx 
% mv docker-buildx ~/.docker/cli-plugins
% chmod +x ~/.docker/cli-plugins/docker-buildx
  • パスを通す
% vi ~/.zshrc
...
export PATH="~/.docker/cli-plugins:$PATH"

% source ~/.zshrc
  • 上記バイナリのインストール、パスを通す方法はmacOSのものです。Windows,Linuxの場合は公式サイトの手順に従ってセットアップします。

  • コマンドが実行できるようになったことを確認

% docker buildx version
github.com/docker/buildx v0.7.1 05846896d149da05f3d6fd1e7770da187b52a247
  • 対応アーキテクチャーを確認
% docker buildx ls     
NAME/NODE DRIVER/ENDPOINT STATUS  PLATFORMS
default * docker                  
  default default         running linux/arm64, linux/amd64

マルチアーキテクチャビルドを試す

普段使いの環境はM1 Macです。アーキテクチャはarm64です。一方で、周りのサーバー環境はIntel CPUの64bit環境であるamd64アーキテクチャの場合が多いです。従って、普通にビルドしたイメージはarm64じゃない環境では実行できません。そこでいっぺんにいくつかのアークテクチャ向けのイメージを生成する「マルチアーキテクチャビルド」を試してみます。

% docker buildx create --name mybuilder
% docker buildx use mybuilder
% docker buildx inspect --bootstrap
% docker buildx ls

% docker login -u user
% cd multiarch-demo && ls
Dockerfile  index.php
% docker buildx build --platform linux/amd64,linux/arm64 -t user/myphp-image:latest --push .

docker buildx buildのオプションとして--loadというオプションがあります。このオプションはビルドしたイメージをDockerイメージとして格納してくれるオプションですが、 マルチアーキテクチャビルドの場合、対応していないアークテクチャが指定されていると失敗する仕様みたいです。そこで--pushで外部コンテナレジストリー(Docker Hubなど)にビルドしたイメージを転送することで回避します。-tオプションで「ユーザー名/イメージ名:タグ」の形式でそれぞれ指定するのに気をつけます。

しばらくすると、指定したレジストリーに作成したイメージが登録されます(要する時間はイメージサイズによる)。

というわけで、Rancher Desktopのdockerdランタイムでも、マルチアーキテクチャービルドが可能でした。 マルチアーキテクチャービルドをするために特に追加手順も必要なかったためcontainerdに切り替えていましたが、Dockerでも動いたのでVS CodeのリモートコンテナーもDockerを指定すれば使えるし、今後はRancher DesktopのランタイムとしてDockerを使おうと思います。

おまけ: containerdでマルチアーキテクチャビルド

Rancher Desktopでcontainerdランタイムを設定している場合は、nerdctlCLIを利用します。マルチアーキテクチャビルドをするのに、別途追加で必要なことはありません。

% cat Dockerfile 
FROM docker.io/nginx:alpine
ADD index.html /usr/share/nginx/html/
% cat index.html 
Welcome to My site! 

% nerdctl login -u user
% nerdctl build --platform=linux/amd64,linux/arm64/v8 --output type=image,name=docker.io/user/nginx-demo:v1.0,push=true .

参考にした情報