Docker 入門

Docker Hubとイメージレジストリ

Docker Hubとイメージレジストリ (Image Registries) は、コンテナ化エコシステム全体のハブであり、Dockerイメージの共有とディストリビューションを非常にスムーズにします。これらを活用することで、他の開発者がビルド済みのイメージを直接取得し、ゼロから車輪の再発明をすることなく、アプリケーションの開発とデプロイにリソースを集中させることができます。

1. Docker Hubとは?

Docker Hubは、Docker公式が提供するパブリックなイメージレジストリです。これはクラウドベースのサービスであり、Dockerイメージの保存と共有を可能にします。ここには、個人開発者、オープンソースプロジェクト、およびソフトウェアベンダーがコントリビュートした膨大な数のイメージが集約されています。

1.1 Docker Hubのコア機能

  • イメージホスティング (Image Hosting): Docker Hubは、膨大な数のパブリックおよびプライベートなDockerイメージをホスティングしています。
  • パブリックリポジトリ (Public Repositories): 誰でもアクセス可能なリポジトリであり、通常はオープンソースソフトウェアやコミュニティイメージの共有に使用されます。
  • プライベートリポジトリ (Private Repositories): 自身とチームメンバーのみがアクセス可能なリポジトリであり、通常は社内の商用アプリケーションイメージの保存に使用されます。なお、使用量に応じてプライベートリポジトリは有料のサブスクリプションが必要になる場合があります。
  • 自動ビルド (Automated Builds): Docker Hubはソースコードリポジトリ(GitHubやBitbucketなど)を監視し、ソースコードに変更があった場合、コード内の Dockerfile に基づいて自動的に再ビルドを行い、新しいイメージを生成します。
  • チームと組織 (Teams and Organizations): Docker Hub上でチームや組織を作成し、アクセス権限の管理やイメージ開発におけるコラボレーションを簡単に行うことができます。
  • Webhooks: リポジトリに新しいイメージがプッシュされた際、Webhookを利用して他のシステムで特定のアクションをトリガーできます。例えば、最新のイメージが準備できた時点で、アプリケーションの本番環境へのデプロイを自動的にトリガーするWebhookを設定できます。

1.2 Docker Hubの探索

Webインターフェース、またはDocker CLI (コマンドラインインターフェース) を通じて、Docker Hubを探索することができます。

  • Webインターフェース: ブラウザからDocker Hubの公式サイトにアクセスします。キーワードでイメージを検索し、「公式イメージ (Official Images)」でフィルタリングできるほか、ディスクリプション、バージョンタグ (tags)、およびプル (Pull) 用のコマンドなど、イメージの詳細情報を確認できます。
  • Docker CLI: docker search コマンドを使用すると、ターミナルから直接イメージを検索できます。
docker search nginx

このコマンドは、検索キーワード「nginx」に一致するすべてのイメージのリストを出力し、それらのディスクリプション、スター (お気に入り) の数、および公式イメージであるかどうかを表示します。

1.3 Docker Hubからのイメージのプル (Pull)

Docker Hub上のイメージをローカル環境で使用するには、docker pull コマンドを使用してローカルマシンにプル (ダウンロード) する必要があります。

docker pull nginx:latest

このコマンドは、Docker Hubから nginx イメージの最新バージョンをダウンロードします。コロンの後の :latest はタグ (tag) であり、プルする具体的なバージョンを指定するためのものです。タグを省略した場合、Dockerはデフォルトで latest (最新) タグが付いたイメージをプルします。

1.4 Docker Hubのネームスペース (Namespace)

Docker Hub上では、イメージはネームスペース (namespaces) によって編成されています。1つのネームスペースは通常、1つのユーザーアカウントまたは組織アカウントに対応します。イメージの完全な名前のフォーマットは ユーザー名/イメージ名 または 組織名/イメージ名 となります。公式イメージの場合、ユーザー名は省略されます(例:単に nginx と呼ばれます)。

例えば、あなたのDocker Hubのユーザー名が myuser で、webapp という名前のイメージをビルドした場合、このイメージの完全な名前は myuser/webapp になります。

1.5 公式イメージ (Official Images)

Docker Hubには一連の「公式イメージ」が含まれています。これらのイメージは、Docker公式またはソフトウェアのオリジナルベンダーによって厳格に監査およびメンテナンスされている高品質なイメージです。通常、非常にセキュアで最新の状態に保たれています。公式イメージには青色の認証マークが付いています。一般的な公式イメージには、nginxubuntupython などがあります。

