2014年2月4日火曜日

Dockerってなんじゃ?




またまた今更ですが、Dockerを触ってみました。
Dockerについてはこのスライドがこれ以上ないくらいに、わかりやすく説明してくれています。

今回は、Docker内にCentOSを立ちあげて、SSH接続するまでをやってみます。

Dockerのインストールと起動


docker-ioだと少し古いので、epel-testing というリポジトリからインストールします。
# yum install --enablerepo=epel-testing docker-io-0.7.6-2.el6


docker searchコマンドでcentosのベースイメージを探します。
# docker search centos
NAME                                     DESCRIPTION                                     STARS   
tutum/centos                             CentOS Docker image with SSH access             5
tianon/centos                            CentOS 5 and 6, created using rinse instea...   6
centos                                                                                   23
.......

centosというのが一般的なものらしいので、それを使ってコンテナを起動します。
# docker run -t -i centos /bin/bash


すると、起動したコンテナ内のbashコンソールに自動的に接続されます。
ここからはゲストOSの世界です。
あとで、sshでログインするために、rootのパスワードを設定します。
-bash-4.1# passwd


ここで、まずコンテナ内にopensshをインストールします。
-bash-4.1# yum install openssh openssh-clients openssh-server vim -y


次に、sshd_configで、PAMを使用しないように設定します。(CentOSの場合)
-bash-4.1# vim /etc/ssh/sshd_config
#UsePAM no
UsePAM yes
↓
UsePAM no
#UsePAM yes


ここまで設定したら、いったんコンテナを抜けてホストOSの世界に戻ってきました。
-bash-4.1# exit



SSH用コンテナの起動


docker ps -aで、現在起動しているゲストOSの一覧を確認します。
centosのコンテナが1つあります。コンテナには一意のID(9c4fd33c4786)がついていて、状態はExitになっています。
# docker ps -a
CONTAINER ID        IMAGE                 COMMAND             CREATED              STATUS              PORTS                   NAMES
9c4fd33c4786        centos:6.4            /bin/bash           About a minute ago   Exit 0                                      kickass_pare


ここで、この9c4fd33c4786のコンテナをdocker commitコマンドで、イメージ化します。
イメージのリポジトリ名はsshd/centosとします。
# docker commit 9c4fd33c4786 sshd/centos
4e3f5f7e23b22900df3d3752ba4644f2282a5d07176b472b03753bf4ed1bd191


そして、SSH用に、いま作ったsshd/centosのイメージで改めて起動しますが、先ほどとは違い、-dオプションでデーモン化し、sshのポート番号と起動フォアグラウンドプロセスを指定します。それによってsshが起動した状態でコンテナが起動します。
# docker run -d -p 22 sshd/centos /usr/sbin/sshd -D
76451b30b156e0ebb9003152eae0dbe41aa7252d27451fb30a00cdb011ad5e20




SSH接続


起動したSSH用のコンテナは、docker内部では22番ポートですが、ホストOSに対しては別のポートで開いています。docker port コマンドで、コンテナの22番ポートに接続するためのポート番号を調べます。
# docker ps -a

CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS              PORTS                   NAMES
4485f95b6c81        sshd/centos:latest   /usr/sbin/sshd -D   25 minutes ago      Up 25 minutes       0.0.0.0:49158->22/tcp   drunk_curie
9c4fd33c4786        centos:6.4            /bin/bash           About a minute ago   Exit 0                                      kickass_pare
#
#
# docker port 4485f95b6c81 22
0.0.0.0:49158


どうやら49158ポートにフォワードされるようです。
また、ifconfigをみると、docker0というインターフェースでアクセス先のipが分かります。
# ifconfig
docker0   Link encap:Ethernet  HWaddr FE:9D:BA:61:73:4F
          inet addr:172.17.42.1  Bcast:0.0.0.0  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:20164 errors:0 dropped:0 overruns:0 frame:0
          TX packets:44290 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:1155381 (1.1 MiB)  TX bytes:64015506 (61.0 MiB)


これで、このコンテナは172.17.42.1の49158でSSHに接続できることが分かりました。
早速接続してみます。
# ssh root@172.17.42.1 -p 49158
The authenticity of host '[172.17.42.1]:49158 ([172.17.42.1]:49158)' can't be established.
RSA key fingerprint is f2:72:a0:0d:65:58:bf:c9:d1:3f:10:6c:9e:1c:de:9a.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[172.17.42.1]:49158' (RSA) to the list of known hosts.
root@172.17.42.1's password:
-bash-4.1#


うまくつながりました!
とりあえず今回は以上です。