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

DockerBeginner
オンラインで実践に進む

はじめに

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

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 インフラストラクチャを維持するためのベストプラクティスについて学ぶことができます。