Docker実践ガイド 10

Dockerfileを使いこなす(2)

最近、Apache Webサーバーに代わって注目を浴びているのが、Nginx(エンジンエックス)です。非常に軽量である点や、設定が簡素で有名なWebサーバーソフトウェアとしてサービスプロバイダーで広く利用されています。このNginxが動作するコンテナのDockerイメージを生成するDockerfil

古賀 政純

2015年10月13日 18:00

最近、Apache Webサーバーに代わって注目を浴びているのが、Nginx(エンジンエックス)です。非常に軽量である点や、設定が簡素で有名なWebサーバーソフトウェアとしてサービスプロバイダーで広く利用されています。このNginxが動作するコンテナのDockerイメージを生成するDockerfileを作成してみましょう。

Nginx入りDockerイメージの作成でADDを理解する

Nginxでは、パッケージで用意されたnginx.confファイルがありますが、今回は、独自に作成したnginx.confファイルをコンテナにコピーすることにします。独自に作成したnginx.confファイルはホストOS上に配置します。Dockerfileと同じディレクトリに配置するのがよいでしょう。今回は、/root/nginxディレクトリを作成し、そこにnginx.confファイルとDockerfileを作成します。

# mkdir /root/nginx
# cd /root/nginx
# vi nginx.conf
user  nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log;
pid        /run/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile        on;
    keepalive_timeout  65;
    index   index.html index.htm;
    include /etc/nginx/conf.d/*.conf;
    server {
        listen       80 default_server;
        server_name  localhost;
        root         /usr/share/nginx/html;
        include /etc/nginx/default.d/*.conf;
        location / {
                autoindex on;
        }
        error_page  404              /404.html;
        location = /40x.html {
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
        }
    }
}

次に、Dockerfileを作成します。

# pwd
/root/nginx
# vi Dockefile
FROM            centos:centos7.1.1503
MAINTAINER      Masazumi Koga
ENV             container docker
RUN             yum update  -y && yum clean all
RUN             yum swap -y fakesystemd systemd && yum clean all
RUN             yum install -y epel-release && yum clean all
RUN             yum install -y nginx && yum clean all
ADD             nginx.conf /etc/nginx/
RUN             echo "Hello Nginx." > /usr/share/nginx/html/index.html
RUN             systemctl enable nginx
EXPOSE          80

上記Nginx用のDockerfileの中のADDにより、nginx.confファイルを/etc/nginxディレクトリにコピーしています。このように、Dockerでは、ホストOS上で用意したファイルをDockerイメージにコピーする場合は、DockerfileのADDを利用する必要があります。Dockerfileを作成したら、Dockerイメージのビルドを行います。

# docker build -f ./Dockerfile -t centos:c71nginx01 --no-cache=true .

作成されたDockerイメージを確認します。

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
centos              c71nginx01          3c6360207feb        17 minutes ago      366.7 MB
docker.io/centos    centos7.1.1503      f1dade627e25        7 weeks ago         212.1 MB

DockerイメージからNginx入りコンテナを起動します。

# docker run -d --privileged --name web0002 --hostname web0002 centos:c71nginx01 /sbin/init
85430f2ce960b9f92ceb81fe5aa8108a04333b1fb1dedfea9f452ccdea6a698c
# docker exec -i -t web0002 /bin/bash
[root@web0002 /]#

Nginxが稼働しているかを確認します。

[root@web0002 /]# systemctl status nginx |grep active
   Active: active (running) since Thu 2015-06-11 05:15:54 UTC; 1min 51s ago

Nginxが稼働するコンテナのIPアドレスを確認し、curlコマンドでHTMLコンテンツが読み込めるかどうかを確認します。

[root@web0002 /]# ip a |grep inet
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
    inet 172.17.0.56/16 scope global eth0
    inet6 fe80::42:acff:fe11:38/64 scope link

[root@web0002 /]# curl http://172.17.0.56/index.html
Hello Nginx.

Nginxがコンテナで稼働していることが確認できました。ホストOSに保存しているnginx.confファイルがコンテナ上にコピーされているかどうか、コンテナ上で確認してみて下さい。

[root@web0002 /]# cat /etc/nginx/nginx.conf

[補足] docker cpで、ホストOS上のファイルをコンテナにコピーできないのか?

Dockerでは、ホストOS上のファイルをDockerイメージにコピーしたい場合、Dockerfile内のADDで記述する必要があり、docker cpは利用できません。逆に、稼働中のコンテナ上のファイルをホストOSにコピーするには、docker cpで可能です。この仕様については、現在、コミュニティにおいて賛否両論が繰り広げられていますが、現時点では、Dockerfile内でADDを使う方法がDockerにおける正式なコピー方法となっています。

[補足] docker buildで、yumコマンドが遅い、または、ミラーサイトが見つからないエラーが出る

Dockerfileを使って、CentOS用のDockerイメージを作成する際、パッケージのインストールを行うyumコマンドが多用されますが、yumコマンドの実行中、リポジトリのミラーサイトが見つけられない旨のメッセージがでる場合があります。リポジトリを見つけられない場合の対処方法としては、Dockerfile内で、パッケージインストール後に「yum clean all」を付与します。ホストOSでのRPMパッケージ導入のスクリプトなどから、Dockerfileに移植する際には、注意が必要です。

この記事のキーワード

この記事をシェアしてください

人気記事トップ10

人気記事ランキングをもっと見る