最近、Apache Webサーバーに代わって注目を浴びているのが、Nginx(エンジンエックス)です。非常に軽量である点や、設定が簡素で有名なWebサーバーソフトウェアとしてサービスプロバイダーで広く利用されています。このNginxが動作するコンテナのDockerイメージを生成するDockerfileを作成してみましょう。
Nginx入りDockerイメージの作成でADDを理解する
Nginxでは、パッケージで用意されたnginx.confファイルがありますが、今回は、独自に作成したnginx.confファイルをコンテナにコピーすることにします。独自に作成したnginx.confファイルはホストOS上に配置します。Dockerfileと同じディレクトリに配置するのがよいでしょう。今回は、/root/nginxディレクトリを作成し、そこにnginx.confファイルとDockerfileを作成します。
06 | error_log /var/log/nginx/error.log; |
09 | worker_connections 1024; |
12 | include /etc/nginx/mime.types; |
13 | default_type application/octet-stream; |
14 | log_format main '$remote_addr - $remote_user [$time_local] "$request" ' |
15 | '$status $body_bytes_sent "$http_referer" ' |
16 | '"$http_user_agent" "$http_x_forwarded_for"'; |
17 | access_log /var/log/nginx/access.log main; |
20 | index index.html index.htm; |
21 | include /etc/nginx/conf.d/*.conf; |
23 | listen 80 default_server; |
24 | server_name localhost; |
25 | root /usr/share/nginx/html; |
26 | include /etc/nginx/default.d/*.conf; |
30 | error_page 404 /404.html; |
31 | location = /40x.html { |
33 | error_page 500 502 503 504 /50x.html; |
34 | location = /50x.html { |
次に、Dockerfileを作成します。
04 | FROM centos:centos7.1.1503 |
05 | MAINTAINER Masazumi Koga |
07 | RUN yum update -y && yum clean all |
08 | RUN yum swap -y fakesystemd systemd && yum clean all |
09 | RUN yum install -y epel-release && yum clean all |
10 | RUN yum install -y nginx && yum clean all |
11 | ADD nginx.conf /etc/nginx/ |
12 | RUN echo "Hello Nginx." > /usr/share/nginx/html/index.html |
13 | RUN systemctl enable nginx |
上記Nginx用のDockerfileの中のADDにより、nginx.confファイルを/etc/nginxディレクトリにコピーしています。このように、Dockerでは、ホストOS上で用意したファイルをDockerイメージにコピーする場合は、DockerfileのADDを利用する必要があります。Dockerfileを作成したら、Dockerイメージのビルドを行います。
1 | # docker build -f ./Dockerfile -t centos:c71nginx01 --no-cache=true . |
作成されたDockerイメージを確認します。
2 | REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE |
3 | centos c71nginx01 3c6360207feb 17 minutes ago 366.7 MB |
4 | docker.io/centos centos7.1.1503 f1dade627e25 7 weeks ago 212.1 MB |
DockerイメージからNginx入りコンテナを起動します。
1 | # docker run -d --privileged --name web0002 --hostname web0002 centos:c71nginx01 /sbin/init |
2 | 85430f2ce960b9f92ceb81fe5aa8108a04333b1fb1dedfea9f452ccdea6a698c |
3 | # docker exec -i -t web0002 /bin/bash |
Nginxが稼働しているかを確認します。
1 | [root@web0002 /]# systemctl status nginx |grep active |
2 | Active: active (running) since Thu 2015-06-11 05:15:54 UTC; 1min 51s ago |
Nginxが稼働するコンテナのIPアドレスを確認し、curlコマンドでHTMLコンテンツが読み込めるかどうかを確認します。
1 | [root@web0002 /]# ip a |grep inet |
2 | inet 127.0.0.1/8 scope host lo |
3 | inet6 ::1/128 scope host |
4 | inet 172.17.0.56/16 scope global eth0 |
5 | inet6 fe80::42:acff:fe11:38/64 scope link |
Nginxがコンテナで稼働していることが確認できました。ホストOSに保存しているnginx.confファイルがコンテナ上にコピーされているかどうか、コンテナ上で確認してみて下さい。
1 | [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に移植する際には、注意が必要です。