Dockerハンズオン資料

More than 3 years have passed since last update.


クラウドを渡り歩け! さくら×ニフティ 合同ハンズオン勉強会!!

2014年7月19日(土)開催の、Dockerハンズオン用の資料です。


ハンズオンの流れ



  • 目的


    • 実際に docker のインストールをし、コンテナの作成・管理や、クラウド間の移行が出来るように。




  • 内容


    • ニフティ … Ubuntu 12.04 に Docker をセットアップ

    • さくら … CentOS 6.5 に Docker をセットアップ

    • コンテナを作成し、相互に移動

    • 静的コンテンツ編 ( Apache + HTML ファイル )

    • 動的コンテンツ編 ( Apache + PHP + PukiWiki )




1. Docker のセットアップ(Ubuntu/ニフティクラウド編)


1.1. ニフティクラウドにログイン

対象サーバに SSH でログインします。Linux kernel のバージョンが古い為、バージョンアップをします。

host@ubuntu# apt-get update

host@ubuntu# apt-get install -y linux-image-generic-lts-raring linux-headers-generic-lts-raring
(略)
Setting up linux-headers-generic-lts-raring (3.8.0.44.44) ...
Setting up linux-image-generic-lts-raring (3.8.0.44.44) ...
host@ubuntu# reboot


1.2. バージョン確認

reboot 後、再び対象サーバにログインします。

host@ubuntu# uname -a

Linux ubuntu 3.8.0-44-generic #66~precise1-Ubuntu SMP Tue Jul 15 04:01:04 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

バージョンが「3.8」になっている事を確認します。


1.3. Docker のセットアップ

鍵を取り込みます。

host@ubuntu# apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9

Docker リポジトリを有効化します。

host@ubuntu# sh -c "echo deb https://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list"

内容を確認します。

host@ubuntu# cat /etc/apt/sources.list.d/docker.list

deb https://get.docker.io/ubuntu docker main

更新と、lxc-docker パッケージをセットアップします。

host@ubuntu# apt-get update

host@ubuntu# apt-get install lxc-docker

※途中の項目は Y を指定します。

docker の状態を確認します。

host@ubuntu# service docker status

docker start/running, process 4695

host@ubuntu# docker --version
Docker version 1.1.1, build bd609d2


1.4. 名前解決の設定

このままでは Docker が名前解決できず、イメージの取得ができません。以下の項目を追記します。

host@ubuntu# echo 'nameserver 127.0.0.1' >> /etc/resolv.conf

設定を Docker に反映するため、Docker の再起動を行います。

host@nifty # service docker restart

docker stop/waiting
docker start/running, process 5091

参考

http://docs.docker.com/installation/ubuntulinux/#ubuntu-precise-1204-lts-64-bit

https://github.com/dotcloud/docker/issues/1470


1.5. vmware-tools の更新

ニフティクラウド上では、vmware-tools の更新を行わないと、コントロールパネル上ではエラーになります。次のように更新を行います。

host@ubuntu# /usr/bin/vmware-config-tools.pl --default


2. コンテナの起動


2.1. hello world を表示するコンテナ

コンテナを起動するには docker run コマンドを使います。ubuntu のベースイメージを使い、/bin/echo を実行し、画面に文字を表示します。

host@ubuntu# docker run ubuntu /bin/echo 'hello world'

Unable to find image 'ubuntu' locally
Pulling repository ubuntu
e54ca5efa2e9: Download complete
511136ea3c5a: Download complete
d7ac5e4f1812: Download complete
2f4b4d6a4a06: Download complete
83ff768040a0: Download complete
6c37f792ddac: Download complete
hello world

初回はイメージのダウンロードに時間がかかります。次回以降は、ローカルにイメージがダウンロード済みなので、すぐに立ち上がることがわかります。

host@ubuntu# docker run ubuntu /bin/echo 'hello world'

hello world


おまけ:時間があればやってみよう

host@ubuntu# docker run -it --rm supertest2014/nyan

ctrl+c で中断できます。


2.2. CentOS イメージのダウンロードと起動

Ubuntu 上でも CentOS のコンテナを稼働させることが出来ます。今度は CentOS のベースイメージをつかって文字を表示させてみましょう。

