Dockerコンテナを作成してnginxを起動する

はじめに
===

CentOS 6.6のDockerサーバ(DockerホストOS)上で、Dockerfileを用いてDockerコンテナを作成し、Dockerコンテナ内にnginxをインストールして起動する手順です。

対象環境
===

Dockerをインストールする環境、作成するDockerコンテナの環境は以下になります。

[DockerホストOS側環境]
・CentOS release 6.6 (2.6.32-504.8.1.el6.x86_64)
・docker-io 1.4.1-3

[Dockerコンテナ側環境]
・CentOS release 6.6 (2.6.32-504.8.1.el6.x86_64)
・nginx 1.6.2-1

参考サイト
===

以下のサイトを参考にさせて頂きました。

http://www.atmarkit.co.jp/ait/articles/1406/10/news031.html

DockerホストOS側のDockerインストール手順
===

・CentOS 6.6サーバ(DockerホストOS化したいサーバ)へのDockerインストール手順については、以下をご参照下さい。

http://qiita.com/na0AaooQ/items/31d02ae89b4501f11d5d

・Dockerをインストールしたら「service docker start」コマンドを実行し、Dockerデーモンプロセスを起動しておきます。

DockerホストOS上でDockerコンテナ作成
===

**(1) DockerホストOSのCentOS 6.6サーバにrootユーザでログインします。**

**(2) Dockerイメージ作成用のDockerfileを作成します。**

・nginxをインストールするDockerイメージを作成する為、Dockerfileを作成します。

Dockerfileでイメージ作成時にnginxインストールするよう記述します。

```
[root@example-CentOS-6-6-Docker ~]# mkdir -p /root/docker/centos_nginx
[root@example-CentOS-6-6-Docker ~]# cd /root/docker/centos_nginx/
[root@example-CentOS-6-6-Docker centos_nginx]# vi /root/docker/centos_nginx/Dockerfile
```

```docker:Dockerfile
FROM centos:centos6

MAINTAINER na0AaooQ

ENV PATH $PATH:/usr/bin

RUN yum -y update

RUN rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm

RUN yum -y install nginx

RUN echo "example docker contena nginx server" > /usr/share/nginx/html/index.html

ENTRYPOINT /usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf

EXPOSE 80
```

```
[root@example-CentOS-6-6-Docker centos_nginx]# cat /root/docker/centos_nginx/Dockerfile
FROM centos:centos6

MAINTAINER na0AaooQ

ENV PATH $PATH:/usr/bin

RUN yum -y update

RUN rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm

RUN yum -y install nginx

RUN echo "example docker contena nginx server" > /usr/share/nginx/html/index.html

ENTRYPOINT /usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf

EXPOSE 80
[root@example-CentOS-6-6-Docker centos_nginx]#
```

**(3) まずDockerホストOS内にあるDockerイメージ一覧を表示します。**

```
[root@example-CentOS-6-6-Docker centos_nginx]# docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
centos:centos6/httpd   latest              c9d152242caa        23 hours ago        278 MB
centos                 centos6             a30bc9f3097e        3 weeks ago         215.8 MB
[root@example-CentOS-6-6-Docker centos_nginx]#
```

**(4) 作成したDockerfileからnginx用のDockerイメージを作成します。**

```
[root@example-CentOS-6-6-Docker centos_nginx]# docker build -t centos:centos6/nginx:1.6.2 /root/docker/centos_nginx/

　　(中略)

================================================================================
 Package        Arch            Version                    Repository      Size
================================================================================
Installing:
 nginx          x86_64          1.6.2-1.el6.ngx            nginx          336 k

Transaction Summary
================================================================================
Install       1 Package(s)

　　(中略)
Step 6 : RUN echo "example docker contena nginx server" > /usr/share/nginx/html/index.html
 ---> Running in 4e89ce67275d
 ---> c0931e25730b
Removing intermediate container 4e89ce67275d
Step 7 : ENTRYPOINT /usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf
 ---> Running in cfe35565ab36
 ---> 474cc5292d30
Removing intermediate container cfe35565ab36
Step 8 : EXPOSE 80
 ---> Running in c92596234990
 ---> 5f27d9dd5e43
Removing intermediate container c92596234990
Successfully built 5f27d9dd5e43
[root@example-CentOS-6-6-Docker centos_nginx]#
```

**(5) DockerホストOS内にあるDockerイメージ一覧を表示し、nginx用Dockerイメージが作成された事を確認します。**

