Dockerfileを使いこなす(2)
最近、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に移植する際には、注意が必要です。
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- Dockerfileを使いこなす(1)
- Dockerにおけるデータ専用コンテナ、KVM仮想化環境からの移行
- CoreOS&Docker環境においてOracle Database 11g Release 2をインストールするためのポイント
- CentOS 7の仮想化、Docker、リソース管理(後編)
- Dockerコンテナの起動と廃棄
- Dockerコンテナからのディレクトリアクセスやボリューム共有
- Dockerイメージの入手
- Keycloakのインストールと構築例
- Windows Server 2016 Technical Preview 3におけるDockerの利用
- CentOS 7でのOpenStackの構築手順