Docker Quickstartを超意訳する Part 5

Docker Hubでイメージをシェアする

Part 4ではSwarmにアプリをデプロイした.
最後のPart 5ではイメージのシェアを行う.


Get Started, Part 5: Sharing Images on Docker Hub

https://docs.docker.com/get-started/part5/

もくじ

  • Prerequisites
  • Introduction
  • Setting Up Your Docker Hub Account
  • Creating and Pushing to a Docker Hub Repository
  • Conclusion

Prerequisites

https://docs.docker.com/get-started/part5/#prerequisites

  • Part 2でのアプリのコンテナ化ができていること.

Introduction

https://docs.docker.com/get-started/part5/#introduction
ここまでのパートではDocker Desktopを利用してアプリのコンテナ化(Part 2), Kubernetesでのデプロイ(Part 3), Swarmでのデプロイ(Part 4)を行ってきた.
このパートではコンテナアプリ開発の最後のステップであるimageのシェアを行う.
Docker Hubのようなレジストリを利用することで, imageのダウンロードと実行がどこでも簡単にできるようになる.

Setting Up Your Docker Hub Account

https://docs.docker.com/get-started/part5/#setting-up-your-docker-hub-account
まだDocker IDを持っていない場合は以下の手順に従うことでDocker Hubを利用したimageのシェアが可能になる.

1: ブラウザでDocker Hubの新規登録ページ https://hub.docker.com/signup を開く.

2: フォームを埋めて送信し, Docker IDを取得する.

3: ツールバーのDockerアイコンを押し, プルダウンメニューからSign In / Create Docker IDをクリックする.
プルダウン

取得したDocker IDとパスワードを入力してログインする.
ログイン

ログインに成功するとプルダウンメニューにusername: Sign outが表示される.
プルダウン

また, この手順の代わりにdocker loginでも同じことができる.

# Dockerレジストリにログイン
$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: uzimihsr
Password:
Login Succeeded

[追加]ログアウトはdocker logoutでできる.

# Dockerレジストリからログアウト
$ docker logout
Removing login credentials for https://index.docker.io/v1/

Creating and Pushing to a Docker Hub Repository

https://docs.docker.com/get-started/part5/#creating-and-pushing-to-a-docker-hub-repository
Docker HubのアカウントをDocker Desktopに紐付けることができたので, さっそくリポジトリを作成して掲示板アプリをシェアする.

1: ツールバーのDockerアイコンを押し, Repositories -> Create...と進む.
プルダウン

デフォルトブラウザでリポジトリ作成画面が開かれる.
リポジトリ作成画面

2: Name(リポジトリ名)にbulletinboardと入力し, 他の内容は初期状態のまま下部のCreateを押す.
リポジトリ作成画面

リポジトリが作成され, bulletinboardリポジトリの画面に遷移する.
リポジトリ作成画面

3: imageDocker Hubでシェアするためには, アップロードする前にDocker Hub上で管理するための名前をつける必要がある.
Docker Hub上でimageを識別する名前は基本的に<Docker Hub ID>/<Repository Name>:<tag>の形式を取る.
今回の掲示板アプリのimageであれば次のように名前をつける.

# imageを確認
$ docker image ls
REPOSITORY      TAG   IMAGE ID        CREATED       SIZE
bulletinboard   1.0   06f7fe6f1ca0    2 days ago    681MB
# ローカルにあるimage(bulletinboard:1.0)にDocker Hub用のタグ(uzimihsr/bulletinboard:1.0)を付け直す
$ docker image tag bulletinboard:1.0 uzimihsr/bulletinboard:1.0
# imageを再確認
$ docker image ls
REPOSITORY                TAG   IMAGE ID        CREATED       SIZE
bulletinboard             1.0   06f7fe6f1ca0    2 days ago    681MB
uzimihsr/bulletinboard    1.0   06f7fe6f1ca0    2 days ago    681MB

4: タグを付け直したimageDocker Hubにアップロード(push)する.

# image(uzimihsr/bulletinboard:1.0)をpush
$ docker image push uzimihsr/bulletinboard:1.0
The push refers to repository [docker.io/uzimihsr/bulletinboard]
0b4750593321: Pushed
3896ce266caf: Pushed
439a7da7954e: Pushed
f7d0b1f86348: Pushed
dd883cbb0cf7: Mounted from library/node
a3a3f69aebe8: Mounted from library/node
0da372da714b: Mounted from library/node
bf3841becf9d: Mounted from library/node
63866df00998: Mounted from library/node
2f9128310b77: Mounted from library/node
d9a5f9b8d5c2: Mounted from library/node
c01c63c6823d: Mounted from library/node
1.0: digest: sha256:339f47f51b574edbd94c981e8a58b0e019ba7451a8e83f44cca1cc32d3748d8b size: 2841

先程のbulletinboardリポジトリの画面をリロードするか, https://hub.docker.com/r/uzimihsr/bulletinboard/tags を開くと確かにimageがpushされていることを確認できる. また, デフォルトではリポジトリがpublicになっていることに注意.
リポジトリ画面

[追加]レジストリのimageを利用する例は旧記事にあるので, 今回は省略する.

Conclusion

https://docs.docker.com/get-started/part5/#conclusion
以上の手順によりDocker Hub上にimageをpushできたため, どこからでもこのimageを使えるようになった.
このimage(bulletinboard:1.0)をローカルに持っていないクラスタから今回作成したリポジトリのimageを指定すると, Dockerはこれを自動でダウンロードして使用してくれる.
このようにimageはどこでも利用することができ, さらにアプリに必要な依存関係はimageの中で完結するため,
マシンにDockerとオーケストレーター(kubernetesまたはSwarm)さえインストールすればどんなコンテナアプリでも動かすことができる.

また, 今回はimageDocker Hubにpushしただけだが, imageの作成に使用したDockerfileやオーケストレーターでのコンテナの起動に使用するKubernetesYAMLファイル, Stackファイルについてはどうすれば良いのか?
それらのファイルはバージョン管理システム(Gitなど)でソースコードと一緒に管理し, そのリポジトリが簡単に参照できるようDocker Hubリポジトリの説明欄にリンクを貼り, imageのビルド手順を残し, アプリ利用方法がわかるようにしておくのがベストプラクティスである.


感想

ここまで5つのパートを読んでみて, なんとなくで済ませていたDockerコンテナの扱いについてちょっとは理解が深まった気がする.
特にレジストリを使ってimageが共有できるのは素晴らしいと思った.
Kubernetesについても(ほんとに一部のリソースだけだが)触れられて良かった.
Swarmについてはなんか公式でもKubernetesに切り替えている感がドキュメントからも伝わってきたけど,
旧Get Startedでも触ったように実際のマシンでも簡単にクラスタ構築ができるのは便利だとは思う…
でも最近はKubernetesも環境構築が簡単になってきているみたいなので, やっぱりお察し.
というわけで次はKubernetesの公式ドキュメントで入門に良さそうなものがあったらまた読んでみたい.