やったこと
少し前から話題のDockerというやつを、Windowsでも使ってみたくて実験しました。
Windows環境でDockerの実験をするために、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。
ちなみにlocalhost:2022にアクセスすればboot2dockerにつながるのは、VirtualBoxのポートフォワーディング設定にマッピングが書いてあるから。
コンテナへアクセスするには?
始めはコンテナ側でsshdを動かして、ポートフォワーディングをかける方針で作業を進めていたのですが、どうもこれは良くないという議論があるようです。要点としては
- そもそもsshでアクセスする必要があるケースはほとんどない
- 一方で鍵の管理などを考えると運用の煩雑さ等のデメリットがある
- デバッグ等で本当に必要な時には、ホストから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
が使えるようになるっぽい。
$ docker run --rm -v /usr/local/bin:/target jpetazzo/nsenter
nsenterの使い方は公式の記述通りにすれば大丈夫。入りたいコンテナのコンテナIDをdocker ps
で調べた上で
PID=$(docker inspect --format {{.State.Pid}} b99505115be6)
でPIDを特定し
# nsenter --target $PID --mount --uts --ipc --net --pid
とすることでコンテナに接続できる。実際にはこんな感じでコンテナの中に入ることができた。
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は推奨されない様子がある