Help us understand the problem. What is going on with this article?

Dockerハンズオン資料

More than 5 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 で定義するにはどうしたらいいでしょうか?

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away