アプリケーションの共有
ここまでにイメージをビルドしたので、それを共有していきます。 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 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
を実行しても見当たらないはずです。これを解決するには、ビルド済みの既存イメージに対してタグづけを行って、別の名前を設定することが必要です。
コマンド
docker login -u YOUR-USER-NAME
を実行して 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 パイプラインではごく普通のことであり、そこではイメージを生成しレジストリにプッシュします。 そして本番環境であればイメージの最新版を利用します。
関連情報
次のステップ
次節では、コンテナー化したアプリケーション内のデータを保存する方法について学びます。