アプリケーションの共有

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

注釈

Docker ID

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

リポジトリ作成

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

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

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

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

    注釈

    プライベート リポジトリ

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

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

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

Docker コマンドの push 例

イメージを :ruby:`送信 <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 を実行しても、該当するイメージは見つからないでしょう。

    修正するには、現在の構築済みイメージに付いている「 :ruby:`タグ <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 リストのアイテムが全て消えました。これは明らかに良くないユーザ体験ですので、次は再起動してもデータが :ruby:`保持 <persist>` できる方法を学びましょう。