1.6 ハンズオン:Nginxイメージのプルと実行

1. Nginxイメージのプル:

docker pull nginx:latest

2. Nginxコンテナの実行:

docker run -d -p 80:80 nginx:latest

このコマンドは、バックグラウンド (デタッチモード -d) でNginxコンテナを実行し、ホストマシンの 80 番ポートをコンテナ内部の 80 番ポートにマッピングします (-p 80:80)。これで、ブラウザを開いて http://localhost にアクセスすると、Nginxのウェルカムページが表示されるはずです。

2. イメージレジストリ (Image Registries) のディープダイブ

イメージレジストリは、Dockerイメージを保存およびディストリビューションするためのシステムです。Docker Hubはデフォルトのパブリックレジストリですが、プライベートレジストリを使用して、社内のサーバーやクラウドプラットフォーム上にイメージをセキュアに保存することも可能です。

2.1 イメージレジストリのタイプ

  • パブリックレジストリ (Public Registries): Docker Hubのようにすべての人に公開されており、誰でもその中のパブリックイメージをダウンロードできます。
  • プライベートレジストリ (Private Registries): アクセスには認証 (Authentication) と認可 (Authorization) が必要です。これらは通常、企業秘密やセンシティブな情報を含むプライベートイメージの保存に使用されます。
  • クラウドベースのレジストリ (Cloud-Based Registries): AWS、Google Cloud、Azureなどのクラウドプロバイダーは、それぞれ独自のコンテナレジストリサービスを提供しています。これらのレジストリは、自社のクラウドプラットフォームとシームレスにインテグレーションできます。

2.2 主流なプライベートレジストリソリューション

  • Docker Trusted Registry (DTR): Docker公式が提供するオンプレミスデプロイ向けのレジストリソリューションです(現在はDocker Hubの高度な機能に徐々に置き換えられつつあります)。
  • Harbor: 非常に人気のあるオープンソースのレジストリで、ロールベースのアクセス制御 (RBAC)、イメージのセキュリティスキャン、監査 (Audit) などの高度な機能を備えています。エンタープライズグレードのプロダクション環境に最適です。
  • JFrog Artifactory: 汎用的なアーティファクトリポジトリマネージャーであり、Dockerイメージだけでなく、他のさまざまなタイプのソフトウェアパッケージの管理もサポートしています。
  • Amazon Elastic Container Registry (ECR): Amazon AWSが提供するフルマネージドなコンテナイメージレジストリサービスです。
  • Google Container Registry (GCR): Google Cloud Platform (GCP) が提供するプライベートコンテナイメージレジストリサービスです。
  • Azure Container Registry (ACR): Microsoft Azureが提供するマネージドなコンテナイメージレジストリサービスです。

2.3 プライベートレジストリを使用するメリット

  • セキュリティ (Security): より厳格なアクセス制御を提供し、未認証のユーザーによるイメージの取得や悪意のある改ざんを防ぎます。
  • コンプライアンス (Compliance): 企業のセキュリティ監査やコンプライアンス要件を満たし、イメージが管理された環境に安全に保存されることを保証します。
  • パフォーマンス (Performance): プロダクションサーバーに近い場所(社内ネットワークや同一リージョンのクラウドなど)にレジストリをデプロイすることで、イメージのプル速度を大幅に向上させ、ネットワークレイテンシを低減できます。
  • コントロール (Control): バージョン管理、タグ付けの規則、ライフサイクル管理など、イメージに対する絶対的な管理権限を持つことができます。

2.4 プライベートレジストリの認証 (Authentication)

プライベートレジストリからイメージをプルまたはプッシュするには、まず docker login コマンドを使用して認証を行う必要があります。

docker login <registry-hostname>

<registry-hostname> をプライベートレジストリのドメインアドレスに置き換えます。Enterキーを押すと、ユーザー名とパスワードの入力が求められます。Dockerはこれらのクレデンシャル (資格情報) を、ローカルマシンの ~/.docker/config.json ファイルに安全に保存します。

2.5 プライベートレジストリへのイメージのプッシュ (Push)

イメージをプライベートレジストリにプッシュする前に、まずレジストリのドメイン名を使用してイメージにタグ付け (Tagging) を行う必要があります。

docker tag <image-name> <registry-hostname>/<image-name>

例:

docker tag myapp localhost:5000/myapp

タグ付けが完了したら、それをプッシュすることができます。

docker push localhost:5000/myapp