こんにちは、Mashです。
本業でDockerを触る機会がありまして、自分の知識整理のためと、せっかくならということで初学者さんに向けて記事を作成しています。
今回はDocker入門第3回です。
前回記事で、オリジナルのDockerイメージを作成しました。
ただ、この時点ではカスタマイズしたイメージは自分のPC内に保存されているだけで、他の人が利用することができません。
ですので今回は、作成したオリジナルイメージをDocker Hubにアップロード(push)して、世界に向けて公開してみましょう。
- Dockerレジストリの概念を理解する
- 作成したイメージをDockerレジストリへアップロード(push)し、自分以外に共有できるようになる
※本シリーズはDocker初心者向けではありますが、前提として多少のLinux知識が必要となります。ご了承ください。
それではいきましょう!
Dockerイメージを公開するための仕組み
実機動作をご紹介する前に、まずはDockerイメージを自分以外に共有するための仕組みについて概要を理解しておきましょう。
Dockerレジストリ
まずは Dockerレジストリついて。
Dockerレジストリは、Dockerイメージを格納しておくためのサービスと理解していただければ良いかなと思います。
前回までの記事でDocker Hubからイメージをpullして動作確認をしましたが、このDocker HubはDocker社が公式運営しているDockerレジストリです。
他にはAWSでElastic Container Registry(ECR)というレジストリサービスが提供されていたり、自前で完全プライベートな独自レジストリを構築することもできます。
リポジトリ
つづいてはリポジトリです。
下手な例えで恐縮ですが、Dockerレジストリがマンションだとしたら、リポジトリはマンション内の各個室といったイメージです。
Docker HubにはUbuntuとかDebianとか、nginxといった様々なイメージが格納されています。
UbuntuイメージはUbuntu用の個室、DebianイメージはDebian用の個室 といった感じで別々のリポジトリに保存されていて、Docker利用者はリポジトリ名を指定してpullすることで、意図したイメージがダウンロードできるようになっています。

タグ
最後にタグです。
さきほど触れたとおり、各Dockerイメージはリポジトリに保存していきます。
が、例えばUbuntuでも16.04とか18.04とかバージョン管理して何世代か保持しておきたいときがあります。
そこで使用する概念がタグです
このように↓リポジトリ名のあとにコロン(:)をそえてタグを付与することで、特定バージョンのイメージを指定することができます。

$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 dfeff22e96ae 3 weeks ago 131MB
ubuntu latest d70eaf7277ea 3 weeks ago 72.9MB
ubuntu 18.04 56def654ec22 7 weeks ago 63.2MB
↑Ubuntuイメージがいくつもありますが、タグが異なるので別物のイメージとして扱われています。
タグの表記でよく見るのは、
- バージョン: 1.3.5
- ビルドした日付: 20201118-01
いった感じでしょうか。
なお、タグを指定しない場合は最新版(latest)のイメージを指定したことになります。
全体像
ここまでDockerレジストリ、リポジトリ、タグについてご説明しましたが言葉だけでは理解しづらいと思いますのでイメージ図にしてみました。

<リポジトリ名>:<タグ> の形式でイメージを取り扱うことがおわかりいただけるかと思います。
この知識はDockerイメージを共有(push)する際にも必要ですので、ここで習得しておきましょう!
イメージをDocker Hubへpushする
お待ちかね、実機確認パートです。
今回はDockerレジストリとしてDocker Hubを利用するため、アカウント作成方法からご紹介します。
また、作成するリポジトリはパブリック(全世界へ公開する設定)となりますので、作成したイメージ内に機密情報などは含めないようにご注意ください。
Docker Hubアカウントの作成
まずはDocker Hubのアカウントを作成します。
Docker Hubへアクセスし、Docker ID(アカウント名)、メールアドレス、パスワードを入力してサインアップします。

つづいてサポートプランを選択します。
有償プランにすることで、時間あたりのDockerイメージpull数制限を解除したり、チーム開発用のリポジトリを作成できたりします。
今回はお勉強用ですのでFreeプラン(無償)でいきましょう。

