はじめに
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
参考サイト
以下のサイトを参考にさせて頂きました。
DockerホストOS側のDockerインストール手順
・CentOS 6.6サーバ(DockerホストOS化したいサーバ)へのDockerインストール手順については、以下をご参照下さい。
・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
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 ~]#
以上になります。