```
[root@example-CentOS-6-6-Docker centos_nginx]# docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
centos:centos6/nginx   1.6.2               5f27d9dd5e43        38 seconds ago      286.3 MB
centos:centos6/httpd   latest              c9d152242caa        23 hours ago        278 MB
centos                 centos6             a30bc9f3097e        3 weeks ago         215.8 MB
[root@example-CentOS-6-6-Docker centos_nginx]#
```

**(7) 起動中のDockerコンテナを削除します(任意)。**

・他のDockerコンテナを起動したままでも問題ありませんが、nginxをインストールしたDockerコンテナだけ起動したい場合は、起動中のDockerコンテナを削除します。

```
[root@example-CentOS-6-6-Docker centos_nginx]# docker rm `docker ps -a -q`
[root@example-CentOS-6-6-Docker centos_nginx]#
```

・Dockerコンテナが起動していない事を確認します。

```
[root@example-CentOS-6-6-Docker centos_nginx]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@example-CentOS-6-6-Docker centos_nginx]#
```

**(8) Dockerコンテナを作成して起動します。**

・Dockerコンテナ作成前、80番ポートにアクセス出来ない事を確認します。

```
[root@example-CentOS-6-6-Docker centos_nginx]# cd ~
[root@example-CentOS-6-6-Docker ~]# pwd
/root
[root@example-CentOS-6-6-Docker ~]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[root@example-CentOS-6-6-Docker ~]# ps awux | grep -v grep | grep nginx
[root@example-CentOS-6-6-Docker ~]#
[root@example-CentOS-6-6-Docker ~]# curl http://127.0.0.1/
curl: (7) couldn't connect to host
[root@example-CentOS-6-6-Docker ~]#
```

・Dockerコンテナを作成します。

Dockerコンテナ内のnginxには80番ポートでアクセス出来るよう指定して、Dockerコンテナを作成します。

```
[root@example-CentOS-6-6-Docker ~]# docker run -d --name example-nginx -p 80:80 centos:centos6/nginx:1.6.2
```

エラーメッセージ等が表示されずにDockerコンテナ作成が終了した事を確認します。

```
[root@example-CentOS-6-6-Docker ~]# docker run -d --name example-nginx -p 80:80 centos:centos6/nginx:1.6.2
cb66111b15f3abb070a4a30d632cbdcff1d84706a5ad5126b06c564ea9617153
[root@example-CentOS-6-6-Docker ~]#
```

DockerホストOSからDockerコンテナ内のnginxへアクセスする
===

**(9) Dockerコンテナのnginxへアクセス出来るかテストします。**

・Dockerコンテナ作成後、Dockerコンテナ内のnginx経由でindex.htmlへアクセス出来るか確認します。

以下のように80番ポートを指定して、Dockerコンテナ内のnginxへアクセスし、/usr/share/nginx/html/index.htmlの内容が表示される事を確認します。

```
[root@example-CentOS-6-6-Docker ~]# hostname
example-CentOS-6-6-Docker
[root@example-CentOS-6-6-Docker ~]# curl http://127.0.0.1/
example docker contena nginx server
[root@example-CentOS-6-6-Docker ~]# curl http://127.0.0.1:80/index.html
example docker contena nginx server
[root@example-CentOS-6-6-Docker ~]#

[root@example-CentOS-6-6-Docker ~]# docker ps -a
CONTAINER ID        IMAGE                        COMMAND                CREATED             STATUS              PORTS                NAMES
cb66111b15f3        centos:centos6/nginx:1.6.2   "/bin/sh -c '/usr/sb   8 minutes ago       Up 8 minutes        0.0.0.0:80->80/tcp   example-nginx
[root@example-CentOS-6-6-Docker ~]#

[root@example-CentOS-6-6-Docker ~]# rpm -qa | grep nginx
[root@example-CentOS-6-6-Docker ~]#
```

・docker0のIPアドレスを指定して、Dockerコンテナ内のnginx経由でindex.htmlへアクセス出来るか確認します。

DockerホストOS上のdocker0(Dockerコンテナ用仮想ネットワークインターフェース、今回の例では198.51.100.51というIPアドレスで表記しています)を指定して、Dockerコンテナ内のnginxへアクセス出来るか確認します。

なお「docker0」とは、DockerホストOS上でのDockerデーモンプロセス起動時(service docker start実行時)に作成されるDockerコンテナ接続用の仮想ブリッジです。

以下のようにDockerコンテナ内のnginxへアクセスし、/usr/share/nginx/html/index.htmlの内容が表示される事を確認します。

