docker manifest push コマンドを使ってマニフェストリストをプッシュする方法

DockerDockerBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、docker manifest push コマンドを効果的に使用してマルチアーキテクチャイメージを管理する方法を学びます。まず、マニフェストリストを作成します。これにより、単一のイメージ名で異なるアーキテクチャやオペレーティングシステム用に構築されたイメージを参照できます。

マニフェストリストを作成した後、標準のレジストリにマニフェストリストをプッシュする練習を行い、さらに安全でないレジストリにプッシュする方法も探ります。最後に、マニフェストリストをプッシュしてからローカルのマニフェストリストを削除する方法を学び、Docker イメージを効率的に管理します。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/SystemManagementGroup(["System Management"]) docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/stop("Stop Container") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/ContainerOperationsGroup -.-> docker/inspect("Inspect Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/ImageOperationsGroup -.-> docker/tag("Tag an Image") docker/ImageOperationsGroup -.-> docker/push("Push Image to Repository") docker/SystemManagementGroup -.-> docker/login("Log into Docker Registry") subgraph Lab Skills docker/run -.-> lab-555171{{"docker manifest push コマンドを使ってマニフェストリストをプッシュする方法"}} docker/stop -.-> lab-555171{{"docker manifest push コマンドを使ってマニフェストリストをプッシュする方法"}} docker/rm -.-> lab-555171{{"docker manifest push コマンドを使ってマニフェストリストをプッシュする方法"}} docker/inspect -.-> lab-555171{{"docker manifest push コマンドを使ってマニフェストリストをプッシュする方法"}} docker/pull -.-> lab-555171{{"docker manifest push コマンドを使ってマニフェストリストをプッシュする方法"}} docker/tag -.-> lab-555171{{"docker manifest push コマンドを使ってマニフェストリストをプッシュする方法"}} docker/push -.-> lab-555171{{"docker manifest push コマンドを使ってマニフェストリストをプッシュする方法"}} docker/login -.-> lab-555171{{"docker manifest push コマンドを使ってマニフェストリストをプッシュする方法"}} end

マニフェストリストの作成

このステップでは、docker manifest create コマンドを使用してマニフェストリストを作成する方法を学びます。マニフェストリストはイメージマニフェストのリストで、単一の名前で異なるアーキテクチャやオペレーティングシステム用のイメージを参照できます。これはマルチアーキテクチャイメージを構築する際に特に有用です。

まず、マニフェストリストの作成に使用する 2 つの異なるイメージを取得しましょう。amd64arm64 アーキテクチャ用の alpine イメージを使用します。

docker pull alpine:latest
docker pull arm64v8/alpine:latest

イメージが取得されていることを示す出力が表示されるはずです。

latest: Pulling from library/alpine
...
Status: Downloaded newer image for alpine:latest
latest: Pulling from arm64v8/alpine
...
Status: Downloaded newer image for arm64v8/alpine:latest

ここで、先ほど取得した 2 つのイメージを含む my-alpine:latest という名前のマニフェストリストを作成します。構文は docker manifest create MANIFEST_LIST IMAGE [IMAGE...] です。

docker manifest create my-alpine:latest alpine:latest arm64v8/alpine:latest

コマンドが成功すると、何も出力されません。このコマンドはローカルのマニフェストリストを作成します。マニフェストリストの情報を表示するには、docker manifest inspect コマンドを使用できます。

docker manifest inspect my-alpine:latest

以下のような出力が表示され、amd64arm64 アーキテクチャのマニフェストを含むマニフェストリストの詳細が示されます。

{
  "schemaVersion": 2,
  "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
  "manifests": [
    {
      "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
      "size": 528,
      "digest": "sha256:...",
      "platform": {
        "architecture": "amd64",
        "os": "linux"
      }
    },
    {
      "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
      "size": 528,
      "digest": "sha256:...",
      "platform": {
        "architecture": "arm64",
        "os": "linux"
      }
    }
  ]
}

これにより、my-alpine:latest マニフェストリストが正常に作成され、指定されたイメージが含まれていることが確認できます。

マニフェストリストをレジストリにプッシュする

このステップでは、前のステップで作成したマニフェストリストを Docker レジストリにプッシュします。デフォルトでは、docker push は個々のイメージをプッシュします。マニフェストリストをプッシュするには、docker manifest push コマンドを使用する必要があります。

プッシュする前に、プッシュ先のレジストリが必要です。この実験では、Docker Hub を使用します。Docker Hub アカウントを持っていない場合は、無料で作成できます。ターミナルから Docker Hub にログインする必要があります。

docker login

Docker Hub のユーザー名とパスワードの入力を求められます。資格情報を入力してログインします。

Login with your Docker ID to push and pull images, scan them for vulnerabilities, sign and attest to them, and more.
Username: your_docker_username
Password: your_docker_password
Login Succeeded

ログインしたら、マニフェストリストをプッシュできます。Docker Hub にプッシュする形式は your_docker_username/manifest_list_name:tag です。ここでは、Docker Hub のユーザー名が your_docker_username であると仮定します。your_docker_username を実際の Docker Hub のユーザー名に置き換えてください。

docker manifest push your_docker_username/my-alpine:latest

マニフェストリストと関連するイメージがレジストリにプッシュされていることを示す出力が表示されるはずです。

Pushed manifest list your_docker_username/my-alpine:latest

プッシュが完了した後、Docker Hub のウェブサイトを訪問するか、異なるアーキテクチャでイメージを取得することで、マニフェストリストが Docker Hub のリポジトリに存在することを確認できます。

マニフェストリストを不安全なレジストリにプッシュする

このステップでは、マニフェストリストを不安全なレジストリにプッシュする方法を探ります。不安全なレジストリとは、TLS/SSL 証明書を使用しないレジストリで、本番環境では推奨されませんが、テストや内部ネットワークでは有用です。

デフォルトでは、Docker はレジストリへの安全な接続を要求します。不安全なレジストリにプッシュするには、Docker デーモンを構成して、特定のレジストリアドレスへの不安全な接続を許可する必要があります。

この実験では、TLS を使用せずに実行されるローカルレジストリを使用して、不安全なレジストリをシミュレートします。まず、ローカルレジストリコンテナを実行しましょう。ホストのポート 5000 をコンテナのポート 5000 にマッピングします。

docker run -d -p 5000:5000 --name registry registry:2

コンテナが実行されていることを示す、以下のような出力が表示されるはずです。

Unable to find image 'registry:2' locally
2: Pulling from library/registry
...
Status: Downloaded newer image for registry:2
a1b2c3d4e5f6...

ここで、Docker デーモンを構成して、localhost:5000 のこの不安全なレジストリを信頼する必要があります。これには、Docker デーモンの構成ファイルを変更する必要があります。このファイルの場所は異なる場合がありますが、ほとんどの Linux システムでは /etc/docker/daemon.json です。

sudo nano を使用してこのファイルを編集します。

sudo nano /etc/docker/daemon.json

ファイルが存在しない場合は、作成することができます。insecure-registries キーを追加または変更して、localhost:5000 を含めます。ファイルの内容は次のようになります。

{
  "insecure-registries": ["localhost:5000"]
}

ファイルを保存し、エディタを終了します(nano では Ctrl+X、Y、Enter)。

構成を変更した後、変更を有効にするには Docker デーモンを再起動する必要があります。

sudo systemctl restart docker

これで、マニフェストリストに不安全なレジストリアドレスを付けてプッシュできます。最初のステップで作成した my-alpine:latest マニフェストリストを使用します。

docker manifest create localhost:5000/my-alpine:latest alpine:latest arm64v8/alpine:latest
docker manifest push localhost:5000/my-alpine:latest

レジストリが不安全であっても、プッシュが成功したことを示す出力が表示されるはずです。

Pushed manifest list localhost:5000/my-alpine:latest

これにより、Docker デーモンを構成した後、マニフェストリストを不安全なレジストリにプッシュする方法が示されます。

ローカルのマニフェストリストをプッシュして削除する

このステップでは、マニフェストリストをプッシュし、プッシュが成功した後に自動的にローカルコピーを削除する方法を学びます。これは、マルチアーキテクチャのイメージをプッシュした後にローカル環境をクリーンアップするのに役立ちます。

docker manifest push コマンドには --purge フラグがあり、マニフェストリストがレジストリに正常にプッシュされた後にローカルのマニフェストリストを削除します。

まず、ローカルに my-alpine:latest マニフェストリストがあることを確認しましょう。これは最初のステップで作成しました。その存在を確認するために、インスペクトすることができます。

docker manifest inspect my-alpine:latest

前と同様に、マニフェストリストの詳細が表示されるはずです。

ここで、このマニフェストリストを再度 Docker Hub にプッシュしますが、今回は --purge フラグを使用します。your_docker_username を実際の Docker Hub のユーザー名に置き換えることを忘れないでください。

docker manifest push --purge your_docker_username/my-alpine:latest

プッシュが進行中であることを示す出力が表示され、その後、マニフェストリストが削除されたことを確認するメッセージが表示されるはずです。

Pushed manifest list your_docker_username/my-alpine:latest
Purged manifest list your_docker_username/my-alpine:latest

コマンドが完了した後、ローカルのマニフェストリスト my-alpine:latest は存在しなくなっているはずです。再度インスペクトしてこれを確認することができます。

docker manifest inspect my-alpine:latest

今回は、マニフェストリストが見つからないことを示すエラーメッセージが表示されるはずです。

no such manifest: my-alpine:latest

これにより、--purge フラグがマニフェストリストをレジストリにプッシュした後にローカルのマニフェストリストを正常に削除したことが確認されます。

最後に、前のステップで起動したローカルの不安全なレジストリコンテナをクリーンアップしましょう。

docker stop registry
docker rm registry

コンテナが停止され、削除されたことを確認する出力が表示されるはずです。

registry
registry

まとめ

この実験では、docker manifest コマンドを使用してマルチアーキテクチャのイメージを管理する方法を学びました。まず、alpine イメージの 2 つの異なるアーキテクチャバージョンを取得しました。次に、docker manifest create を使用してこれらのイメージを単一のマニフェストリストに結合し、単一の名前で参照できるようにしました。docker manifest inspect を使用してマニフェストリストの作成を確認しました。

その後、docker manifest push を使用してこのマニフェストリストを Docker レジストリにプッシュする方法を探りました。また、--insecure フラグを追加することで、不安全なレジストリにプッシュする特定のケースについても説明しました。最後に、docker manifest push コマンドで --purge フラグを使用して、マニフェストリストをプッシュすると同時にローカルコピーを削除する方法を学びました。