Docker 再入門3 2016

# 背景
ここは前回 [Docker 再入門2 2016](http://qiita.com/ohhara_shiojiri/items/31a76913cbfdd9d2fe13) の続きになります。
最初のインストール方法は前々回 [Docker 再入門1 2016](http://qiita.com/ohhara_shiojiri/items/98573b074185381d46c8) の記事で紹介してます。また基本的なコマンド例は以下のSlideShareの資料を参考にしてください。
2014年のSlideShare資料のupdateとしての再入門は今回で最後です。

# Docker入門(再掲)
基本的なDockerの仕組みは変わらないので、入門知識は地元で実施したDocker勉強会の過去資料を考慮した前提で紹介します。情報が古いですがdockerコマンドの使い方とか基本的なことは過去資料を参照してください。

[Docker 入門](http://www.slideshare.net/ShinichiroOhhara/docker-39456836) (SlideShare)

# 動作環境(再掲)
- ThinkPad X200s OS:Linux MINT 18
- ThinkPad X1 Carbon OS:Windows 10 Pro (Hyper-V)

個人的に開発環境のOSはLinuxなので、MacOSやWindowsについては優先度が低いのでご了承ください。

# レジストリ
Dockerのイメージ管理方法としてレジストリがあります。レジストリに登録されたイメージがリポジトリになります。
前回のローカル環境へのイメージ登録もローカルレジストリへのリポジトリ登録になります。
公式のイメージが管理されているDocker Hub以外にもレジストリにはいくつか種類があります。
ここでは標準で利用出来るDocker Hubについて紹介します。

## Docker Hub
コンテナのベースとなるLinuxディストリビューションのイメージなどが管理されているDocker hubには、自分の作成したイメージもリポジトリとして登録する事が出来ます。
一般公開されるパブリックなリポジトリの場合には制限はありませんが、限定されたプライベートなリポジトリの場合には１つだけ無料で利用出来ます。複数のプライベートリポジトリを管理する場合には課金が必要です。
公式サイトでアカウントを作成しましょう。

[Docker Hub](https://hub.docker.com)(docker.com)

コマンドでDocker Hubへログインします。

```
$ 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: user_name
Password:
Login Succeeded
```

ログインするとdocker infoコマンドにUsernameが表示されます。ただしDocker for Windowsの場合は表示されませんでした。

### リポジトリの検索
パブリックで一般公開されているリポジトリを検索する事が出来ます。

```
$ docker search ubuntu --limit 5
NAME                     DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
ubuntu                   Ubuntu is a Debian-based Linux operating s...   4915      [OK]
ubuntu-upstart           Upstart is an event-based replacement for ...   67        [OK]
rastasheep/ubuntu-sshd   Dockerized SSH service, built on top of of...   47                   [OK]
ubuntu-debootstrap       debootstrap --variant=minbase --components...   28        [OK]
nuagebec/ubuntu          Simple always updated Ubuntu docker images...   9                    [OK]
```

ここでは、ubuntuで５件まで検索した結果です。
OFFICIALが[OK]のリポジトリが公式イメージです。

### リポジトリの登録
自分で作成したイメージをDocker Hubに登録してみましょう。
Docker Hubのレジストリ管理側で必要なリポジトリを作成する必要がありますので、Docker Hubのサイト管理画面から新規リポジトリを作成します。

ダッシュボード画面のCreate Repositotyから作成します。
- namespaceは通常は自分のアカウントを選択
- repository nameはリポジトリ名でdocker pushコマンドで指定します。
- short descriptionは簡単な説明
- full descriptionは詳細な説明
- Visibiliyuが公開範囲で、パブリックかプライベートを選択します。

次にDocker Hubに登録するイメージを作成します。
前回、ubuntuにnginxを入れたコンテナが残っていますので、これを利用してみます。
現在のコンテナ状態を表示します。

```
$ docker ps -l
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                    PORTS               NAMES
ABC123456789        nginx/ubuntu:1.0    "/bin/sh -c '/usr/sbi"   22 hours ago        Exited (0) 22 hours ago                       clever_noyce
```

アカウント名とリポジトリ名を指定するため、前回Dockerfileで作成されたリポジトリではDocker Hubには登録できないので、残っている現在のコンテナから再度Docker Hub登録用イメージを作成します。
ちなみにDockerfileから再ビルドしても出来ますが、ここでは冗長な再ビルドはせず、既にあるコンテナを再利用します。

```
$ docker commit ABC123456789 user_name/repository_name
```

少々待つとイメージが作成されますので、確認してみます。

```
$ docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
user_name/repository_name   latest              123456789ABC        17 seconds ago      223.1 MB
nginx/ubuntu                1.0                 123456789ABC        19 minutes ago      223.1 MB
ubuntu                      latest              123456789ABC        10 days ago         127.2 MB
hello-world                 latest              123456789ABC        3 months ago        1.848 kB
```

それでは早速ローカルレジストリにあるイメージをDocker Hubに登録してみましょう。
docker pushコマンドでDocker Hubのアカウント名とリポジトリ名をスラッシュで区切って指定します。
この時、docker loginにてDocker Hubにログイン済みである必要があります。

```
$ docker push user_name/repository_name
The push refers to a repository [docker.io/user_name/repository_name]
2f54979f341b: Pushed 
ca560b3e1ef9: Pushed 
0c5e1b765314: Pushed 
0e20f4f8a593: Mounted from library/ubuntu 
1633f88f8c9f: Mounted from library/ubuntu 
46c98490f575: Mounted from library/ubuntu 
8ba4b4ea187c: Mounted from library/ubuntu 
c854e44a1a5a: Mounted from library/ubuntu 
latest: digest: 
```

また少々待つとDocker Hubに登録出来ると思います。
Docker Hubの管理画面で確認してみてください。PULLSの数字が増えていると思います。

### リポジトリの動作確認
さて、実際にDocker Hubに登録したイメージが同じように動作するか確認してみましょう。
その前に現在ローカルレジストリに登録されているリポジトリを先に削除します。

```
$ docker rmi user_name/repository_name
```

これでローカルリポジトリにはイメージが無い状態になります。
次にDocker Hubに登録したリポジトリを指定して直接コンテナを起動します。

```
$ docker run -d -p 80:80 user_name/repository_name
```

コマンド実行すると、Docker Hubから該当するリポジトリをローカルレジストリにダウンロードして、コンテナの実行まで自動的に行われます。確認してみましょう。

```
$ curl localhost:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
```

```
$ docker ps
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                NAMES
abc123456789        user_name/repository_name    "/bin/sh -c '/usr/sbi"   14 seconds ago      Up 13 seconds       0.0.0.0:80->80/tcp   thirsty_goldstine
```

```
$ docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
user_name/repository_name   latest              123456789ABC        About an hour ago   223.1 MB
nginx/ubuntu                1.0                 123456789ABC        19 minutes ago      223.1 MB
ubuntu                      latest              123456789ABC        10 days ago         127.2 MB
hello-world                 latest              123456789ABC        3 months ago        1.848 kB
```

この様にDocker Hubを利用することで、自分が作成したコンテナのイメージを他の環境で共有する事が出来ます。
パブリックで一般公開したり、プライベートでチーム開発に共有したりと利用します。
個人開発で他と共同作業しない場合だとDockerfileとローカルレジストリで十分かも知れませんが。