Docker を異なるレジストリと連携させる方法

DockerDockerBeginner
今すぐ練習

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

はじめに

Dockerは、アプリケーションの構築、展開、管理の方法を革新的に変えた強力なコンテナ化プラットフォームです。Dockerエコシステムの重要なコンポーネントの1つは、Dockerイメージを保存および配布するためのリポジトリとして機能するDockerレジストリです。このチュートリアルでは、Dockerを構成して、プライベートおよびパブリックレジストリを含むさまざまなレジストリと連携させて、Dockerベースのアプリケーションを効果的に管理する方法を学びます。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/SystemManagementGroup(["System Management"]) docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/ImageOperationsGroup -.-> docker/push("Push Image to Repository") docker/ImageOperationsGroup -.-> docker/search("Search Images in Repository") docker/SystemManagementGroup -.-> docker/login("Log into Docker Registry") docker/SystemManagementGroup -.-> docker/logout("Log out from Docker Registry") subgraph Lab Skills docker/pull -.-> lab-411515{{"Docker を異なるレジストリと連携させる方法"}} docker/push -.-> lab-411515{{"Docker を異なるレジストリと連携させる方法"}} docker/search -.-> lab-411515{{"Docker を異なるレジストリと連携させる方法"}} docker/login -.-> lab-411515{{"Docker を異なるレジストリと連携させる方法"}} docker/logout -.-> lab-411515{{"Docker を異なるレジストリと連携させる方法"}} end

Dockerレジストリの概要

Dockerレジストリは、Dockerイメージが保存され、プルできる中央リポジトリです。これらは、開発者や組織がDockerイメージを共有、配布、管理できるようにするため、Dockerエコシステムの骨格となっています。このセクションでは、Dockerレジストリの基本、その目的、利用可能なレジストリの種類を探ります。

Dockerレジストリとは?

Dockerレジストリは、Dockerイメージを保存および配布するサービスです。これは、Dockerイメージがホストされ、ダウンロード可能になる集中的な場所として機能します。Dockerイメージを構築するとき、それをレジストリにプッシュできます。そして、他のユーザーやシステムは、そのイメージをレジストリからプルして使用できます。

Dockerレジストリの種類

Dockerレジストリには、主に2種類あります。

  1. パブリックレジストリ:パブリックレジストリは、インターネット上の誰でもアクセスでき、一般的なコミュニティで維持されるDockerイメージの共有や配布によく使われます。最も有名なパブリックレジストリはDocker Hubで、これはDockerエンジンでデフォルトで使用されるレジストリです。

  2. プライベートレジストリ:プライベートレジストリは、組織や個人によって所有および管理され、通常はアクセスが制限されます。組織内や限定されたユーザーグループ内で、カスタムの独自のDockerイメージを保存および配布するために使用されます。

Dockerレジストリへのアクセス

Dockerレジストリとやり取りするには、dockerコマンドラインツールを使用できます。レジストリとの作業に使用する基本コマンドは次のとおりです。

  • docker pull <image>:レジストリからDockerイメージをプルします。
  • docker push <image>:レジストリにDockerイメージをプッシュします。
  • docker login <registry>:Dockerレジストリに認証します。
sequenceDiagram participant Developer participant Docker Engine participant Docker Registry Developer->>Docker Engine: docker build -t my-app. Docker Engine->>Docker Registry: docker push my-app:latest Docker Engine->>Docker Registry: docker pull my-app:latest

Dockerレジストリの基本を理解することで、Dockerイメージを効果的に管理して配布し、さまざまな環境で一貫性のある信頼性の高い展開を行うことができます。

複数のレジストリに対するDockerの構成

Dockerベースのアプリケーションが増えるにつれて、パブリックおよびプライベートの両方の複数のDockerレジストリと協力する必要がある場合があります。このセクションでは、Dockerを構成して異なるレジストリとやり取りし、これらのレジストリ全体でDockerイメージを管理する方法を探ります。

Dockerデーモンの構成

Dockerデーモンは、複数のレジストリと協力するように構成できます。デフォルトでは、DockerはDocker Hubレジストリを使用しますが、Dockerデーモンの構成ファイルを変更することで追加のレジストリを構成できます。

Ubuntu 22.04では、Dockerデーモンの構成ファイルは/etc/docker/daemon.jsonにあります。このファイルを編集して、追加のレジストリに必要な構成を追加できます。