host@ubuntu# docker run centos /bin/echo 'hello centos'

Unable to find image 'centos' locally
Pulling repository centos
1a7dc42f78ba: Pulling image (latest) from centos, endpoint: https://cdn-registry-1.docker.1a7dc42f78ba: Download complete
511136ea3c5a: Download complete
34e94e67e63a: Download complete
hello centos

また、各イメージのバージョンを確認する事もできます。

host@ubuntu# docker run ubuntu cat /etc/issue

host@ubuntu# docker run centos cat /etc/issue


2.3. コンテナの取得 (pull)

docker pull を使うと、指定した/関連するコンテナのイメージをダウンロードできます。次のコマンドは、CentOS の最新版 ( CentOS 7 ) のダウンロードです。

host@ubuntu# docker pull centos:latest

Pulling repository centos
1a7dc42f78ba: Pulling image (latest) from centos, endpoint: https://cdn-registry-1.docker.1a7dc42f78ba: Download complete
511136ea3c5a: Download complete
34e94e67e63a: Download complete


2.4. コンテナにログインする

ダウンロードしたコンテナを使い、コンテナの中に入るにはdocker run-t-i のオプションを付けます。

host@ubuntu# docker run -t -i ubuntu:14.04 /bin/bash

Unable to find image 'ubuntu:14.04' locally
Pulling repository ubuntu
e54ca5efa2e9: Download complete
511136ea3c5a: Download complete
d7ac5e4f1812: Download complete
2f4b4d6a4a06: Download complete
83ff768040a0: Download complete
6c37f792ddac: Download complete
root@2ad166fc3787:/#

これでコンテナの中で操作ができます。プロンプトに表示されている 2ad166fc3787 はコンテナ ID と呼ばれるもので、コンテナ1つ1つに対して割り当てられます。

ここで指定した -t は仮想 tty を新しいコンテナに割り当て、-i はコンテナの標準入力(STDNIN)を双方向(interactive)に取得します。そして、シェル /bin/bash に処理を渡しました。


2.5. コンテナの中で基本的なコマンドを実行

root@2ad166fc3787:/# pwd

/
root@2ad166fc3787:/# ls
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
root@2ad166fc3787:/# ps ax
PID TTY STAT TIME COMMAND
1 ? Ss 0:00 /bin/bash
13 ? R+ 0:00 ps ax

コンテナからは exit で抜けることができます。


2.6. コンテナの一覧を表示

docker ps でコンテナの一覧を表示します。

root@container# docker ps

現在稼働中のコンテナが表示されます。CONTAINER IDに表示される 12 桁の文字列が、コンテナ ID と呼ばれるもので、コンテナの起動や停止の際に必ず必要となります。

root@container# dockr ps -a

こちらは、停止したもの、古いものも含めて全てが表示されます。新しいものが上に表示されますので、head と組みあわせると楽です。


実行例

root@ubuntu:~# docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
31a2629738e9 ubuntu:14.04 /bin/bash 3 minutes ago Exited (0) 2 seconds ago cranky_hypatia
2ad166fc3787 ubuntu:14.04 /bin/bash 7 minutes ago Exited (0) 4 minutes ago hopeful_archimedes

なお、コンテナにログイン中、一時的に抜けるには、

root@ubuntu:~# docker run -t -i ubuntu:14.04 /bin/bash

root@351e58d51464:/#
(ctrl +p , q で一時的に離脱)

復帰はdocker attachの後、エンター・キーを 2回 押します(コンテナの標準入出力に接続しますが、接続直後はホスト側と相互にやりとりがないためです。こちらからエンター等、何らかの情報を送る必要があります)。

root@ubuntu:~# docker attach 351e58d51464