さきほど指定したメールアドレスに、登録確認メールが送信されます。

メーラーを覗いてみましょう。
私はスマホでメールを確認しています。

↓このように認証成功画面が表示されればOKです。

PCのWebブラウザに操作を戻し、Docker Hubにログインできればアカウント作成は無事完了です。
リポジトリの作成
Docker Hubへログインしたら、画面右上の [Repositories] – [Create Repository] をクリックします。

リポジトリの名前、リポジトリの説明書き、パブリック(公開)かプライベート(非公開)か を設定し、[Create]ボタンをクリックします。
今回はパブリックなリポジトリを作成しています。

すぐにリポジトリが作成できました。

上記の通り、実際にイメージをpushする場合は、
$ docker push <アカウント名>/<イメージ名>:<タグ>
という形式になります。
以上でリポジトリの準備ができました。
Dockerイメージをリポジトリへpush
それではDockerホストサーバのSSHコンソールに操作を戻して、イメージをリポジトリへpushしてみましょう。
前回記事までの作業で、PC上のイメージはこのようになっているかと思います。
# pushするDockerイメージを確認
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
custom_nginx latest 8d342664df72 9 seconds ago 196MB
debian latest ef05c61d5112 14 hours ago 114MB
「REPOSITORY」の記載にご注目ください。
今回は、以前作成した custom_nginx イメージをDocker Hubへpushしますが、さきほどご紹介したような
<アカウント名>/<イメージ名>
の形式になっていません。(前回実施したイメージをビルドした際のコマンドが適切ではなかったため)
また、タグも「latest」になっているので、バージョン管理のために日付をタグとして付与してみましょう。
リポジトリ名、タグの変更は docker tag コマンドを使用します。
# 「custom_nginx」のリポジトリ名を変更
$ docker tag custom_nginx mash4work/mash-nginx:20201118-01
# イメージ一覧を確認
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
custom_nginx latest 8d342664df72 23 minutes ago 196MB
mash4work/mash-nginx 20201118-01 8d342664df72 23 minutes ago 196MB
debian latest ef05c61d5112 14 hours ago 114MB
リポジトリ名とタグが変更できましたので、Docker Hubへイメージをpushしてみましょう。
# Dockerレジストリ(今回はDocker Hub)へログイン
# -u アカウント名 を指定します
$ docker login -u mash4work
Password:
(中略)
Login Succeeded
# オリジナルイメージをDocker Hubへアップロード
$ docker push mash4work/mash-nginx:20201118-01
The push refers to repository [docker.io/mash4work/mash-nginx]
(中略)
20201118-01: digest: sha256:fe6da735a1e6bbf99a47d822b75859341924f466740e7469789954ddde1982ac size: 1155
処理が終わったようなので、Webブラウザでリポジトリを覗いてみましょう。

イメージがpushできていますね!
これでこのDockerイメージは世界中の皆さんが利用可能な状態になりました。
みなさんのPCから、ぜひ下記コマンドでイメージpullしてみてください。(ただのnginxですが笑)
$ docker pull mash4work/mash-nginx:20201118-01
まとめ
以上、Dockerレジストリの概要とDockerイメージをレジストリにpushして共有する方法を学習しました。
これで自分で作成した便利なコンテナをチームメンバーや世界中のエンジニアに共有することができるようになりましたね。(必要に応じてプライベートリポジトリをつかってください)
ここまでDocker入門記事を読み進めていただいた方たちはこんなモヤモヤしたお気持ちかと思います。

nginxだけで完結するシステムなんてねぇよ。
はい。承知しております。
例えばWebシステムでは、Webサーバ、アプリケーションサーバ、DBサーバと役割ごとにサーバを構築します。
Dockerコンテナでも同じで、それぞれの役割をもったコンテナを動かす必要があります。
毎回毎回 docker run … なんてやってたら大変ですし、手作業が増えるぶんだけミスも増えます。
そんな課題を解決するのが Docker Compose という技術です。次回はこのDocker Composeについて学習します。
今回は以上です。
それじゃあまたね。