Dockerfileを使いこなす(2)

2015年10月13日(火)
古賀 政純

最近、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に移植する際には、注意が必要です。

日本ヒューレット・パッカード株式会社 プリセールス統括本部 ソリューションセンター OSS・Linux担当 シニアITスペシャリスト

兵庫県伊丹市出身。1996年頃からオープンソースに携わる。2000年よりUNIXサーバーのSE及びスーパーコンピューターの並列計算プログラミング講師を担当。科学技術計算サーバーのSI経験も持つ。2005年、大手製造業向けLinuxサーバー提案で日本HP社長賞受賞。2006年、米国HPからLinux技術の伝道師に与えられる「OpenSource and Linux Ambassador Hall of Fame」を2年連続受賞。日本HPプリセールスMVPを4度受賞。現在は、Linux、FreeBSD、Hadoop等のOSSを駆使したスケールアウト型サーバー基盤のプリセールスSE、技術検証、技術文書執筆を担当。日本HPのオープンソース・Linuxテクノロジーエバンジェリストとして講演活動も行っている。Red Hat Certified Engineer、Red Hat Certified Virtualization Administrator、Novell Certified Linux Professional、EXIN Cloud Computing Foundation Certificate、HP Accredited Systems Engineer Cloud Architect、Red Hat Certified System Administrator in Red Hat OpenStack、Cloudera Certified Administrator for Apache Hadoop認定技術者。HP公式ブログ執筆者。趣味はレーシングカートとビリヤード

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています