Dockerfileを作成する

任意のフォルダに、以下の内容を記載したDockerfileという名前の拡張子なしのファイルを作成します。

# FROM nginx:1.9.6
FROM ehekatl/docker-nginx-http2

# 作成者名を記載
MAINTAINER Watanabe

# 自己証明書を発行
RUN openssl genrsa 2048 > server.key \
&& openssl req -new -key server.key -subj "/C=JP/ST=Tokyo-to/L=Minato-ku/O=ICS inc./OU=/CN=ics.media" > server.csr \
&& openssl x509 -days 3650 -req -signkey server.key < server.csr > server.crt \
&& cp server.key /etc/nginx/server.key \
&& cp server.crt /etc/nginx/server.crt

# 設定ファイルをコンテナ内に配置
COPY nginx.conf /etc/nginx/nginx.conf

上記のDockerfileのコードの内容について解説します。まずFROM命令でベースとなるDockerイメージの指定を行います。1から環境を構築していきたい場合は、ubuntuやdebian、CentOSなどのDockerイメージをベースに必要なアプリケーションを追加していく事になりますが、今回はHTTP/2環境の構築に必要なnginx 1.9.6とOpenSSL 1.0.2が既にインストールされているehekatl/docker-nginx-http2のイメージを使用します。

公式に配布されているnginxのDockerイメージにもOpenSSLはインストールされていますが、バージョンが1.0.1のため、Google ChromeでHTTP/2が有効になりません。Google ChromeでもHTTP/2を有効になるよう、OpenSSL1.0.2以降のバージョンがインストールされているDockerイメージを使用します。

次に、HTTP/2通信にはSSLが必須であるため、証明書のインストールを行います。公開環境であればLet’s Encryptを使用してSSL証明書を取得できますが、今回はローカル環境で構築しているため、自己証明書を使ってSSLを有効にします。

RUN命令では、環境構築をするためのコマンドを指定できます。opensslコマンドを使って自己証明書を発行しますが、ここで注意が必要なのは、対話形式のコマンドはエラーになってしまうため、オプションで必要な情報をセットし、対話形式にならないように配慮します。

上記の例では、有効期限を10年に設定した自己証明書を発行し、発行された自己証明書をnginxのディレクトリにコピーしています。これらのコマンドは1つずつRUN命令で書くこともできますが、ビルドする際にRUN命令を実行する履歴として保存されるため、生成されるDockerイメージの容量が肥大化してしまいます。そのため、&&コマンドを繋げることで一つのコマンドとして実行されるように記述しています。

最後にCOPY命令を使ってローカル環境にあるnginxの設定ファイルをコンテナ内に配置します。nginxの設定ファイルはDockerfileと同じディレクトリにnginx.confという名前で作成し、発行した自己証明書を設定します。

worker_processes  1;

events {
  worker_connections  1024;
}

http {
  server {
    listen       80;
    listen       443 ssl http2;

    server_name  localhost;

    ssl_certificate      /etc/nginx/server.crt;
    ssl_certificate_key  /etc/nginx/server.key;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;

    # intermediate configuration. tweak to your needs.
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    root  /usr/local/nginx/html;
    index index.html index.htm;
  }
}

この他にも以下のようなDockerfileで使用できる命令は色々と準備されています。詳しく知りたい方は公式マニュアルをご参照ください

命令概要
FROMベースにするDockerイメージを指定します。
MAINTAINER生成するイメージの作成者情報を指定します。
RUN環境構築のために実行するコマンドを指定します。
COPYローカルにあるファイルやディレクトリをコンテナ内に配置します。
CMDコンテナ起動時に実行するコマンドを指定します。
EXPOSE開放するポート番号を指定します。

次のページでは、作成したDockerfileをビルドして、Dockerイメージを作成する手順について説明します。