アプリケーションの共有

ここまでにイメージをビルドしたので、それを共有していきます。 Docker イメージを共有するためには Docker レジストリを利用することになります。 デフォルトのリポジトリは Docker Hub です。 これはここまでに利用してきたイメージがすべて収容されている場所です。

Docker ID

Docker ID は Docker Hub にアクセスするためのものです。 Docker Hub は世界でも最大規模を誇るコンテナーイメージのライブラリおよびコミュニティです。 無料の Docker ID をまだ取得していない場合は、作成しておいてください。

リポジトリの生成

イメージをプッシュするためには、あらかじめ Docker Hub 上にリポジトリを生成しておくことが必要です。

  1. Docker Hubサインアップ またはサインインします。

  2. Create Repository (リポジトリ生成) ボタンをクリックします。

  3. リポジトリ名は getting-started とします。 VisibilityPublic とします。

  4. Create (生成) をクリックします。

以下の画像から、Docker Hub が示す Docker コマンドを見ることができます。 このコマンドはリポジトリへのプッシュを行うものです。

プッシュを行う Docker コマンド例

イメージのプッシュ

  1. コマンドライン上から Docker Hub で確認した docker push コマンドを実行します。 ちなみに実行コマンド内ではご自身の Docker ID を用いてください。 "docker" ではありません。 たとえば docker push YOUR-USER-NAME/getting-started とします。

    $ docker push docker/getting-started
    The push refers to repository [docker.io/docker/getting-started]
    An image does not exist locally with the tag: docker/getting-started
    

    エラーが出て失敗したのはなぜでしょう? プッシュを行うコマンドが docker/getting-started というイメージを探しましたが、それが見つからなかったためです。 docker image ls を実行しても見当たらないはずです。

    これを解決するには、ビルド済みの既存イメージに対してタグづけを行って、別の名前を設定することが必要です。

  2. コマンド docker login -u YOUR-USER-NAME を実行して Docker Hub にサインインします。

  3. docker tag コマンドを実行して getting-started イメージに対して新たな名前を設定します。 YOUR-USER-NAME の部分は利用している Docker ID に置き換えてください。

    $ docker tag getting-started YOUR-USER-NAME/getting-started
    
  4. そこでもう一度 docker push コマンドを実行します。 Docker Hub の画面からコマンドのコピーを行っている場合、tagname の部分を取り除くこともできます。 イメージ名にタグをつけていない場合にはそのようにします。 イメージ名に対してタグ名をつけなかった場合、Docker は latest というタグ名を利用します。

    $ docker push YOUR-USER-NAME/getting-started
    

新たなインスタンス上でのイメージ実行

イメージをビルドしそれをレジストリにプッシュしました。 そこでこれまでとはまったく違うコンテナーイメージからビルドされた、新たなインスタンス上にアプリを実行してみます。 具体的には Play with Docker を利用します。

メモ

Play with Docker は amd64 プラットフォームを利用しています。 Apple silicon による ARM ベースの Mac を利用している場合、Play with Docker と互換性のあるイメージを再ビルドして、新たなイメージとしてリポジトリにプッシュする必要があります。

amd64 プラットフォーム向けにイメージをビルドするには --platform フラグを用います。

$ docker build --platform linux/amd64 -t YOUR-USER-NAME/getting-started .

Docker buildx ではマルチプラットフォームのビルドをサポートしています。 詳しくは マルチプラットフォームイメージ を参照してください。

  1. ブラウザーを開いて Play with Docker にアクセスします。

  2. Login (ログイン) をクリックして、ドロップダウンリストの中から docker を選びます。

  3. Docker Hub アカウントを使ってサインインし、Start をクリックします。

  4. 左サイドバーにある ADD NEW INSTANCE (新規インスタンスの追加) オプションをクリックします。 オプションが見えない場合は、ブラウザーを広げてみてください。 しばらくしてブラウザー上に端末ウィンドウが開きます。

    Play with Docker における新規インスタンス追加
  5. 端末ウィンドウにて、プッシュしたばかりのアプリを起動します。

    $ docker run -dp 0.0.0.0:3000:3000 YOUR-USER-NAME/getting-started
    

    イメージがプルされ、しばらくしてアプリが起動します。

    情報

    お気づきかと思いますが、このコマンドにてポートマッピングを行っているのは別 IP アドレスに対してです。 その前に実行した docker run コマンドでは、ホスト上の 127.0.0.1:3000 にポート公開を行っていました。 今回はそれが 0.0.0.0 です。

    127.0.0.1 へバインディングされると、コンテナーのポートはループバックインターフェースにのみにバインドされます。 一方で 0.0.0.0 へのバインディングは、コンテナーのポートが全インターフェースにバインドすることができます。 この場合は外部への接続が可能となります。

    ポートマッピングが動作する様子に関しての詳細は ネットワーク処理 を参照してください。

  6. 3000 バッジが現れるのでクリックします。

    3000 バッジが現れなかった場合は、Open Port をクリックして 3000 を指定してください。

まとめ

本節ではイメージを共有する方法として、レジストリにイメージをプッシュする方法を学びました。 そして新たなインスタンスを使って、プッシュしたばかりのイメージを実行しました。 CI パイプラインではごく普通のことであり、そこではイメージを生成しレジストリにプッシュします。 そして本番環境であればイメージの最新版を利用します。

関連情報

次のステップ

次節では、コンテナー化したアプリケーション内のデータを保存する方法について学びます。