設定時のネットワーク環境
ネットワーク空間 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サーバーはこちらで構築済
- CentOS5.10のKVM上にUbuntu14.04の仮想ホストを立てる → こちらで構築済
- KVM上の仮想ホストUbuntu14.04にdockerをインストール → aptitude install docker-io で構築済
概要
- Ubuntu14.04のDocker0.9.1上にCentOS6.5のコンテナを作成する
- 作成するCentOS6.5のコンテナのイメージはDockerfileを用いて作成する
- CentOS6.5のコンテナは下記条件を満たす
- monitでデーモン化させる
- ldapクライアント設定しssh接続可能な状態
Dockerfileの作成
参考
これから始める「DockerでかんたんLAMP環境 for CentOS」
Dockerってなんじゃ?(Dockerfileでビルド)
vi Dockerfile
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と同じ階層で実行
shelldocker.io build --no-cache --rm -t centos6:test .
コンテナを起動
- コンテナのポート2812(monit)をホストOSの12812からポートフォワードさせる
- コンテナのポート22(ssh)をホストOSの10022からポートフォワードさせる
shelldocker.io run -d -p 12812:2812 -p 10022:22 -t centos6:test
コンテナの状態確認
docker.io ps -a
結果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とポートフォワードするポートを指定することになる。
shellssh docker-user@192.168.0.10 -P 10022
DockerFileで指定したパスワードで接続
ユーザー名「docker-user」
パスワード「docker-user-password」
ユーザーとパスワードはDockerFileで指定したパスワード以外にldapで設定しているユーザーとパスワード両方つかえる
応用
Ubuntu14.04 で Docker0.9.1 のコンテナに任意のIPをつけるの設定を行ってから
下記コマンドでコンテナを起動させるポートフォワードさせずに直接コンテナのIPとポート番号でアクセスできるようになる。
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」