イメージをDocker Hubに保管

これまではローカル・ホスト上の Docker を、コマンドラインで操作する方法を学びました。 イメージを取得 し、既存のイメージからコンテナを構築する方法と、 自分自身でイメージを作成する 方法を学びました。

次は Docker Hub を簡単に使う方法を学び、Docker のワークフローを拡張しましょう。

Docker Hub は Docker 社が管理する公開(パブリックな)レジストリです。ここには、ダウンロードしてコンテナ構築に使えるイメージが置かれています。また、自動化や、ワークグループの仕組み、ウェブフック(webhook)や構築トリガ(build trigger)のようなワークフロー・ツール、一般には共有したくないイメージを保管するプライベート・リポジトリのようなプライバシー・ツールを提供します。

Docker コマンドと Docker Hub

Docker Hub が提供するサービスには、 Docker 自身が docker searchpullloginpush コマンドを通して接続する機能があります。ここではコマンドの働きを見ていきましょう。

アカウントの作成とログイン

例によって、Docker Hub を使い始めるには(未作成であれば)アカウントを作成し、ログインします。アカウントの作成は Docker Hub 上で 行えます。

$ docker login

これでコミットしたイメージを、自分の Docker Hub リポジトリ上に、アップロード(push)できます。

注釈

自分の認証に関する情報は、自分のホームディレクトリの /.docker/config.json に保管されます。

イメージの検索

(ブラウザの)検索インターフェースかコマンドライン・インターフェースを通して、 Docker Hub レジストリを検索できます。イメージの検索は、イメージ名、ユーザ名、説明文に対して可能です。

$ docker search centos
NAME           DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
centos         The official build of CentOS                    1223      [OK]
tianon/centos  CentOS 5 and 6, created using rinse instea...   33
...

ここでは centostianon/centos という、2つの結果が表示されました。後者は tianon という名前のユーザによる公開リポジトリです。1つめの結果 centos とは明確に異なるリポジトリです。1つめの centos は、 公式リポジトリ としての信頼されるべきトップ・レベルの名前空間です。文字列 / により、イメージ名とユーザのリポジトリ名を区別します。

欲しいイメージが見つかれば、 docker pull <イメージ名> によってダウンロードできます。

$ docker pull centos
Using default tag: latest
latest: Pulling from library/centos
f1b10cd84249: Pull complete
c852f6d61e65: Pull complete
7322fbe74aa5: Pull complete
Digest: sha256:90305c9112250c7e3746425477f1c4ef112b03b4abe78c612e092037bfecc3b7
Status: Downloaded newer image for centos:latest

これで、この入手したイメージをから、コンテナを実行可能です。

バージョンの指定と最新版

docker pull centos の実行は、docker pull centos:latest の実行と同等です。イメージを取得するにあたり、標準の最新(latest)イメージをダウンロードするのではなく、より適切なイメージを正確に指定可能です。

例えば、 centos のバージョン 5 を取得するには、docker pull centos:centos5 を使います。この例では、 centos リポジトリにおける centos のバージョンを、タグ centos5 でラベル付けしたイメージを指定しています。

リポジトリにおいて現在利用可能なタグの一覧を確認するには、 Docker Hub 上のレジストリをご覧ください。

Docker Hub への貢献

誰でも Docker Hub レジストリから公開イメージを取得(pull)できるように設定可能です。自分のレジストリでイメージを共有したい場合は、まず登録が必要です。

Docker Hub にリポジトリの送信

リポジトリを対象のレジストリに送信(push)するためには、イメージに名前を付けるか、 こちら で見たように、コンテナにイメージ名を付けてコミットする必要があります。

それからこのリポジトリを、レジストリが表す名前やタグで送信できます。

$ docker push yourname/newimage

対象のイメージをアップロードしたら、あなたの同僚やコミュニティにおいても利用可能になります。

Docker Hub の機能

それでは、Docker Hub のいくつかの機能について、詳細を見ていきましょう。より詳しい情報は こちら からご覧いただけます。

  • プライベート・リポジトリ
  • 組織とチーム
  • 自動構築
  • ウェブフック

プライベート・リポジトリ

イメージを一般公開せず、誰とも共有したくない場合があります。そのような時は Docker Hub のプライベート・リポジトリが利用できます。サインアップや料金プランは、 こちらを ご覧ください。

組織とチーム

プライベート・リポジトリの便利な機能の1つは、組織やチームにおける特定メンバーのみとの共有です。Docker Hub 上で組織(organization)を作り、同僚と協力しながらプライベート・リポジトリの管理が可能です。組織の作成や管理方法については こちら をご覧ください。

自動構築

自動構築(Automated Build)とは、 GItHubBitbucket を更新したら、Docker Hub が直接イメージの構築や更新をします。これは、選択した GitHub か Bitbucket リポジトリに対するコミットをきっかけ(フック)とします。コミットをプッシュ(push)したのをトリガとして、イメージを構築・更新します。

自動構築のセットアップ

  1. Docker Hub アカウント を作成してログインします。
  2. Linked Accounts & Services (アカウントとサービスのリンク)から自分の GitHub もしくは Bitbucket アカウントをリンクします。
  3. 自動構築の設定 をします。
  4. 選択した GitHub もしくは Bitbucket プロジェクト上で、構築内容を Dockerfile にまとめます。
  5. 必要があれば構築時のブランチを指定します(デフォルトは master ブランチです)。
  6. 自動構築名を指定します。
  7. 構築時に追加するオプションの Docker タグを指定します。
  8. Dockerfile の場所を指定します。デフォルトは / です。

自動構築の設定を有効化しておけば、ビルドをトリガとして数分後に自動構築が開始します。自動ビルドの状態は Docker Hub レジストリ上で見られます。GitHub や Bitbucket リポジトリの同期が終わるまで、自動ビルドを無効化できません。

リポジトリの自動構築状態や出力を確認したい場合は、自分の リポジトリ一覧ページ に移動し、対象のリポジトリ名をクリックします。自動構築が有効な場合は、リポジトリ名の下に “automated build” と表示されます。リポジトリの詳細ページに移動し、”Build details” タブをクリックしたら、Docker Hub 上における構築状態や、全ての構築トリガが表示されます。

自動構築が完了したら、無効化や設定の削除が可能になります。ここで注意すべきは、docker push コマンドを使って送信しても、自動構築を行わない点です。自動構築の管理対象は、あくまでも GitHub と Bitbucket リポジトリに対してコードをコミットした時のみです。

リポジトリごとに複数の自動構築設定や、特定の Dockerfile や Git ブランチの指定も可能です。

構築のトリガ

Docker Hub の URL を経由しても、自動構築のトリガにできます。これにより、イメージを必要に応じて自動的に再構築することが可能です。

ウェブフック

ウェブフック(webhook)とは、リポジトリに対して設定します。トリガとなるのは、イメージに対するイベントの発生や、更新されたイメージがリポジトリに送信された時です。ウェブフックは特定の URL と JSON ペイロードで指定でき、イメージが送信(push)されると適用されます。

ウェブフックの詳細 については、Docker Hub のドキュメントをご覧ください。

次のステップ

さぁ Docker を使いましょう!