Ubuntu14.04 DockerfileでLDAP初期設定済CentOS6.5コンテナを作成

##設定時のネットワーク環境

ネットワーク空間 192.168.0.0/24
ゲートウェイ     192.168.0.1
ホストOS         192.168.0.10
作業PC           192.168.0.2
ldapサーバー     192.168.1.11

##事前作業(環境構築)
* ldapサーバーは[こちら](http://qiita.com/mykysyk@github/items/25e6adbfdb313afaf339)で構築済
* CentOS5.10のKVM上にUbuntu14.04の仮想ホストを立てる → [こちら](http://qiita.com/mykysyk@github/items/ca895a545858ff7192d6)で構築済
* KVM上の仮想ホストUbuntu14.04にdockerをインストール → aptitude install docker-io で構築済

##概要
* Ubuntu14.04のDocker0.9.1上にCentOS6.5のコンテナを作成する
* 作成するCentOS6.5のコンテナのイメージはDockerfileを用いて作成する
* CentOS6.5のコンテナは下記条件を満たす

> 1. monitでデーモン化させる
> 1. ldapクライアント設定しssh接続可能な状態


##Dockerfileの作成
####参考
> [これから始める「DockerでかんたんLAMP環境 for CentOS」](http://knowledge.sakura.ad.jp/tech/1811/)
> [Dockerってなんじゃ？（Dockerfileでビルド）](http://memocra.blogspot.jp/2014/02/dockerdockerfile.html)

```shell:shell
vi Dockerfile
```
>
```text:Dockerfile
#----------------------------------------------------------
# DockFile
#----------------------------------------------------------
FROM centos
>
MAINTAINER mykysyk
>
ENV USER_NAME docker-user
ENV USER_PASSWORD docker-user-password
ENV MONIT_ALLOW_IP 192.168.0.0/24
ENV LDAP_SEREVER 192.168.1.11
ENV LDAP_BASE_DN dc=example,dc=com
>
RUN yum update -y
>
#----------------------------------------------------------
#--- REPOS ---
#----------------------------------------------------------
#--- EPEL
RUN rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm ;\
    sed -ri 's/^enabled.*=.*1$/enabled = 0/g' /etc/yum.repos.d/epel.repo
>
#--- RPMFORGE
RUN rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm ;\
    sed -ri 's/^enabled.*=.*1$/enabled = 0/g' /etc/yum.repos.d/rpmforge.repo
>
#--- REMI
RUN rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm ;\
    sed -ri 's/^enabled.*=.*1$/enabled = 0/g' /etc/yum.repos.d/remi.repo
>
#----------------------------------------------------------
#--- SSH
#----------------------------------------------------------
RUN yum install -y sudo passwd openssh openssh-clients openssh-server
RUN sed -ri 's/^#PermitRootLogin yes$/PermitRootLogin no/' /etc/ssh/sshd_config
>
#----------------------------------------------------------
#--- LOGIN USER
#----------------------------------------------------------
#--- SSH
RUN useradd $USER_NAME
RUN echo "$USER_NAME:$USER_PASSWORD" | chpasswd
RUN echo "$USER_NAME ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/$USER_NAME
>
#-- LDAP
RUN yum install -y openldap-clients nss-pam-ldapd authconfig
RUN authconfig --enableldap \
               --enableldapauth \
               --ldapserver=$LDAP_SEREVER \
               --ldapbasedn="$LDAP_BASE_DN" \
               --update
RUN rm -f /var/lock/subsys/nslcd
>
#----------------------------------------------------------
#--- MONIT ---
#----------------------------------------------------------
RUN yum install -y monit --enablerepo=epel
RUN mkdir -p /var/monit/
#--- /etc/monit.conf
RUN cp -a /etc/monit.conf /etc/monit.conf.org
RUN echo 'set daemon  60'                       > /etc/monit.conf ;\
    echo 'set idfile /var/monit/id'            >> /etc/monit.conf ;\
    echo 'set statefile /var/monit/state'      >> /etc/monit.conf ;\
    echo 'set httpd port 2812 and'             >> /etc/monit.conf ;\
    echo '    allow localhost'                 >> /etc/monit.conf ;\
    echo "    allow $MONIT_ALLOW_IP"           >> /etc/monit.conf ;\
    echo "    allow $USER_NAME:$USER_PASSWORD" >> /etc/monit.conf ;\
    echo 'include /etc/monit.d/*'              >> /etc/monit.conf
RUN chown -R root:root /etc/monit.conf
RUN chmod -R 600 /etc/monit.conf
>
#---/etc/monit.d/services.rc
RUN echo 'check process sshd with pidfile /var/run/sshd.pid'          > /etc/monit.d/services.rc ;\
    echo '    start program = "/sbin/service sshd start"'            >> /etc/monit.d/services.rc ;\
    echo '    stop  program = "/sbin/service sshd stop"'             >> /etc/monit.d/services.rc ;\
    echo 'check process nslcd with pidfile /var/run/nslcd/nslcd.pid' >> /etc/monit.d/services.rc ;\
    echo '    start program = "/sbin/service nslcd start"'           >> /etc/monit.d/services.rc ;\
    echo '    stop  program = "/sbin/service nslcd stop"'            >> /etc/monit.d/services.rc
RUN chown -R root:root /etc/monit.d/
>
#----------------------------------------------------------
#--- START SERVICE ---
#----------------------------------------------------------
EXPOSE 22 2812
CMD /usr/bin/monit -I
```

## コンテナイメージを作成

↑でつくったDockerfileと同じ階層で実行
>
```shell:shell
docker.io build --no-cache --rm -t centos6:test .
```

##コンテナを起動
* コンテナのポート2812(monit)をホストOSの12812からポートフォワードさせる
* コンテナのポート22(ssh)をホストOSの10022からポートフォワードさせる

>
```shell:shell
docker.io run -d -p 12812:2812 -p 10022:22 -t centos6:test
```

##コンテナの状態確認

```shell:shell
docker.io ps -a
```
>
```text:結果
CONTAINER ID        IMAGE                 COMMAND                CREATED             STATUS              PORTS                                            NAMES
c6ee5a7f6bf2        centos6:hoge          /bin/sh -c /usr/bin/   4 minutes ago       Up 4 minutes        0.0.0.0:10022->22/tcp, 0.0.0.0:12812->2812/tcp   tender_wozniak
```

##コンテナのmonitに接続

monitに接続するためにはホストOSにポートフォワードしてもらって接続しなくてはいけない
そのため接続時はコンテナのIPとポートではなく、ホストOSのIPとポートフォワードするポートを指定することになる。
>
http://192.168.0.10:12812 へアクセス
>
DockerFileで指定したパスワードで接続
 ユーザー名「docker-user」 
 パスワード「docker-user-password」

##コンテナへssh接続

ssh接続するためにはホストOSにポートフォワードしてもらって接続しなくてはいけない
そのため接続時はコンテナのIPとポートではなく、ホストOSのIPとポートフォワードするポートを指定することになる。
>
```shell:shell
ssh docker-user@192.168.0.10 -P 10022
```
>
DockerFileで指定したパスワードで接続
ユーザー名「docker-user」 
パスワード「docker-user-password」



ユーザーとパスワードはDockerFileで指定したパスワード以外にldapで設定しているユーザーとパスワード両方つかえる 






##応用

[Ubuntu14.04 で Docker0.9.1 のコンテナに任意のIPをつける](http://qiita.com/mykysyk@github/items/cf98b7bbebf102403aa3)の設定を行ってから
下記コマンドでコンテナを起動させるポートフォワードさせずに直接コンテナのIPとポート番号でアクセスできるようになる。

```shell:shell
docker.io run \
-n=false \
--lxc-conf="lxc.network.type = veth" \
--lxc-conf="lxc.network.ipv4 = 192.168.0.100/24" \
--lxc-conf="lxc.network.ipv4.gateway = 192.168.0.1" \
--lxc-conf="lxc.network.link = br0" \
--lxc-conf="lxc.network.name = eth0" \
--lxc-conf="lxc.network.flags = up" \
-d -t centos6:test
```
>
>
ホストOSと同じネットワーク空間にある作業PC(192.168.0.2)から 
http://192.168.0.100:2812 にアクセス
>
DockerFileで指定したパスワードで接続
 ユーザー名「docker-user」 
 パスワード「docker-user-password」