daemon.jsonの構成例:

{
  "registry-mirrors": ["https://mirror.gcr.io", "https://registry.example.com"],
  "insecure-registries": ["registry.example.com"]
}

この例では、2つのレジストリミラー(registry-mirrors)と1つのインセキュアなレジストリ(insecure-registries)を追加しました。構成ファイルを変更した後、変更を反映するにはDockerデーモンを再起動する必要があります。

sudo systemctl restart docker

複数のレジストリへの認証

プライベートレジストリにアクセスするには、それらに対して認証する必要があります。これは、レジストリURLを指定してdocker loginコマンドを使用することで行えます。

docker login registry.example.com

これにより、指定されたレジストリのユーザー名とパスワードを入力するように促されます。

あるいは、レジストリの資格情報をDockerクレデンシャルストアに保存することもできます。これにより、毎回資格情報を入力することなく、複数のレジストリに対して認証できます。

docker login -u myusername -p mypassword registry.example.com

レジストリ間でのイメージの管理

Dockerを複数のレジストリと協力するように構成したら、これらのレジストリ全体でDockerイメージを管理できます。異なるレジストリでイメージを操作する基本コマンドは次のとおりです。

  • docker pull <registry>/<image>:<tag>:特定のレジストリからイメージをプルします。
  • docker push <registry>/<image>:<tag>:特定のレジストリにイメージをプッシュします。

複数のレジストリに対するDockerの構成方法と、これらのレジストリ全体でDockerイメージを管理する方法を理解することで、複雑な環境でDockerベースのアプリケーションを効果的に整理して配布できます。

実際のレジストリ管理シナリオ

このセクションでは、組織内でDockerレジストリを管理する際のいくつかの実際のシナリオとベストプラクティスを探ります。

シナリオ1:パブリックレジストリのミラー化

多くの組織は、ダウンロード速度を向上させ、インターネット帯域幅の使用量を削減するために、Docker Hubなどのパブリックレジストリをミラー化することを好みます。これは、ローカルレジストリをセットアップし、それをミラーとして構成することで達成できます。

## ローカルレジストリを実行
docker run -d -p 5000:5000 --restart=always --name registry registry:2

## Dockerデーモンを構成して、ローカルレジストリをミラーとして使用する
echo '{"registry-mirrors": ["http://localhost:5000"]}' | sudo tee /etc/docker/daemon.json
sudo systemctl restart docker

これで、イメージをプルするとき、Dockerはパブリックレジストリから取得する前にまずローカルレジストリミラーを確認します。

シナリオ2:レジストリ間でのイメージの昇格

アプリケーションが進化するにつれて、開発レジストリから本番レジストリなど、異なるレジストリ間でDockerイメージを昇格させる必要がある場合があります。これは、docker pullコマンドとdocker pushコマンドを使用して達成できます。

## 開発レジストリからイメージをプル
docker pull dev-registry.example.com/my-app:v1

## イメージを本番レジストリ用にタグ付け
docker tag dev-registry.example.com/my-app:v1 prod-registry.example.com/my-app:v1

## イメージを本番レジストリにプッシュ
docker push prod-registry.example.com/my-app:v1

このワークフローにより、異なる環境とレジストリ間でDockerイメージのライフサイクルを管理できます。

シナリオ3:プライベートレジストリのセキュリティ強化

プライベートレジストリを使用する際は、アクセスを適切にセキュアにすることが不可欠です。ロールベースのアクセス制御(RBAC)やイメージ脆弱性スキャニングなどの機能を使用して、プライベートレジストリのセキュリティを強化できます。

graph LR Developer -- docker login --> Private Registry Private Registry -- RBAC --> Developer Private Registry -- Vulnerability Scanning --> Developer

これらの実際のレジストリ管理シナリオを理解して実装することで、組織内でDockerイメージを効果的に整理、配布、セキュアにすることができます。

まとめ

このチュートリアルが終わるとき、Dockerを複数のレジストリと連携させる方法をしっかりと理解しており、さまざまな環境でDockerベースのアプリケーションを効果的に管理および展開できるようになります。現実世界のレジストリ管理シナリオや、堅牢でセキュアなDockerインフラストラクチャを維持するためのベストプラクティスについて学ぶことができます。