アプリケーションの共有

構築したイメージは共有できます。 Docker イメージを共有するには、 Docker レジストリ(registry) を使う必要があります。デフォルトのレジストリは Docker Hub です。そこには、これまでに使った全てのイメージがあります。

注釈

Docker ID

Docker Hub はコンテナ イメージの世界最大のライブラリかつコミュニティであり、 Docker ID でアクセスできます。まだ持っていなければ、無料で Docker ID を作りましょう。

リポジトリ作成

イメージを 送信(push) するには、まず Docker Hub にリポジトリを作成する必要があります。

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

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

  1. リポジトリ名には getting-started を使います。Visibility は Public (公開)を確認します。

    注釈

    プライベート リポジトリ

    特定のユーザやチームに対してのみ内容を制限するために、Docker は プライベート リポジトリ(private repository) を提供しています。御存じですか? 詳細は Docker pricing のページを御覧ください。

  1. Create (作成)ボタンをクリックします。

下の図を見たら、 Docker コマンド例があります。このコマンドは、このリポジトリを送信します。

Docker コマンドの push 例

イメージを 送信(push)

ヒント

(訳者注)この日本語訳では、イメージの「push」を「送信」として訳しています(コマンドを示す以外)。本来の push は「何かを押し出す」「何かを遠ざける」という意味です。ですが、そのまま訳したり"プッシュ"とカタカナ表記したりしても、抽象的な表現は日本語での理解が困難なため、 Docker の機能を表す「送信」と訳しています。

  1. コマンドラインから、先ほど Docker Hub で見た push (送信)コマンドを実行します。注意点として、入力するコマンドでは自分の名前空間(Docker ユーザ ID)を指定する必要があります。「docker」ではありません。

    $ 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
    

    失敗しましたか? push コマンドは docker/getting-started という名前のイメージを探しますが、見つからないからです。 docker image ls を実行しても、該当するイメージは見つからないでしょう。

    修正するには、現在の構築済みイメージに付いている「 タグ(tag) 」に、別の名前を付ける必要があります。

  1. コマンド docker login -u 自分のユーザ名 で Docker Hub へログインします。

  1. docker tag コマンドを使い、 getting-started イメージに新しい名前を追加します。注意点として、 YOUR-USER-NAME は自分の Docker ID に置き換えます。

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

    docker tag コマンドについて学ぶには docker tag を御覧ください。

  1. これでもう一度 push コマンドを試します。Docker Hub から値をコピーしている場合でも、先ほどイメージにタグを付けていたように、 tagname の文字を省略できます。タグを指定しなければ、 Docker は latest (最新)と呼ばれるタグを使います。

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

新しいイメージを実行

現在、イメージは構築が終わり、レジストリに送信しました。まだコンテナイメージを扱っていない、真っさらなインスタンス(訳者注:Play widh Docker 環境上の仮想マシン)を使ってアプリを実行しましょう! ここでは、 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 を開きます。

  1. Login をクリックし、ドロップダウン リストから docker を選びます。

  1. 自分の Docker Hub アカウントで接続します。

  1. ログインしたら、左サイドバー上にある ADD NEW INSTANCE (新しいインスタンスの追加)をクリックします。もしも表示さなければ、ブラウザの表示幅を少し広くしてください。数秒しますと、ブラウザ内にターミナル画面が開きます。

    Play with Docker と新しいインスタンス
  1. ターミナル内で、先ほど送信したアプリを起動します。

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

    画面ではイメージを取得して、最終的には起動するのが見えるでしょう!

Tip

このコマンドでは、ポートを割り当てて(ポートマッピング)バインドする IP アドレスが異なるのに気づくでしょう。これまでの docker run コマンドではホスト上の 127.0.0.1:3000 に対してポートを公開していました。ここでは 0.0.0.0 を使っています。 127.0.0.1 へのバインドとは、ループバック インターフェースに対してのみコンテナのポートを公開します。一方で 0.0.0.0 のバインドとは、ホスト上すべてのインターフェース上でコンテナのポートを公開しますので、これにより外の世界で利用可能になります。 ポート割り当て動作の仕組みに関する詳しい情報は ネットワーク機能 を御覧ください。

  1. 起動したら 3000 バッジをクリックしたら、変更を加えたアプリが表示されるでしょう。 もし 3000 バッジが表示されなければ、「 Open Port 」(ポートを開く)ボタンをクリックし、 3000 と入力します。

次のステップ

このセクションでは、イメージを共有するために、レジストリにイメージを送信する方法を学びました。それから真っさらなインスタンスに移動し、送信したばかりのイメージを実行できました。これが正に CI パイプラインと共通する部分です。パイプラインとはイメージを作成し、レジストリに送信し、プロダクション環境でイメージの最新版を利用できる場所です。

ここまで理解したところで、先ほどのセクションの最後で述べた部分に立ち戻りましょう。振り返れば、アプリの再起動時、todo リストのアイテムが全て消えました。これは明らかに良くないユーザ体験ですので、次は再起動してもデータが 保持(persist) できる方法を学びましょう。