DockerをMacに入れてみた時のメモ

## はじめに
最近注目されているにもかかわらず、使ったことがない`Docker`をMacに入れてみました。
その過程をメモに残しておきます。

最後にSSH接続しようと思って断念してますので、この記事はあまり役に立たないと思います。

上級者の方が見て、素人はここではまるんだなぁ・・・と思っていただければと思います。（笑）

## よくわらないけど入れてみる
とりあえず、文献を読むと。

* VirtualBox
* HomeBrew

があればできると書かれている。
[この記事](http://qiita.com/syou007/items/70006424d66e3f41152d)を書く際にどっちも入れているので早速やってみる。

```sh
$ brew install docker boot2docker
```

`boot2docker`がコンテナを支えるためのVMを管理しているっぽい。
で、`Docker`がそのコンテナに対してアクセスできるっぽい。

よくわからないので突き進めてみる。

```sh
$ boot2docker
Usage: boot2docker [<options>] {help|init|up|ssh|save|down|poweroff|reset|restart|config|status|info|ip|shellinit|delete|download|upgrade|version} [<args>]
$ docker -v
Docker version 1.8.1, build d12ea79h
```

とりあえず入った事は確認できた。
VMを入れてみる。

```sh
$ boot2docker init

  WARNING: The 'boot2docker' command line interface is officially deprecated.

  Please switch to Docker Machine (https://docs.docker.com/machine/) ASAP.

  Docker Toolbox (https://docker.com/toolbox) is the recommended install method.

Latest release for github.com/boot2docker/boot2docker is v1.9.1
Downloading boot2docker ISO image...
Success: downloaded https://github.com/boot2docker/boot2docker/releases/download/v1.9.1/boot2docker.iso
	to /Users/****/.boot2docker/boot2docker.iso
Generating public/private rsa key pair.
Your identification has been saved in /Users/****/.ssh/id_boot2docker.
Your public key has been saved in /Users/****/.ssh/id_boot2docker.pub.
The key fingerprint is:
80:98:1b:22:41:a3:a2:d5:c9:60:88:9d:8d:c0:c5:c2 ***.local
The key's randomart image is:
+--[ RSA 2048]----+
|B*==             |
|+E=B.o           |
|= * = .          |
|+o o   .         |
|. .     S        |
|                 |
|                 |
|                 |
|                 |
+-----------------+
Initialization of virtual machine "boot2docker-vm" complete.
```

ウダウダと何か出てきたが、一番きになるのは`The 'boot2docker' command line interface is officially deprecated.`のメッセージ。
非推奨なだけで使えない事は無いと思うので、ここでは一旦気にしない。

## よくわからないけど起動してみる

そのままVM立ち上げます。

```sh
$ boot2docker up

  WARNING: The 'boot2docker' command line interface is officially deprecated.

  Please switch to Docker Machine (https://docs.docker.com/machine/) ASAP.

  Docker Toolbox (https://docker.com/toolbox) is the recommended install method.

Waiting for VM and Docker daemon to start...
........................ooooooooooooo
Started.
Writing /Users/****/.boot2docker/certs/boot2docker-vm/ca.pem
Writing /Users/****/.boot2docker/certs/boot2docker-vm/cert.pem
Writing /Users/****/.boot2docker/certs/boot2docker-vm/key.pem

To connect the Docker client to the Docker daemon, please set:
    export DOCKER_HOST=tcp://192.168.59.103:2376
    export DOCKER_CERT_PATH=/Users/****/.boot2docker/certs/boot2docker-vm
    export DOCKER_TLS_VERIFY=1

Or run: `eval "$(boot2docker shellinit)"`
```

ここでも`deprecated`が出ているけど、今はまだ無視。
最後に設定をしろと言われているので、設定。

```sh
$ vi ~/.bash_profile 
# 一番最後に設定
eval "$(boot2docker shellinit)"
# 反映
$ soruce ~/.bash_profile 
```

IPアドレスの確認

```sh
$ boot2docker ip
192.168.59.103
```

起動の確認

```sh
$ boot2docker status
```

Dockerの中身を見てみる

```sh
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```

何もない。

イメージもみてみる。

```sh
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
```

何もない。

止めてみる。

```sh
$ boot2docker stop
```

## docker-machineを入れてみる
非推奨の`boot2docker`を使い続けるのも・・・と思って調べて見ると`docker-machine`を使えば良い事を知ったのでこっちを入れてみる。

```sh
$ brew install docker-machine
```

入った事を確認

```sh
$ docker-machine -v
docker-machine version 0.4.1 (HEAD)
```

VMも入れてみる。

```sh
$ docker-machine create --driver virtualbox dev
Creating CA: /Users/****/.docker/machine/certs/ca.pem
Creating client certificate: /Users/****/.docker/machine/certs/cert.pem
Image cache does not exist, creating it at /Users/****/.docker/machine/cache...
No default boot2docker iso found locally, downloading the latest release...
Downloading https://github.com/boot2docker/boot2docker/releases/download/v1.9.1/boot2docker.iso to /Users/****/.docker/machine/cache/boot2docker.iso...
Creating VirtualBox VM...
Creating SSH key...
Starting VirtualBox VM...
Starting VM...
To see how to connect Docker to this machine, run: docker-machine env dev
```

言われるままにコマンドを叩く

```sh
$ docker-machine env dev
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/Users/****/.docker/machine/machines/dev"
export DOCKER_MACHINE_NAME="dev"
# Run this command to configure your shell: 
# eval "$(docker-machine env dev)"
```

言われるままに設定する。

```sh
$ vi ~/.bash_profile 
# 一番最後に設定
eval "$(docker-machine env dev)"
# 反映
$ soruce ~/.bash_profile 
```

IPアドレスの確認

```sh
$ docker-machine ip dev
192.168.99.100
```

VMの確認

```sh
$ docker-machine ls
NAME   ACTIVE   DRIVER       STATE     URL                         SWARM
dev    *        virtualbox   Running   tcp://192.168.99.100:2376   
```

なんかいる。
VMに入ってみる。

```
$ docker-machine ssh dev
                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/
 _                 _   ____     _            _
| |__   ___   ___ | |_|___ \ __| | ___   ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__|   <  __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
$ exit
```

入れた事を確認して出る。

## イメージを入れてみる

```sh
$ docker run hello-world
```

存在しないイメージを指定すると、、、勝手にダウンロードしてくれた。

```sh
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
hello-world         latest              0a6ba66e537a        7 weeks ago         960 B
```

`ubuntu`を試しに探してみる。

```sh
$ docker search ubuntu
NAME                             DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
ubuntu                           Ubuntu is a Debian-based Linux operating s...   2761      [OK]       
ubuntu-upstart                   Upstart is an event-based replacement for ...   48        [OK]       
...
```

いろいろ出てくる。
検索できる事を確認して`centos`の最新バージョンを入れてみる。
終わったら`Hello World`を出力してもらう。

```sh
$ docker run centos:latest echo "Hello World"
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos
fa5be2806d4c: Pull complete 
0cd86ce0a197: Pull complete 
e9407f1d4b65: Pull complete 
c9853740aa05: Pull complete 
e9fa5d3a0d0e: Pull complete 
Digest: sha256:c96eeb93f2590858b9e1396e808d817fa0ba4076c68b59395445cb957b524408
Status: Downloaded newer image for centos:latest
Hello World
```

イメージ確認

```sh
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
hello-world         latest              0a6ba66e537a        7 weeks ago         960 B
centos              latest              e9fa5d3a0d0e        7 weeks ago         172.3 MB
```

いる！

## 消してみる（失敗）

不要なイメージを消してみる。

```sh
$ docker rmi hello-world
Error response from daemon: conflict: unable to remove repository reference "hello-world" (must force) - container abb2146a2881 is using its referenced image 0a6ba66e537a
```

消えない・・・
あ、イメージIDを指定するのか・・・

```sh
$ docker rmi 0a6ba66e537a
Error response from daemon: conflict: unable to delete 0a6ba66e537a (must be forced) - image is being used by stopped container abb2146a2881
Error: failed to remove images: [0a6ba66e537a]
```

止めないとダメ・・・？

```sh
$ docker stop hello-world
Error response from daemon: no such id: hello-world
$ docker stop 0a6ba66e537a
Error response from daemon: no such id: 0a6ba66e537a
Error: failed to stop containers: [0a6ba66e537a]
```

状況を見ると。。。

```sh
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
<none>              <none>              0a6ba66e537a        7 weeks ago         960 B
centos              latest              e9fa5d3a0d0e        7 weeks ago         172.3 MB
```

なんか不思議な状況に・・・

```sh
$ docker ps -a
CONTAINER ID        IMAGE                                                              COMMAND                CREATED             STATUS                   PORTS               NAMES
38f47d2577f6        centos:latest                                                      "echo 'Hello World'"   3 hours ago         Exited (0) 3 hours ago                       mad_poitras
abb2146a2881        0a6ba66e537a53a5ea94f7c6a99c534c6adb12e3ed09326d4bf3b38f7c3ba4e7   "/hello"               3 hours ago         Exited (0) 3 hours ago                       adoring_swartz
```

指定するものがまちがっているっぽい。
`NAMES`のカラムの値を設定。

```sh
$ docker stats mad_poitras
CONTAINER           CPU %               MEM USAGE/LIMIT     MEM %               NET I/O
mad_poitras         0.00%               0 B/0 B             0.00%               0 B/0 B
```

おぉ・・・見ずらい。。。

```sh
$ docker rm mad_poitras
mad_poitras
```

お？

```sh
$ docker ps -a
CONTAINER ID        IMAGE                                                              COMMAND             CREATED             STATUS                   PORTS               NAMES
abb2146a2881        0a6ba66e537a53a5ea94f7c6a99c534c6adb12e3ed09326d4bf3b38f7c3ba4e7   "/hello"            3 hours ago         Exited (0) 3 hours ago                       adoring_swartz
```

消えた？

```sh
$ docker rmi 0a6ba66e537a
Error response from daemon: conflict: unable to delete 0a6ba66e537a (must be forced) - image is being used by stopped container abb2146a2881
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
<none>              <none>              0a6ba66e537a        7 weeks ago         960 B
centos              latest              e9fa5d3a0d0e        7 weeks ago         172.3 MB
```

削除はまたあとで実験してみる。

## イメージに入ってみる
起動させる。
イメージを実行

```sh
$ docker run -itd centos:latest /bin/bash
6d9f7dae6d915c5eab5a256014466c2961330fabba47124b1fb738ac2b911669

$ docker ps -a
CONTAINER ID        IMAGE                                                              COMMAND             CREATED             STATUS                   PORTS               NAMES
6d9f7dae6d91        centos:latest                                                      "/bin/bash"         6 seconds ago       Up 5 seconds                                 naughty_payne
abb2146a2881        0a6ba66e537a53a5ea94f7c6a99c534c6adb12e3ed09326d4bf3b38f7c3ba4e7   "/hello"            3 hours ago         Exited (0) 3 hours ago                       adoring_swartz

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
<none>              <none>              0a6ba66e537a        7 weeks ago         960 B
centos              latest              e9fa5d3a0d0e        7 weeks ago         172.3 MB
```

あ、なるほど。
`image`を実態化させた状態がコンテナで`ps`で見れるんだ！
（今更ですが・・・）

とりあえず、入り込む

```sh
$ docker attach naughty_payne
```

ん？
動かない。。。Enterを押してみると

```sh
[root@6d9f7dae6d91 /]#
```

入れたっぽい。

```sh
[root@6d9f7dae6d91 /]# exit
$ docker ps -a
CONTAINER ID        IMAGE                                                              COMMAND             CREATED             STATUS                     PORTS               NAMES
6d9f7dae6d91        centos:latest                                                      "/bin/bash"         4 minutes ago       Exited (0) 6 seconds ago                       naughty_payne
abb2146a2881        0a6ba66e537a53a5ea94f7c6a99c534c6adb12e3ed09326d4bf3b38f7c3ba4e7   "/hello"            3 hours ago         Exited (0) 3 hours ago                         adoring_swartz
```

抜けると止まってる。

## 削除続き
なんとなくわかってきたので、hello worldを消してみる続きを行う。

```sh
$ docker stop adoring_swartz
adoring_swartz

$ docker rm adoring_swartz
adoring_swartz

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
<none>              <none>              0a6ba66e537a        7 weeks ago         960 B
centos              latest              e9fa5d3a0d0e        7 weeks ago         172.3 MB

$ docker rmi 0a6ba66e537a
Deleted: 0a6ba66e537a53a5ea94f7c6a99c534c6adb12e3ed09326d4bf3b38f7c3ba4e7
Deleted: b901d36b6f2fd759c362819c595301ca981622654e7ea8a1aac893fbd2740b4c

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
centos              latest              e9fa5d3a0d0e        7 weeks ago         172.3 MB
```

消せた！
コンテナがある場合はイメージが消せない。
当たり前といえば当たり前だけど、、、僕はこれだけ苦戦した事でやっと意味がわかった。

## 先ほど終了したコンテナを再起動したりコンテナを増やしてみる
だんだん理解してきた。

```sh
$ docker start naughty_payne
$ docker attach naughty_payne
[Enter]
```

これでコンテナを起動して入れるのか。
もう一つコンテナを増やしてみる。

```sh
$ docker run -itd centos:latest /bin/bash
070984ac1cb806085e4cf19a98660779e07b0b0881af0517266d92eca3e2a463

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                          PORTS               NAMES
070984ac1cb8        centos:latest       "/bin/bash"         6 seconds ago       Up 6 seconds                                        big_kowalevski
6d9f7dae6d91        centos:latest       "/bin/bash"         15 minutes ago      Exited (0) About a minute ago                       naughty_payne
```

中に入って、ファイルを作成してみる。

```
$ docker attach big_kowalevski
$ touch test
$ ll
...
-rw-r--r--   1 root root    0 Dec  4 06:04 test
...
```

作成したファイルがある事を確認する。

```sh
$ docker start big_kowalevski
$ docker attach big_kowalevski
$ ll
...
-rw-r--r--   1 root root    0 Dec  4 06:04 test
...
```

ある。
けど毎回コンテナを起動するの面倒だな・・・
もう一個のコンテナに存在するかみてみる。

```sh
$ docker start naughty_payne
$ docker attach naughty_payne
$ ll
...
```

コンテナが違うので、もちろん存在しなかった。

## SSHでDockerに接続してみる(失敗)
気を取り直して、新しいイメージを取ってきてSSHで接続してみる。

```sh
$ docker pull dhrp/sshd
$ docker run -d -p 22 dhrp/sshd /usr/sbin/sshd -D

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
centos              latest              e9fa5d3a0d0e        7 weeks ago         172.3 MB
dhrp/sshd           latest              2bbfe079a942        2 years ago         321.8 MB

$ docker ps
CONTAINER ID        IMAGE               COMMAND               CREATED             STATUS              PORTS                   NAMES
d8072ab1aef9        dhrp/sshd           "/usr/sbin/sshd -D"   27 seconds ago      Up 27 seconds       0.0.0.0:32768->22/tcp   boring_chandrasekhar
```

どうでもいいけど、、この名前ってどうやって決まってるんだろうか・・・？
SSHで接続してみる。

```sh
$ ssh 127.0.0.1 -p 32768
ssh: connect to host 127.0.0.1 port 32768: Connection refused
```

ん？？

```sh
docker attach boring_chandrasekhar
```

ん？？
返答がない・・・。

```sh
$ docker stop boring_chandrasekhar
```

他のコンソールからストップさせてやっと止まった。

[MacOSXからDockerコンテナへのssh接続ではまったところ](http://qiita.com/kochizufan/items/c6c1b12748a4e08fde3f)

同じように困っている人発見！
で、、、入れるようになったけどパスワードがわからない・・・。

コンテナイメージのコミット・・・？
うーん。
今日はここまで。（って、しばらく触らないきがするけど・・・）

## 感想
Vagrantよりはるかに敷居が高い・・・。
慣れてないせいかもしれないけど、結局業務で使えるレベルまで把握できなかった・・・。

実験的に環境を構築したりするためには使えるかもしれないけど、、、`chef`の実験とかを考えるとVagrantのほうが簡単にできる。

## 参考
* [はじめてのDocker on Mac OS X](http://dev.classmethod.jp/tool/docker/getting-started-docker-on-osx/)
* [Docker でフロントエンド開発も楽できるか?(前編)](http://pydiary.bitbucket.org/blog/html/2015/01/12/diary.html)
* [boot2dockerからdocker-machineに変えた話](http://qiita.com/kohey18/items/b7e48ad70f97680041e5)
* [Dockerで立てたコンテナにsshで接続する](http://blog.shibayu36.org/entry/2013/12/07/233510)