先週、Dockerは公式イメージに大きなアップデートを公開し、マルチプラットフォーム対応にしました。 これで、実行すると、 docker run hello-world
Docker CEとEEは、x86-64 Linux、Windows、ARM、IBM Zメインフレーム、またはDockerが実行されるその他のシステムのいずれであっても、正しいhello-worldイメージをプルして実行します。 Dockerが追加のオペレーティングシステム(Windowsなど)とCPUアーキテクチャ(IBM Zなど)のサポートを急速に追加しているため、これは重要なUXの改善です。
Docker 公式イメージは、以下を含むコンテナー イメージのキュレーションされたセットです。
- Ubuntu、BusyBox 、 Debianなどの基本オペレーティングシステムイメージ
- Go、Python 、 Javaなどの一般的なプログラミング言語用のすぐに使用できるビルドおよびランタイムイメージ
- PostgreSQL、Neo4j 、 Redisなどのデータストア用の使いやすい画像
- WordPress、Ghost 、 Redmine 、その他多くの人気のあるオープンソースプロジェクトを実行するためのパッケージ化されたソフトウェアイメージ
公式イメージは常にx86-64Linuxで利用可能です。 x86以外のLinuxアーキテクチャ用のイメージも利用可能ですが、別の名前空間(docker pull s390x/golang
IBM Zメインフレームの場合)または別のタグdocker pull golang:nanoserver
(Windowsの場合)のいずれかからフェッチする必要があります。 これは、Dockerの新しいマルチアーキテクチャおよびマルチOSオーケストレーション機能のユーザーにとって私たちが望んでいたシームレスでポータブルなエクスペリエンスではありませんでした 。
幸いなことに、Dockerレジストリと配布プロトコルは、 マニフェストリストと呼ばれるテクノロジーを使用して、Docker 1.10以降マルチプラットフォームイメージをサポートしてきました。 マニフェスト リストは、レジストリ内の単一アーキテクチャ イメージ マニフェスト ( など golang
) の代わりに使用でき、("プラットフォーム"、"マニフェスト参照") タプルのリストが含まれます。 レジストリがイメージマニフェストではなくレジストリリストを使用してコマンドに docker pull
応答する場合、Dockerはマニフェストリストを調べてから、実行されているプラットフォームの正しいリストエントリをプルします。
配布プロトコルには下位互換性があり、マニフェスト リストはヘッダーで Accept
サポートを示すクライアントにのみ提供されます。 マニフェスト リストをサポートしていないクライアントの場合、レジストリは x86-64 Linux イメージ マニフェストにフォールバックします。 マニフェスト リストは Docker Content Trust によって完全にサポート されており、マルチプラットフォームのイメージ コンテンツが暗号で署名および検証されるようにします。
マニフェスト リストは、ほとんどの CPU アーキテクチャの Linux イメージに対してロールアウトされており、Windows のサポートもそこに到達しています。 お気に入りの CPU アーキテクチャまたは OS がまだカバーされていない場合は、プルするときにいつでも CPU または OS 固有のタグまたはイメージを引き続き使用できます。 ダイジェストによるイメージのフェッチも、この更新の影響を受けません。
マルチアーキテクチャイメージの構築に興味がある場合は、 Phil Estesの マニフェストリストツール を確認し、 PRを追跡してマニフェストコマンドをDocker CLIに追加してください。
マニフェストリストとマルチアーキテクチャDockerイメージは、長い間作業中でした。 これらの機能により、Docker が利用可能な多くのプラットフォームで Docker 公式リポジトリ イメージをシームレスにプルして使用することが簡単になったことを嬉しく思います。
リソース:
- フィル・エステス と ウッツ・バッチャーの公式 画像に関する投稿がマルチアーチになる
- 公式リポジトリドキュメント
- マルチアーチ公式画像の詳細
- 公式リポジトリ GitHub 組織
- マニフェスト リストの仕様