Docker for Windowsを使ってイメージをHubにプッシュする手 順（シリーズその３）

#dockerレポジトリとは？
レポジトリのコンセプトはGitのレポジトリに似ています。Gitにとっての「アプリケーション」がdockerにとっての「イメージ」で、Gitレポジトリを使ってアプリケーションのバージョン管理をする要領で、dockerレポジトリを使ってイメージのバージョン管理をする、という図式で理解できます。

#まずはレポジトリを作る
こんな感じで作ります。
![2017-06-19 18_25_27-Zoomit Zoom Window.png](https://qiita-image-store.s3.amazonaws.com/0/103139/f2bf1af5-b46c-66f8-d086-30355a6b029a.png)

出来ました。
![2017-06-19 18_25_54-Zoomit Zoom Window.png](https://qiita-image-store.s3.amazonaws.com/0/103139/dcd47f99-a772-c44c-4e97-98fd53321f7b.png)

イメージそのものはTagsのページに表示されます。作ったばかりなので中身は空っぽです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/103139/94ad7a5b-3f71-4747-a932-6aed8f9d9b78.png)

このページにイメージを表示されるようにプッシュする手順を以下に解説します。

#イメージの元になるコンテナを作成する
イメージをコンテナから生成します。細かい作成の手順は省略します。[Docker for WindowsでIISウェブサイトの開発環境を作る手順](http://qiita.com/yoshiwatanabe/items/a903f7855e8f1f014018) を参照してください。

プッシュしたいコンテナはこれです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/103139/5fc62a46-27d3-3ba4-2dd4-183d8e17bb59.png)

このコンテナのイメージは`microsoft/iis`ですね。これはコンテナのベースとして使ったイメージですが、Microsoftのオフィシャル・イメージですから、私がどうこう出来るものではありません。私個人のイメージを作成する必要があります。

ところでコンテナは"Hello World"的なWebアプリが設定されています。コンテナのIPをブラウザで表示すると、こんな感じのページが表示されるようになってます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/103139/9df3fd39-6fd3-6898-46a1-415af95741ff.png)

あと、今回は手作業で作ったコンテナを使用しますが、`dockerfile`を利用してスクリプトとして自動的に作成する方が好ましいとされています。

#コンテナからイメージを作成する
まず、コンテナが実行していないことを確認します。実行中なら、Ctrl+CやExitなどのコマンドでコンテナを終了してください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103139/9dc060c7-95dc-58da-9585-45856e41a02f.png)

実行していないことを確認します。

では次にイメージを作成します。`docker commit`コマンドを使用します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/103139/4be713ac-01a1-d9c1-7159-f38aca355d8a.png)

* commit コマンドにはコンテナのID（の一部でも良い）を渡します
* イメージの名前は「ユーザ名 / レポジトリ名」のパターンで指定します

`docker images`コマンドで作成されたばかりのイメージを確認します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/103139/f3874ed3-8219-41a8-9058-770a8116385b.png)

ちゃんと出来てますね。

#作成したイメージをDockerのHubにプッシュする
まず最初に、Dockerにログインします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/103139/499cf15e-1582-693c-79e0-901d3a754b6a.png)

次に、`docker push`でイメージをプッシュします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/103139/81e35977-b050-edf2-186a-32611cf1d4be.png)

完了しました。
Hubをブラウザで見てみましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103139/87fb9967-ed70-901c-fef8-d42b1da21502.png)

さっきまで空っぽだったTagsページに`latest`というタグが付けられたイメージがアップロードされているのが確認できます。

`docker search`でたった今アップロードしたイメージが出てくるか試してみましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/103139/2fc6a37f-8b01-8b38-f0b4-80f4ad74312d.png)

結果に出てきました。

#タグの名前を指定してプッシュしてみる
タグを明示的に指定しない場合、自動的に`latest`というタグが付けられます。
例えばテストが終了してイメージが安定していることが確認できたら、バージョンをタグとして指定してイメージをプッシュする、というのが一般的なパターンのようです。

イメージの名前のすぐあとにタグを明示的に指定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/103139/bf7e414e-b8ea-bc8a-9941-80ff971f1b2b.png)

ブラウザで見てみましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/103139/ffa57420-dd4a-8e9f-9db6-6cd0da67e4f2.png)

バージョン1.0のタグが付いたイメージがレポジトリに加えられたことが確認できます。

#まとめ
Docker Hubにアカウントを作成して、イメージをプッシュしてイメージのライブラリを作成・共有できます。もちろんこれはパブリックに公開されるので個人情報や企業秘密などが含まれないように注意しなくてはいけません。