```
[root@example-CentOS-6-6-Docker ~]# ifconfig
docker0   Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX
          inet addr:198.51.100.51  Bcast:198.51.100.255  Mask:255.255.255.0
          inet6 addr: XXXX::XXXX:XXXX:XXXX:XXXX/XX Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:7102 errors:0 dropped:0 overruns:0 frame:0
          TX packets:12834 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:427914 (417.8 KiB)  TX bytes:18469881 (17.6 MiB)

eth0      Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX
          inet addr:198.51.100.111  Bcast:198.51.100.255  Mask:255.255.255.0
          inet6 addr: XXXX::XXX:XXXX:XXXX:XXXX/XX Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:7671 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4582 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:9862768 (9.4 MiB)  TX bytes:421559 (411.6 KiB)
          Interrupt:247
　　(省略)
[root@example-CentOS-6-6-Docker ~]#
```

```
[root@example-CentOS-6-6-Docker ~]# curl http://198.51.100.51/
example docker contena nginx server
[root@example-CentOS-6-6-Docker ~]#
```

DockerホストOS以外の他のサーバからDockerコンテナ内のnginxへアクセスする
===

**(10) DockerホストOS以外の他のサーバからDockerホストOSのIPアドレス(今回の例では198.51.100.111)を指定して、Dockerコンテナ内のnginxへアクセス出来るかテストします。**

以下のようにDockerコンテナ内のnginxへアクセスし、/usr/share/nginx/html/index.htmlの内容が表示される事を確認します。

なお、iptables等でcurlを実行するサーバからDockerホストOSのサーバ(198.51.100.111)に対して、TCP80番ポートの通信制限をかけている場合は、あらかじめ通信許可しておきます。

```
[root@not-docker-server ~]# curl http://198.51.100.111/
example docker contena nginx server
[root@not-docker-server ~]#
```

DockerホストOS上で起動したDockerコンテナの停止と削除
===

**(11) 検証が終わったら、nginx用のDockerコンテナを停止します。**

```
[root@example-CentOS-6-6-Docker ~]# hostname
example-CentOS-6-6-Docker
[root@example-CentOS-6-6-Docker ~]# docker stop example-nginx
example-nginx
[root@example-CentOS-6-6-Docker ~]#
```

**(12) nginx用のDockerコンテナを削除します。**

```
[root@example-CentOS-6-6-Docker ~]# docker rm example-nginx
example-nginx
[root@example-CentOS-6-6-Docker ~]#
```

```
[root@example-CentOS-6-6-Docker ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@example-CentOS-6-6-Docker ~]#
```

DockerホストOS上に作成したDockerイメージ削除
===

**(13) nginx用のDockerイメージが不要になったら、docker rmiコマンドを実行してDockerイメージを削除します。**

```
[root@example-CentOS-6-6-Docker ~]# docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
centos:centos6/nginx   1.6.2               5f27d9dd5e43        34 minutes ago      286.3 MB
centos:centos6/httpd   latest              c9d152242caa        24 hours ago        278 MB
centos                 centos6             a30bc9f3097e        3 weeks ago         215.8 MB
[root@example-CentOS-6-6-Docker ~]#
```

```
[root@example-CentOS-6-6-Docker ~]# docker rmi centos:centos6/nginx:1.6.2
Untagged: centos:centos6/nginx:1.6.2
Deleted: 5f27d9dd5e4334e9a6d317080eb54ec801e0818c98f2e6fe9618beff2e658131
Deleted: 474cc5292d30b995c479a5797297fd2e3c49830046aabbad7dd3c9cc27327ed8
Deleted: c0931e25730be44110a84781e923fb8f7978d3d5bdf1411c20c5d3894daa298f
Deleted: c3f598f4dbb5fa14f5a0095e16ea38f9be27b9a683914164df8be69404afde10
Deleted: 84abcaed1d7d278ed069fc90a68e767088ae209d03866af857d28ce9f8ad1bbe
Deleted: 12d365e6e03c95c2286d85209f235ccaec1d8037b6c803441cf43cfee75f26b9
Deleted: 695f94fa6c0b96868d9d2dddbfc08b5f1366f7152955558cd7804bace4451804
Deleted: 12c39f620df1080b907234d34401b7bbb82210d92c4b229f1e71313e30c9f0c4
[root@example-CentOS-6-6-Docker ~]#
```

```
[root@example-CentOS-6-6-Docker ~]# docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
centos:centos6/httpd   latest              c9d152242caa        24 hours ago        278 MB
centos                 centos6             a30bc9f3097e        3 weeks ago         215.8 MB
[root@example-CentOS-6-6-Docker ~]#
[root@example-CentOS-6-6-Docker ~]# curl http://127.0.0.1:80/index.html
curl: (7) couldn't connect to host
[root@example-CentOS-6-6-Docker ~]#
```

***

以上になります。