Windows環境で、Boot2Dockerを利用して立ち上げたコンテナにrloginでアクセスするまで

## やったこと
少し前から話題のDockerというやつを、Windowsでも使ってみたくて実験しました。

Windows環境でDockerの実験をするために、[Boot2Docker](https://github.com/boot2docker/boot2docker)を使いました。これ自体はDockerコンテナを動かすためのLinuxディストリビューションという位置づけのようですが、Windows向けにVirtualboxを含むAll-in-oneインストーラが用意されているので、インストーラをインストールするだけで手軽に動作環境を構築できます。

## こまったこと
- 適当にぐぐればコンテナを動かすところまでは行くけれども、cmd.exe経由でシェルを操作するのはあまり快適ではない
- VirtualBox上のBoot2Docker上のコンテナにアクセスすることになるので、ネットワークがどうなっているのかイマイチ分からない

とりあえずboot2dockerとその上のコンテナにrloginでsshできるようになれば最低限の環境は整うのかな？ ということで手順を試行錯誤しました。（追記：結局コンテナに直接sshはしませんでした）

## boot2dockerへのログイン
boot2dockerのコンソールで`boot2docker ssh`すればログインできるのでしが、このコマンドはlocalhostのポート2022に接続しに行っているっぽい。デフォルトのユーザ名は`docker`、パスワードは`tcuser`になる。同様の設定をrloginに入れればOK。

![rlogin-boot2docker.png](https://qiita-image-store.s3.amazonaws.com/0/64680/8c44a878-7a6a-c0f5-67c5-8523aedb899f.png)

ちなみにlocalhost:2022にアクセスすればboot2dockerにつながるのは、VirtualBoxのポートフォワーディング設定にマッピングが書いてあるから。

![boot2docker-virtualbox-default-setting.png](https://qiita-image-store.s3.amazonaws.com/0/64680/2e6e2f75-cb31-58e4-2c9f-f8d700ed4e66.png)

## コンテナへアクセスするには？
始めはコンテナ側でsshdを動かして、ポートフォワーディングをかける方針で作業を進めていたのですが、どうもこれは[良くないという議論](http://blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker/)があるようです。要点としては

- そもそもsshでアクセスする必要があるケースはほとんどない
- 一方で鍵の管理などを考えると運用の煩雑さ等のデメリットがある
- デバッグ等で本当に必要な時には、ホストから[jpetazzo/nsenter](https://github.com/jpetazzo/nsenter)を使え

ということらしく。ぐぐって出てくるネットの記事だとsshdを組み込んでいる例も多いのですが、今回はnsenterを使う方針を試しました。

## boot2dockerからコンテナへnsenterでアクセスする
とりあえずコンテナの準備。なんでもいいのでCentOSを使う。

```
docker@boot2docker:~$ docker pull centos:latest
latest: Pulling from centos
6941bfcbbfca: Pull complete 
41459f052977: Pull complete 
fd44297e2ddb: Already exists 
centos:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.
Digest: sha256:d601d3b928eb2954653c59e65862aabb31edefa868bd5148a41fa45004c12288
Status: Downloaded newer image for centos:latest
docker@boot2docker:~$ docker run -it centos
[root@c7f40c30f8e1 /]# cat /etc/redhat-release 
CentOS Linux release 7.1.1503 (Core) 
```
記事を書いた時点でのlatestはCentOS 7.1っぽい。

次にnsenterを入れる。boot2docker上で以下のコマンドを実行すれば`nsenter`が使えるようになるっぽい。

```sh
$ docker run --rm -v /usr/local/bin:/target jpetazzo/nsenter
```

nsenterの使い方は[公式の記述](https://github.com/jpetazzo/nsenter#how-do-i-use-nsenter)通りにすれば大丈夫。入りたいコンテナのコンテナIDを`docker ps`で調べた上で

```sh
PID=$(docker inspect --format {{.State.Pid}} b99505115be6)
```

でPIDを特定し

```
# nsenter --target $PID --mount --uts --ipc --net --pid
```

とすることでコンテナに接続できる。実際にはこんな感じでコンテナの中に入ることができた。

```sh
docker@boot2docker:~$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
b99505115be6        centos:latest       "/bin/bash"         18 minutes ago      Up 18 minutes                           jolly_heisenberg    
docker@boot2docker:~$ PID=$(docker inspect --format {{.State.Pid}} b99505115be6)
docker@boot2docker:~$ sudo nsenter --target $PID --mount --uts --ipc --net --pid
root@b99505115be6:/# 
```

## まとめ
- boot2dockerにrloginでアクセスするには、localhost:2021にsshする
- boot2docker上のコンテナにアクセスするには`nsenter`を使う方法がある
    - 直接sshは推奨されない様子がある

## 参考にした記事
- http://qiita.com/kochizufan/items/c6c1b12748a4e08fde3f#3-1
- http://qiita.com/mats116/items/90a5d1490b38903b30ad