アプリケーションの共有
ここまでにイメージをビルドしたので、それを共有していきます。 Docker イメージを共有するためには Docker レジストリを利用することになります。 デフォルトのリポジトリは Docker Hub です。 これはここまでに利用してきたイメージがすべて収容されている場所です。
Docker ID
Docker ID は Docker Hub にアクセスするためのものです。 Docker Hub は世界でも最大規模を誇るコンテナーイメージのライブラリおよびコミュニティです。 無料の Docker ID をまだ取得していない場合は、作成しておいてください。
リポジトリの生成
イメージをプッシュするためには、あらかじめ Docker Hub 上にリポジトリを生成しておくことが必要です。
- Docker Hub に サインアップ またはサインインします。 
- Create Repository (リポジトリ生成) ボタンをクリックします。 
- リポジトリ名は - getting-startedとします。 Visibility は Public とします。
- Create (生成) をクリックします。 
以下の画像から、Docker Hub が示す Docker コマンドを見ることができます。 このコマンドはリポジトリへのプッシュを行うものです。
 

イメージのプッシュ
Docker Hub にイメージをプッシュしていきます。
- コマンドラインから以下を実行します。 - docker push docker/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 は - docker/getting startedという名前のイメージを探します。 しかし今あるローカルイメージの名前は、まだ- getting-startedです。- これを確認するために以下を実行します。 - docker image ls
- これを解決するには、まず - docker login YOUR-USER-NAMEを実行して、ご自身の Docker ID を使った Docker Hub へのサインインを行います。
- docker tagコマンドを実行して- getting-startedイメージに対して新たな名前を設定します。- YOUR-USER-NAMEの部分は利用している Docker ID に置き換えてください。- $ docker tag getting-started YOUR-USER-NAME/getting-started
- そこでもう一度 - 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 ではマルチプラットフォームのビルドをサポートしています。 詳しくは マルチプラットフォームイメージ を参照してください。
- ブラウザーを開いて Play with Docker にアクセスします。 
- Login (ログイン) をクリックして、ドロップダウンリストの中から docker を選びます。 
- Docker Hub アカウントを使ってサインインし、Start をクリックします。 
- 左サイドバーにある ADD NEW INSTANCE (新規インスタンスの追加) オプションをクリックします。 オプションが見えない場合は、ブラウザーを広げてみてください。 しばらくしてブラウザー上に端末ウィンドウが開きます。    
- 端末ウィンドウにて、プッシュしたばかりのアプリを起動します。 - $ 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へのバインディングは、コンテナーのポートが全インターフェースにバインドすることができます。 この場合は外部への接続が可能となります。- ポートマッピングが動作する様子に関しての詳細は ネットワーク処理 を参照してください。 
- 3000 バッジが現れるのでクリックします。 - 3000 バッジが現れなかった場合は、Open Port をクリックして - 3000を指定してください。
まとめ
本節ではイメージを共有する方法として、レジストリにイメージをプッシュする方法を学びました。 そして新たなインスタンスを使って、プッシュしたばかりのイメージを実行しました。 CI パイプラインではごく普通のことであり、そこではイメージを生成しレジストリにプッシュします。 そして本番環境であればイメージの最新版を利用します。
関連情報
次のステップ
次節では、コンテナー化したアプリケーション内のデータを保存する方法について学びます。
DB への保存