Dockerを体験してみるハンズオン Part2

[Part1](http://qiita.com/NewGyu/items/24290b79ecb606785edc)の続きです。

前回はdockerをとりあえず動かして見ようぜということを書いたのですが、今回は寄り細かい動作原理的なことにフォーカスします。

ここで使用しているソースコードはこちらに格納してあります。
https://github.com/NewGyu/docker-demo
[readme.md](https://github.com/NewGyu/docker-demo/blob/master/readme.md)にもある程度のことを書いてあるので参考にしてください。

## Dockerイメージの管理

### イメージとコンテナ

まず用語の整理です。

|用語   |意味              |
|------|------------------|
|イメージ|オブジェクト指向で言うクラス。イメージを元にして具体化されたコンテナが生成される|
|コンテナ|イメージから作られた実行プロセス|

[前回、以下のようなコマンドでコンテナを実行した](http://qiita.com/NewGyu/items/24290b79ecb606785edc#%E3%82%82%E3%81%86%E4%B8%80%E5%BA%A6%E5%8B%95%E3%81%8B%E3%81%97%E3%81%A6%E7%A2%BA%E8%AA%8D)かと思います。

```shell-session
$ docker run -d -p 80:80 newgyu/docker-sample:1.0.0
```

これは```newgyu/docker-sample:1.0.0```という名前のイメージを元にしてコンテナを作って実行するという意味になります。

### DockerHub

さて、```newgyu/docker-sample:1.0.0```という名前のイメージは一体どこにあるのでしょう？
その答えはDockerHubというDockerが運営するサービス上にあります。
https://hub.docker.com/r/newgyu/docker-sample/tags/

これは私が事前に``docker build``でイメージを作成し、``docker push``でDockerHubにイメージをアップロードしたものです。

build,pushの話はまた別の機会にしたいと思いますので今回はコマンドリファレンスだけ示しておきます。
* https://docs.docker.com/reference/commandline/build/
* https://docs.docker.com/reference/commandline/push/

### docker pull

DockerHub周りの概念はgitに影響を受けています。``docker pull``は``git pull``と同じようにリモートリポジトリからローカルリポジトリに持ってくるということをします。

pullする前に``docker images``を実行してみましょう。ローカルリポジトリにあるイメージを一覧出来ます。

```shell-session
$ docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
newgyu/docker-sample   1.0.0               38a291398a18        31 hours ago        640.9 MB
```

Part1を実施した後であれば``newgyu/docker-sample:1.0.0``というイメージがローカルリポジトリにすでに入っていると思います。

次のようにコマンドを実行してみましょう。

```shell-session
$ docker pull busybox
latest: Pulling from busybox

bf0f46991aed: Pull complete 
3d5bcd78e074: Pull complete 

Digest: sha256:5551dbdfc48d66734d0f01cafee0952cb6e8eeecd1e2492240bf2fd9640c2279
Status: Downloaded newer image for busybox:latest

$ docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
newgyu/docker-sample   1.0.0               38a291398a18        31 hours ago        640.9 MB
busybox                latest              3d5bcd78e074        5 days ago          1.113 MB
```

これによって[busybox](https://hub.docker.com/_/busybox/)というごく小さなdockerイメージをpullしてきます。ローカルリポジトリに追加されましたね。

### docker runで指定したイメージは勝手にpullされる

さて、Part1の手順では``docker pull``はしていません。なぜローカルリポジトリに```newgyu/docker-sample:1.0.0```という名前のイメージがあるのでしょうか？

[Part1で初めて``docker run``した時](http://qiita.com/NewGyu/items/24290b79ecb606785edc#2-%E3%83%87%E3%83%A2%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%82%92%E5%8B%95%E3%81%8B%E3%81%99)のコンソール出力を振り返ってみましょう。

```shell-session
Unable to find image 'newgyu/docker-sample:1.0.0' locally
1.0.0: Pulling from newgyu/docker-sample
e2a4fb18da48: Pulling fs layer 
58016a5acc80: Pulling fs layer 
　:
Digest: sha256:3137e6df67b07bd3f19ec08bdec7c9049a50a07900a45d1f2febfe9b256822a3
Status: Downloaded newer image for newgyu/docker-sample:1.0.0
```

pullした時と同じような出力でしたね。
``docker run``は、ローカルにリポジトリに対象のイメージがなければ勝手にpullしてくるのでした。


と、言うことで

* DockerイメージはDockerHubに置かれている
* runやpullでローカルリポジトリに持ってきて使う

ということでした。

## プライベートリモートリポジトリ

> * DockerイメージはDockerHubに置かれている

「弊社独自のイメージをDockerHubで皆さんに公開するわけにはいかん！」という企業は多いと思います。
会社業務で作ったシステムをGithubに上げられないのと同じ悩みですね。
（実は[DockerHub enterprise](https://hub.docker.com/enterprise/)というものがあるのですが、ここではそれは置いておきます）

GitのプライベートリモートリポジトリをGitlabなどで構築するように、Dockerにもプライベートリモートリポジトリを構築できるものがあります。

これは``docker build``,``docker push``する過程で扱わないと使い方がよくわからないと思うので今回はリンクを示すだけにして、また別途書きたいと思います。

See: 
* http://dev.classmethod.jp/cloud/docker-registry-recipes/
* https://hub.docker.com/_/registry/

----

今日はここまで。 また今度Part3を書きます。