クラウドを渡り歩け! さくら×ニフティ 合同ハンズオン勉強会!!
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
と入力すると、centos7
と centos6
とタグが付いていることが分かります(参考: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
としましたが、好きなエディタをつかって編集してください。
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
ファイルの中身は、次のようにします。
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 で定義するにはどうしたらいいでしょうか?