(★もう一度エンター
root@351e58d51464:/#

これでコンテナの中に戻ることができます。


2.7. commit してイメージの内容を確定する

通常は、コンテナの中でファイルを書き込んだり更新を加えても、 commit しないと内容が反映されません。たとえば

root@351e58d51464:/# echo test > /test

root@351e58d51464:/# cat /test
test

root@351e58d51464:/# exit
exit

このようにファイルを作成しても、再度コンテナを起動しようとしても、/test というファイルは存在しなかったことになります。

変更内容を内容を確定するコマンドが docker commit です。

以下はコンテナ ID 351e58d51464 にubuntu-testというタグを付けて保存する例です。

root@ubuntu:~# docker commit 351e58d51464 ubuntu-test

b4e346166aeaf579fb3214a3814dcc3a250f4f58cf83c88d4b66a8cf030902ab

ここで表示された文字列は、コンテナのイメージ ID です。docker images でも確認できます。

root@ubuntu:~# docker  images

REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu-test latest b4e346166aea 10 seconds ago 276.5 MB

ここで作成した ubuntu-test を使ってコンテナを起動すると、内容が反映されています。

root@ubuntu:~# docker run -i -t ubuntu-test /bin/bash

root@e8f8cc1be69d:/# cat /test
test


3. Apache が動作するコンテナを作成


3.1. CentOS 6.5 のイメージを使う

CentOS を起動する際、docker run -i -t centos /bin/bash と何も考えずに実行すると、CentOS 7 がセットアップされます。

bash-4.2# cat /etc/centos-release

CentOS Linux release 7.0.1406 (Core)

今回は centos 6.5 を使いたいので、まずは CentOS のイメージを取得してみましょう。docker pull centosを実行します。

host@ubuntu# docker pull centos

Pulling repository centos
cd934e0010d5: Download complete
1a7dc42f78ba: Download complete
511136ea3c5a: Download complete
34e94e67e63a: Download complete
host@ubuntu# docker images centos
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
centos centos7 1a7dc42f78ba 8 days ago 236.4 MB
centos latest 1a7dc42f78ba 8 days ago 236.4 MB
centos centos6 cd934e0010d5 9 days ago 206.9 MB

このように docker images centos と入力すると、centos7centos6 とタグが付いていることが分かります(参考:http://wiki.centos.org/Cloud/Docker)

このことから、centos のベースイメージ使用時、centos6 のタグを指定することで、CentOS 6 のコンテナが起動できます。

host@ubuntu# docker run -t -i centos:centos6 /bin/bash

container@bash-4.1# cat /etc/centos-release
CentOS release 6.5 (Final)


3.2. Apache のインストール

それでは、Apache を起動し、ブラウザに Nifty と表示させてみましょう。

引き続きコンテナの中で作業します。

container@bash-4.1# yum -y install httpd


Apache 起動テスト
container@bash-4.1# service httpd start
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.15 for ServerName
[ OK ]

これで、コンテナの中で Apache が起動しました。

次に、ドキュメントルートにファイルを置きます。

container@bash-4.1# echo 'Nifty' > /var/www/html/index.html

container@bash-4.1# cat /var/www/html/index.html
Nifty

ですが、このままではブラウザから動作確認できません。

コンテナ内の Apache ポート80 を、ホスト上と対応させるには、-p でポートの設定を行います。

一旦コンテナから抜けます。

container@bash-4.1# exit

exit

docker ps -a で最後に起動したコンテナ ID を見つけます。

host@ubuntu# docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
011d4e7c710a centos:centos6 /bin/bash 3 minutes ago Exited (0) 28 seconds ago grave_elion

これを commitしてイメージを保管します。

host@ubuntu# docker commit 011d4e7c710a nifty

fc1302aef7d77dd1d1523c51570b7a16ee832e75f2f1981dcfac77844bc9a874

docker run-p 80:80オプションを付けて、ホスト側とコンテナ側の Port 80 をつなぎます。

host@ubuntu# docker run -i -t -p 80:80 nifty /bin/bash

dbc0637214199f35324ef9963ba5f77d70e0543a740325775e4768d1dc9a219c

コンテナの中で再び Apache を起動します。

container@bash-4.1# service httpd start

Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.23 for ServerName
[ OK ]

ブラウザから http://ニフティクラウドのIPアドレス/ にアクセスすると、画面に Nifty が表示されます。ホスト側のポート 80 と、コンテナの中のポート 80 が対応したからです。

このように、通常、コンテナの中のポートとホスト側のポートを対応させるには、手動で明示する必要があります。


4. Docker コンテナのイメージを出力 (export)

さて、それではコンテナを他のクラウド(ここではさくらのクラウド)に移動するための準備を進めます。コンテナを移動させるには、いくつかの方法がありますが、ここではイメージをファイルとして出力し、それを移動する方法を使います。


4.1. コンテナ ID の確認

docker ps -a で対象のコンテナID を確認します

host@ubuntu# docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
011d4e7c710a centos:centos6 /bin/bash 3 minutes ago Exited (0) 28 seconds ago grave_elion


4.2. docker export の実行

docker exportコマンドは、イメージ内容を標準出力に出力するものです。リダイレクトして、ファイルに書き出します。

host@ubuntu# docker export 011d4e7c710a > nifty.tar

これで、イメージID 011d4e7c710a の内容がnifty.tarに出力されました。


4.3. export したイメージをさくらのクラウドへ移動

scp コマンドを使い、さくらのクラウドのホスト上に転送します。

host@ubuntu$ scp ./nifty.tar root@<さくらのIPアドレス>:/tmp/

あとは、さくら側で転送されていることを確認します。対象サーバに SSH ログインし、/tmp 以下にファイルがあるかどうかを確認します。

[root@sakura2 /]# ll /tmp/

合計 372656
-rw-r--r-- 1 root root 381596672 7月 18 15:00 2014 nifty.tar


5. さくらのクラウドで Docker のセットアップ ( CentOS 6.5 )

次は、CentOS 6.5 上で Docker を使えるようにします。


5.1. docker-io パッケージのセットアップ

yum を使ってセットアップします。

host@centos# yum install docker-io

※さくらのクラウドでは、初期状態から EPEL パッケージが有効です。もし、有効ではない環境では、予めセットアップが必要です。


5.2. Docker の起動

host@centos# service docker start

Starting cgconfig service: [ OK ]
Starting docker: [ OK ]

これで起動完了です。バージョン番号を確認しましょう。

host@centos# docker  --version

Docker version 1.0.0, build 63fe64c/1.0.0

そして、Docker が、ブート時に自動起動が有効化されていることを確認します。

host@centos# chkconfig --list docker

docker 0:off 1:off 2:on 3:on 4:on 5:on 6:off


6. 外部の Docker イメージを取り込んで、コンテナを起動

ニフティクラウドで作成したコンテナのイメージを、さくら上の Docker で動かします。


6.1. イメージの取り込み (import)

取り込むためには docker import を使います。

scp で転送しててあるイメージファイルは /tmp/nifty.tar です。これを取り込むには、次のようにします。ここでは docker impoart のあとで、イメージのタグ名称を nifty と指定します。

host@centos# cat /tmp/nifty.tar | docker import - nifty

8f8b42ee46a3d9d4add809b78ba6221b04c6dae3a750c2afe68f7e46685a642e

取り込まれると、新たにイメージ ID が付与されます。docker images コマンドでも確認が出来ます。

host@centos# docker images

REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
nifty latest 8f8b42ee46a3 14 seconds ago 369.6 MB


6.2. 取り込んだイメージを使って起動

一度イメージとして認識されてしまえば、先ほどのコンテナ起動と手順は変わりません。起動時に nifty というタグを指定します。

host@centos# docker run -t -i -d -p 80:80 nifty /bin/bash

今度は -d オプションを付けてデーモンモードで起動しました。

このままでは apache が起動していないため docker attach コマンドで、コンテナに接続します。

まず docker ps コマンドで、コンテナ ID を確認します。

host@centos# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3a7fd68ca680 zembutsu/nifty:latest /bin/bash 5 seconds ago Up 4 seconds 0.0.0.0:80->80/tcp loving_kirch

そして、コマンド docker attach と入力したあとは、エンターキーを2回押します。

host@centos# docker attach 3a7fd68ca680


bash-4.1#

これでコンテナの中に入りました。あとは service httpd start と実行し、Apache を起動します。

container@centos# service httpd start

Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2 for ServerName
[ OK ]

これで、ブラウザからさくらの IP アドレスにアクセスすると、画面に「 Nifty 」と表示されます。

なお、コンテナ内の /var/www/html/index.html の中身を sakura 等に書き換えると、変更内容が反映される事が確認できます。

この変更内容をイメージとして保存する場合は、docker commitを忘れずに行います。

なお、デーモン化されたコンテナの停止は、docker stop コンテナID です。


7. Dockerfile で Apache が動くコンテナを作成

これまで手動でコンテナを作成してきました。もし、コンテナを複数作成したい場合は、大変です。そこで、Dockerfile という設定ファイルを使い、イメージを作成する方法を試しましょう。

ひきつづき、さくらのクラウド上で作業を行います。


7.1. 作業用ディレクトリの作成

host@centos# mkdir /root/docker

host@centos# cd /root/docker


7.2. Dockerfile を作成

host@centos# touch Dockerfile

host@centos# vi Dockerfile

ここでは vi としましたが、好きなエディタをつかって編集してください。


Dockerfile

FROM centos:centos6

MAINTAINER 0.1. NAME, NAME@example.jp
RUN echo 'ZONE="Asia/Tokyo"' > /etc/sysconfig/clock

RUN rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6
RUN yum -y install httpd
RUN echo 'sakura' > /var/www/html/index.html

EXPOSE 80

ENTRYPOINT ["/usr/sbin/httpd"]
CMD ["-D", "FOREGROUND"]


※内容は、これまで手作業で行ってきた事を、汎用化したものです。


7.3. docker build でイメージを作成

docker build を使い、Dockerfile からイメージを構築します。作成時、-t sakuraとしてタグをつけ、Dockerfile の場所は . (カレントディレクトリ) を指定します。

host@centos# docker build -t sakura .

Sending build context to Docker daemon 2.56 kB
Sending build context to Docker daemon
Step 0 : FROM centos:centos6
---> cd934e0010d5
(略)
Removing intermediate container c3cb9248cd23

Successfully built fb4e8342e368


7.4. Dockerfile で作成したイメージ使いコンテナ起動

一度イメージを作成してしまえば、通常のコンテナ起動と変わりません。タグに sakura と指定します。

host@centos# docker run -p 80:80 -d sakura

ccd43daa046d012461c25a5ec0aa465ad6d308815923049d7f53f458cb3780f2

host@centos# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ccd43daa046d sakura:latest /usr/sbin/httpd -D F 3 seconds ago Up 2 seconds 0.0.0.0:80->80/tcp silly_brown

ブラウザから http://さくらの IP アドレス/ にアクセスすると

画面に sakura と表示されます。


8. PukiWiki のコンテナを作成する

次に、動的なコンテンツが動作するコンテナをつくり、別のクラウドに移してみましょう。ここでは PHP のアプリケーション PukiWiki を用います。

引き続き、さくらのクラウド上で作業を行います。


8.1. コンテナを作成

host@centos# docker run -i -t -p 80:80 centos:centos6 /bin/bash

bash-4.1#

新しく -p 80:80 のオプションを使用します。これは、ホスト側のポート 80 と、コンテナ内のポート 80 をリンクするためのオプション指定です。この指定が無いと、コンテナに対して外部のサービスから接続することは出来ません。

タイムゾーンを補正します。

container@lxc# echo 'ZONE="Asia/Tokyo"' > /etc/sysconfig/clock

(別解:cp /usr/share/zoneinfo/Japan /etc/localtime )


8.2. パッケージのセットアップ

Apache ほか、必要になるパッケージを入れます。

container@lxc# yum -y install httpd php wget unzip


8.3. PukiWiki のセットアップ

/var/www/html/wiki に PukiWiki を置きます。

container@lxc# wget -O pukiwiki-1_5_0_rc1_utf8.zip 'http://sourceforge.jp/frs/redir.php?m=iij&f=%2Fpukiwiki%2F61572%2Fpukiwiki-1_5_0_rc1_utf8.zip'

container@lxc# unzip ./pukiwiki-1_5_0_rc1_utf8.zip
container@lxc# mv pukiwiki-1_5_0_utf8/ /var/www/html/wiki
container@lxc# cd /var/www/html/wiki
container@lxc# chown -R apache.apache /var/www/html/wiki

PukiWiki のパスワードを変更します。

※以下 'pass9999' の箇所を任意の文字列に置き換えてください。

container@lxc# sed -i -e "s#$adminpass = '{x-php-md5}\!';#$adminpass = '{x-php-md5}' . md5('pass9999');#" pukiwiki.ini.php

(パスワードの設定を行っています。直接 pukiwiki.ini.php を書き換えても構いません)

コンテンツ用のファイルを置きます。

container@lxc# echo 'sakura' > /var/www/html/index.html

Apache を起動します。

container@lxc# service httpd start

ブラウザから http://<host>/ にアクセスするとsakura が見えます。

ブラウザから http://<host>/wiki/ にアクセスすると PukiWiki が表示されます。

何か編集して、設定が反映される事を確認します。


8.4. コンテナの変更内容を反映(commit)する

保存するためには、コンテナ ID を指定して、docker commit します。

host@centos# docker ps -a | head

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c47b41e0cd99 wiki:latest /bin/bash 17 minutes ago Exited (0) 5 seconds ago determined_elion

host@centos# docker commit c47b41e0cd99 wiki:sakura
3df585a2bde00c2183eb8be8621b40e9a2d003091feed556a428ffc4b5d7a492

なお、ここではタグに wiki:sakura と名付けました。

この状態で再度コンテナに接続する場合は、次のようにします。

host@centos# docker run -p 80:80 -t -i wiki:sakura /bin/bash

bash-4.1# service httpd start
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.24 for ServerName
[ OK ]

なお、コンテナの更新記録は docker history コマンドで調べることができます。

host@centos# docker history wiki:sakura

IMAGE CREATED CREATED BY SIZE
3df585a2bde0 2 minutes ago /bin/bash 15.75 MB
8f8b42ee46a3 2 hours ago 369.6 MB


9. Pukiwiki のコンテナを、さくら→ニフティに移動

動的なコンテンツの場合でも、先ほどの Apache コンテナを移動した時と手順は同じです。


9.1. さくら側でコンテナの export

host@centos# docker ps -a

コンテナID を調べ、export します。

host@centos# docker export コンテナID > sakura-wiki.tar

出力したファイルを scp でニフティへ転送します。

host@centos# scp ./sakura-wiki.tar root@<niftyのIPアドレス>:/tmp/

Enter passphrase for key '/root/.ssh/id_rsa':
sakura-wiki.tar 100% 368MB 10.2MB/s 00:36


9.2. ニフティ側でコンテナの取り込み(import)

ニフティ側のサーバにログインします。その後、docker importでイメージを取り込みます。タグ名は wiki:sakura とします。

root@ubuntu:~# cat /tmp/sakura-wiki.tar | docker import - wiki:sakura

411ab7beb10766680e32103f837ccad739b5aba71f366f94f9a71de0496f26ff


9.3. 取り込んだコンテナの起動

コンテナを起動します。タグ wiki:sakura を指定します。

host@ubuntu# docker run -p 80:80 -t -i wiki:sakura /bin/bash

コンテナの中で Apache を起動します

container@bash-4.1# service httpd start

Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2 for ServerName
[ OK ]

最後に、ブラウザからの表示確認を行います。http://IPアドレス/wiki/ にアクセスすると、さくらと同様の内容が表示されていることを確認します。また、編集も出来る事を確認します。


10. Dockerfile で PukiWiki のコンテナを構築

先ほどの Apahce 用のコンテナと同様に、PukiWiki のコンテナも Dockerfile で定義することが出来ます。


10.1. Dockerfile 作成

作業用ディレクトリを作ります。

host@ubuntu# mkdir /root/wiki

host@ubuntu# cd /root/wiki/
host@ubuntu# touch Dockefile
host@ubuntu# vi Dockerfile

ファイルの中身は、次のようにします。


Dockefile

FROM centos:centos6

MAINTAINER 0.1. USER, USER@example.jp
RUN echo 'ZONE="Asia/Tokyo"' > /etc/sysconfig/clock

RUN rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6
RUN yum -y install httpd php wget unzip
RUN echo 'nifty' > /var/www/html/index.html

RUN wget -O pukiwiki-1_5_0_rc1_utf8.zip 'http://sourceforge.jp/frs/redir.php?m=iij&f=%2Fpukiwiki%2F61572%2Fpukiwiki-1_5_0_rc1_utf8.zip'
RUN unzip ./pukiwiki-1_5_0_rc1_utf8.zip
RUN mv pukiwiki-1_5_0_utf8 /var/www/html/wiki
RUN chown -R apache.apache /var/www/html/wiki
RUN sed -i -e "s#$adminpass = '{x-php-md5}\!';#$adminpass = '{x-php-md5}' . md5('9999pass');#" /var/www/html/wiki/pukiwiki.ini.php

EXPOSE 80

ENTRYPOINT ["/usr/sbin/httpd"]
CMD ["-D", "FOREGROUND"]



10.2. Dockerfile を元にイメージをビルド

タグは wiki:nifty として作成します。

host@ubuntu# docker build -t wiki:nifty .

(略)
---> 30d4bc6dc4bc
Removing intermediate container a20a49adea9f
Step 13 : ENTRYPOINT ["/usr/sbin/httpd"]
---> Running in dd94718d8e19
---> c90d521b6701
Removing intermediate container dd94718d8e19
Step 14 : CMD ["-D", "FOREGROUND"]
---> Running in bdd19d56f8fc
---> 213902c19c59
Removing intermediate container bdd19d56f8fc
Successfully built 213902c19c59

作成されたイメージIDを確認します。

host@ubuntu# docker images

REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
wiki nifty 213902c19c59 32 seconds ago 312.2 MB

このように wiki:niftyというイメージが新たに作成されました。


10.3. コンテナに接続

作成した wiki:nifty タグを使って、コンテナの起動と、PukiWiki へのアクセスを試みます。

host@ubuntu# docker run -t -i -d -p 80:80 wiki:nifty

f20598638936dea634567a083d39a258c00a3017ad9ce1f09aaab4efd6b08f7b

host@ubuntu# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f20598638936 wiki:nifty /usr/sbin/httpd -D F 3 seconds ago Up 2 seconds 0.0.0.0:80->80/tcp happy_kirch

このように確認ができたあとは、ブラウザから Wiki へのアクセスが可能なことを確認します。

以上でハンズオンの内容は終了です。お疲れ様でした。


11. (上級編)WordPress のコンテナを作成

※時間のあるチーム向けの自主課題です。

これまでのお復習いとして、WordPress が動作するコンテナを作成します。以下は手順の概要だけ示しますので、なぜこのコマンドを実行するのか、考えながら進んで下さい。


11.1. 概要

WordPress の動作には、Apache、PHP、MySQL の環境をセットアップします。さらに、ブラウザ上から WordPress のセットアップを行います。


11.2. WordPress コンテナの作成手順

WordPress のインストール - WordPress Codex 日本語版

http://wpdocs.sourceforge.jp/WordPress_%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB

作業内容は、こちらのドキュメントに準じます。


コンテナ側の準備

ホスト側でコンテナを起動。

root@ubuntu:~# docker run -i -t centos:centos6 /bin/bash

コンテナ内で時刻設定。

root@ubuntu:~# echo 'ZONE="Asia/Tokyo"' > /etc/sysconfig/clock


WordPress のダウンロードと展開

root@ubuntu:~# yum -y install httpd php php-mysql mysql-server tar wget

root@ubuntu:~# cd /var/www/html
root@ubuntu:~# wget http://ja.wordpress.org/wordpress-3.9.1-ja.tar.gz
root@ubuntu:~# tar xvfz ./wordpress-3.9.1-ja.tar.gz


MySQL データベース設定とユーザの作成

root@ubuntu:~# service mysqld start


root@ubuntu:~# mysql -u root
mysql> CREATE DATABASE wordpress;
mysql> GRANT ALL PRIVILEGES ON wordpress.* TO "wordpress"@"localhost" IDENTIFIED BY "password999";
mysql> FLUSH PRIVILEGES;
mysql> EXIT


commit して変更内容を確定

コンテナを抜けて wordpress という名前で docker commit する。

root@ubuntu:~# docker ps -a | head -2

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
aeaa50c49e31 centos:centos6 /bin/bash 11 minutes ago Exited (0) 49 seconds ago thirsty_mcclintock

root@ubuntu:~# docker commit aeaa50c49e31 wordpress
301e6ae61c2d0fb5104327a741a573c39015f71a78cb76bfb0f5c181cbf2e1cd


コンテナの起動

root@ubuntu:~# docker run -t -i -d -p 80:80 wordpress

2c9887a60d1eb9833ba237930430c680bdb4230ecb8221a3b2d406f8251cbe13
root@ubuntu:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2c9887a60d1e wordpress:latest /bin/bash 9 seconds ago Up 9 seconds 0.0.0.0:80->80/tcp tender_elion


デーモンの起動

root@ubuntu:~# docker attach 2c9887a60d1e


container@bash-4.1# service httpd start
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.27 for ServerName
[ OK ]
container@bash-4.1# service mysqld start
Starting mysqld: [ OK ]

container@bash-4.1# chown -R apache.apache /var/www/html/wordpress/


ブラウザからセットアップ

http://<HOST>/wordpress/wp-admin/install.php

に接続します。


  • '設定ファイルを作成する'

  • 'さぁ始めましょう'

  • 詳細


    • データベース名:wordpress

    • ユーザ名:wordpress

    • パスワード:password999

    • データベースのホスト名:localhost

    • テーブル接頭辞:wp_

    • 【送信】
      *【インストール実行】



  • ようこそ


    • サイト名:docker

    • ユーザ名:docker

    • パスワード:docker999

    • メールアドレス:任意

    • 【WordPressをインストール】



  • 成功しました!


    • 【ログイン】



WordPress 上で書き込みを行い、書き込み内容が反映されていることをブラウザから確認。


コンテナイメージのコミット

container@bash-4.1# exit

exit
root@ubuntu:~# docker ps -a | head -2
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
31dd5ff9b3f4 wordpress:latest /bin/bash 7 minutes ago Exited (0) 10 seconds ago elegant_kowalevski

root@ubuntu:~# docker commit 31dd5ff9b3f4 wordpress:nifty
0a60f13ca024c8f0156bf8a23dff43bd2a2879ba7538ba7f9c85845312b821d4
root@ubuntu:~# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
wordpress nifty 0a60f13ca024 11 seconds ago 444.7 MB
wordpress latest 301e6ae61c2d 21 minutes ago 408.2 MB

2つ出来ている。


11.3. さらに時間のあるグループは …


  • コンテナを別のクラウドに移動させましょう

ニフティ -> さくら、移行例

※予め、ニフティ側 WordPress のブラウザから行う基本設定で、コンテンツの IP アドレスを「さくら側」に変更しておく必要があります。


ニフティ側

root@ubuntu:~# docker commit b3cc6f68a0ff wordpress:nifty

9094fd71be4b5ce2734076860621b2b51552a4c5ce0341911465084d09d59a6f

root@ubuntu:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b3cc6f68a0ff 0a60f13ca024 /bin/bash 5 minutes ago Exited (0) About a minute ago jovial_archimedes

root@ubuntu:~# docker export b3cc6f68a0ff > nifty-wp.tar

root@ubuntu:~# scp ./nifty-wp.tar root@153.120.83.96:/tmp/
Enter passphrase for key '/root/.ssh/id_rsa':
nifty-wp.tar 100% 393MB 17.1MB/s 00:23



さくら側

[root@sakura2 ~]# cat /tmp/nifty-wp.tar | docker import - wordpress:sakura

a266f141bfa43423678a090daf341ce96a1a06fd8ac9f269e5e62bf44a4d115a

[root@sakura2 ~]# docker run -t -i -d -p 80:80 wordpress:sakura /bin/bash
f8061f2fe88aa8e377b0b7a42bead0a651870a3942494e853e2daffe260147a2

[root@sakura2 ~]# docker attach f8061f2fe88aa8e377b0b7a42bead0a651870a3942494e853e2daffe260147a2

bash-4.1# service mysqld start
Starting mysqld: [ OK ]
bash-4.1# service httpd start
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.28 for ServerName
[ OK ]



  • それぞれ、どのような作業を行っていたのでしょうか?


  • この内容を Dockerfile で定義するにはどうしたらいいでしょうか?