Dockerイメージが対応しているプラットフォーム（OS、CPUアーキテクチャ）を調べる

## 2行まとめ

* Docker、Docker Hubはマルチプラットフォーム（OS、CPUアーキテクチャ）に対応しています。
* `DOCKER_CLI_EXPERIMENTAL=enabled docker manifest inspect <イメージ名>`でDockerイメージが対応しているプラットフォームを確認できます。

## 1. 概要

　Docker、[Docker Hub](https://hub.docker.com/)がマルチプラットフォーム（OS、CPUアーキテクチャ）に対応して久しいです。Dockerをインストールし、Dockerイメージさえ対応していれば、どのOS、どのCPUアーキテクチャでも`docker run hello-world`のようにDockerコンテナを起動できます。

　場合によっては、Dockerイメージが対応しているプラットフォームを確認したいこともあるでしょう。結論から言えば、以下のコマンドで確認できます。

```sh
DOCKER_CLI_EXPERIMENTAL=enabled docker manifest inspect <イメージ名>
```

## 2. 環境

　動作を確認した環境は以下の通りです。

```text
mac$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.14.6
BuildVersion:	18G103

mac$ docker version
Client: Docker Engine - Community
 Version:           19.03.8
 API version:       1.40
 Go version:        go1.12.17
 Git commit:        afacb8b
 Built:             Wed Mar 11 01:21:11 2020
 OS/Arch:           darwin/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.8
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.17
  Git commit:       afacb8b
  Built:            Wed Mar 11 01:29:16 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683
```

## 3. `DOCKER_CLI_EXPERIMENTAL`環境変数について

　`docker manifest`コマンドは、Docker CLI v19.03.8の時点では実験的な機能です。そのため、このコマンドを有効化するためには`~/.docker/config.json`に`{"experimental": "enabled"}`を指定するか、環境変数`DOCKER_CLI_EXPERIMENTAL`に`enabled`を設定する必要があります。

　実験的機能が有効化されていない場合、以下の通りエラーになります。

```text
mac$ docker manifest inspect hello-world:latest
docker manifest inspect is only supported on a Docker cli with experimental cli features enabled
```

## 4. 実行例

`docker manifest inspect`の実行例をいくつか示します。対応しているプラットフォームが出力されていることが確認できます。

### 4.1. `hello-world:latest`

```text
mac$ DOCKER_CLI_EXPERIMENTAL=enabled docker manifest inspect hello-world:latest
{
   "schemaVersion": 2,
   "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
   "manifests": [
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 524,
         "digest": "sha256:92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a",
         "platform": {
            "architecture": "amd64",
            "os": "linux"
         }
      },
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 525,
         "digest": "sha256:e5785cb0c62cebbed4965129bae371f0589cadd6d84798fb58c2c5f9e237efd9",
         "platform": {
            "architecture": "arm",
            "os": "linux",
            "variant": "v5"
         }
      },
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 525,
         "digest": "sha256:50b8560ad574c779908da71f7ce370c0a2471c098d44d1c8f6b513c5a55eeeb1",
         "platform": {
            "architecture": "arm",
            "os": "linux",
            "variant": "v7"
         }
      },
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 525,
         "digest": "sha256:963612c5503f3f1674f315c67089dee577d8cc6afc18565e0b4183ae355fb343",
         "platform": {
            "architecture": "arm64",
            "os": "linux",
            "variant": "v8"
         }
      },
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 527,
         "digest": "sha256:85dc5fbe16214366748ebe9d7cc73bc42d61d19d61fe05f01e317d278c2287ed",
         "platform": {
            "architecture": "386",
            "os": "linux"
         }
      },
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 525,
         "digest": "sha256:8aaea2a718a29334caeaf225716284ce29dc17418edba98dbe6dafea5afcda16",
         "platform": {
            "architecture": "ppc64le",
            "os": "linux"
         }
      },
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 525,
         "digest": "sha256:577ad4331d4fac91807308da99ecc107dcc6b2254bc4c7166325fd01113bea2a",
         "platform": {
            "architecture": "s390x",
            "os": "linux"
         }
      },
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 1124,
         "digest": "sha256:468a2702c410d84e275ed28dd0f46353d57d5a17f177aa7c27c2921e9ef9cd0e",
         "platform": {
            "architecture": "amd64",
            "os": "windows",
            "os.version": "10.0.17763.1098"
         }
      }
   ]
}
```

### 4.2. `ubuntu:18.04`

```text
mac$ DOCKER_CLI_EXPERIMENTAL=enabled docker manifest inspect ubuntu:18.04
{
   "schemaVersion": 2,
   "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
   "manifests": [
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 1152,
         "digest": "sha256:e5dd9dbb37df5b731a6688fa49f4003359f6f126958c9c928f937bec69836320",
         "platform": {
            "architecture": "amd64",
            "os": "linux"
         }
      },
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 1152,
         "digest": "sha256:3b029ac9aa8eb5dffd43bb7326891cf64f9c228b3960cec55a56605d2ae2ad42",
         "platform": {
            "architecture": "arm",
            "os": "linux",
            "variant": "v7"
         }
      },
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 1152,
         "digest": "sha256:12b9106d200061c8eb2179c984e63cc17d5a4e7a34f6e9ad03360b8efe492e96",
         "platform": {
            "architecture": "arm64",
            "os": "linux",
            "variant": "v8"
         }
      },
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 1152,
         "digest": "sha256:3e6b4be46d13e13127671a6f2bb848aec9125d6a389d012b2469721b89073b94",
         "platform": {
            "architecture": "386",
            "os": "linux"
         }
      },
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 1152,
         "digest": "sha256:705518497e5e3dd432fbfecec0ed1658947ff1e5068c266d42868bd3eb4a5a59",
         "platform": {
            "architecture": "ppc64le",
            "os": "linux"
         }
      },
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 1152,
         "digest": "sha256:fbbc16efb3db29132a98651f0499467fbb4cea315d57aaf13397a2c2e68a09d0",
         "platform": {
            "architecture": "s390x",
            "os": "linux"
         }
      }
   ]
}
```

## 5. 最後に

　ARM64（AArch64）が勢いを増す今日この頃、マルチアーキテクチャ対応のDockerイメージが充実してくることを願っています！