Dockerハンズオン資料

## クラウドを渡り歩け！　さくら×ニフティ　合同ハンズオン勉強会！！
2014年7月19日(土)開催の、[Dockerハンズオン](http://www.zusaar.com/event/14467015)用の資料です。
### ハンズオンの流れ

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

* 内容
 *  ニフティ … Ubuntu 12.04 に Docker をセットアップ
 *  さくら … CentOS 6.5 に Docker をセットアップ
 *  コンテナを作成し、相互に移動
  1. 静的コンテンツ編 ( Apache + HTML ファイル )
  2. 動的コンテンツ編 ( Apache + PHP + PukiWiki )

## 1. Docker のセットアップ(Ubuntu/ニフティクラウド編)
### 1.1. ニフティクラウドにログイン
対象サーバに SSH でログインします。Linux kernel のバージョンが古い為、バージョンアップをします。

```shell-session
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 後、再び対象サーバにログインします。

```shell-session
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 のセットアップ

鍵を取り込みます。

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

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

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

内容を確認します。

```shell-session
host@ubuntu# cat /etc/apt/sources.list.d/docker.list
deb https://get.docker.io/ubuntu docker main
```

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

```shell-session
host@ubuntu# apt-get update
host@ubuntu# apt-get install lxc-docker
```
※途中の項目は `Y` を指定します。

docker の状態を確認します。

```shell-session
host@ubuntu# service docker status
docker start/running, process 4695

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

### 1.4. 名前解決の設定

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

```shell-session
host@ubuntu# echo 'nameserver 127.0.0.1' >> /etc/resolv.conf
```

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

```shell-session
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 の更新を行わないと、コントロールパネル上ではエラーになります。次のように更新を行います。

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

## 2. コンテナの起動

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

```shell-session
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
```

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

```shell-session
host@ubuntu# docker run ubuntu /bin/echo 'hello world'
hello world
```

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

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

`ctrl+c` で中断できます。

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

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

```shell-session
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
```

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

```shell-session
host@ubuntu# docker run ubuntu cat /etc/issue
host@ubuntu# docker run centos cat /etc/issue
```

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

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

```shell-session
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` のオプションを付けます。

```shell-session
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 と呼ばれるもので、コンテナ１つ１つに対して割り当てられます。

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

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

```shell-session
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` でコンテナの一覧を表示します。

```shell-session
root@container# docker ps
```

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

```shell-session
root@container# dockr ps -a
```

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

```shell-session:実行例
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
```

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

```shell-session
root@ubuntu:~# docker run -t -i ubuntu:14.04 /bin/bash
root@351e58d51464:/#
（ctrl +p , q で一時的に離脱）
```

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

```shell-session
root@ubuntu:~# docker attach 351e58d51464
(★もう一度エンター
root@351e58d51464:/#
```

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


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

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

```shell-session
root@351e58d51464:/# echo test > /test
root@351e58d51464:/# cat /test
test

root@351e58d51464:/# exit
exit
```

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

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

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

```shell-session
root@ubuntu:~# docker commit 351e58d51464 ubuntu-test
b4e346166aeaf579fb3214a3814dcc3a250f4f58cf83c88d4b66a8cf030902ab
```

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

```shell-session
root@ubuntu:~# docker  images
REPOSITORY             TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu-test            latest              b4e346166aea        10 seconds ago      276.5 MB
```

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

```shell-session
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 がセットアップされます。

```shell-session
bash-4.2# cat /etc/centos-release
CentOS Linux release 7.0.1406 (Core)
```

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

```shell-session
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 のコンテナが起動できます。

```shell-session
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` と表示させてみましょう。

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

```shell-session
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 が起動しました。

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

```shell-session
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` でポートの設定を行います。

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

```shell-session
container@bash-4.1# exit
exit
```

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

```shell-session
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`してイメージを保管します。

```shell-session
host@ubuntu# docker commit 011d4e7c710a nifty
fc1302aef7d77dd1d1523c51570b7a16ee832e75f2f1981dcfac77844bc9a874
```

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

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

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

```shell-session
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 を確認します

```shell-session
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`コマンドは、イメージ内容を標準出力に出力するものです。リダイレクトして、ファイルに書き出します。

```shell-session
host@ubuntu# docker export 011d4e7c710a > nifty.tar
```

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

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

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

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

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

```shell-session
[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` を使ってセットアップします。

```shell-session
host@centos# yum install docker-io
```
※さくらのクラウドでは、初期状態から EPEL パッケージが有効です。もし、有効ではない環境では、予めセットアップが必要です。

### 5.2. Docker の起動

```shell-session
host@centos# service docker start
Starting cgconfig service:                                 [  OK  ]
Starting docker:                                           [  OK  ]	
```

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

```shell-session
host@centos# docker  --version
Docker version 1.0.0, build 63fe64c/1.0.0
```

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

```shell-session
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` と指定します。

```shell-session
host@centos# cat /tmp/nifty.tar | docker import - nifty
8f8b42ee46a3d9d4add809b78ba6221b04c6dae3a750c2afe68f7e46685a642e
```

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

```shell-session
host@centos# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
nifty               latest              8f8b42ee46a3        14 seconds ago      369.6 MB
```

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

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

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

今度は `-d` オプションを付けてデーモンモードで起動しました。
このままでは apache が起動していないため `docker attach` コマンドで、コンテナに接続します。

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

```shell-session
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回押します。

```shell-session
host@centos# docker attach 3a7fd68ca680

bash-4.1#
```

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

```shell-session
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. 作業用ディレクトリの作成

```shell-session
host@centos# mkdir /root/docker
host@centos# cd /root/docker
```

### 7.2. Dockerfile を作成

```shell-session
host@centos# touch Dockerfile
host@centos# vi Dockerfile
```

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

```text: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 の場所は `.` (カレントディレクトリ) を指定します。

```shell-session
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` と指定します。

```shell-session
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. コンテナを作成

```shell-session
host@centos# docker run -i -t -p 80:80 centos:centos6 /bin/bash
bash-4.1#
```
新しく `-p 80:80` のオプションを使用します。これは、ホスト側のポート 80 と、コンテナ内のポート 80 をリンクするためのオプション指定です。この指定が無いと、コンテナに対して外部のサービスから接続することは出来ません。

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

```shell-session
container@lxc# echo 'ZONE="Asia/Tokyo"' > /etc/sysconfig/clock
```
（別解：cp /usr/share/zoneinfo/Japan /etc/localtime ）

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

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

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

### 8.3. PukiWiki のセットアップ

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


```shell-session
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' の箇所を任意の文字列に置き換えてください。

```shell-session
container@lxc# sed -i -e "s#$adminpass = '{x-php-md5}\!';#$adminpass = '{x-php-md5}' . md5('pass9999');#" pukiwiki.ini.php
```
（パスワードの設定を行っています。直接 pukiwiki.ini.php を書き換えても構いません）

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

```shell-session
container@lxc# echo 'sakura' > /var/www/html/index.html
```

Apache を起動します。

```shell-session
container@lxc# service httpd start
```

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

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

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

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

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

```shell-session
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` と名付けました。

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

```shell-session
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` コマンドで調べることができます。

```shell-session
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

```shell-session
host@centos# docker ps -a
```

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

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

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

```shell-session
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` とします。

```shell-session
root@ubuntu:~# cat /tmp/sakura-wiki.tar | docker import - wiki:sakura
411ab7beb10766680e32103f837ccad739b5aba71f366f94f9a71de0496f26ff
```

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

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

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

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

```shell-session
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 作成

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

```shell-session
host@ubuntu# mkdir /root/wiki
host@ubuntu# cd /root/wiki/
host@ubuntu# touch Dockefile
host@ubuntu# vi Dockerfile
```

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

```test: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` として作成します。

```shell-session
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を確認します。

```shell-session
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 へのアクセスを試みます。

```shell-session
host@ubuntu# docker run -t -i -d -p 80:80 wiki:nifty
f20598638936dea634567a083d39a258c00a3017ad9ce1f09aaab4efd6b08f7b
```

```shell-session
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

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

#### コンテナ側の準備
ホスト側でコンテナを起動。

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

コンテナ内で時刻設定。

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

#### WordPress のダウンロードと展開

```shell-session
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 データベース設定とユーザの作成

```shell-session
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` する。

```shell-session
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
```

#### コンテナの起動

```shell-session
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
```

#### デーモンの起動

```shell-session
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 上で書き込みを行い、書き込み内容が反映されていることをブラウザから確認。

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


```shell-session
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
```

２つ出来ている。

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

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

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

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

```shell-session:ニフティ側
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
```

```shell-session:さくら側
[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 で定義するにはどうしたらいいでしょうか？