VirtualHostを設定できるDockerfileの作り方

ここではDockerfileを使ってapacheのVirtualHost設定を入れたDockerイメージを作成してみます。また、実際にアクセスしてみてVirtualHostが有効になっていることを見てみます。

事前準備

事前準備としていくつかファイルを作成しています。

Dockerfile

作成したDockerfileが以下です。

FROM httpd:2.4

ARG UID=1000
RUN useradd -m -u ${UID} masaki-blog

RUN mkdir /usr/local/apache2/conf/include/
RUN mkdir /home/masaki-blog/public/

RUN echo 'Include conf/include/*.conf ' >> /usr/local/apache2/conf/httpd.conf

COPY ./public/*.html /home/masaki-blog/public/
COPY ./conf/*.conf   /usr/local/apache2/conf/include/

それぞれ細かく見ていきます。

ユーザ追加

以下の部分でユーザを追加しています。

ARG UID=1000
RUN useradd -m -u ${UID} masaki-blog

HTMLファイルを「/home/masaki-blog/public/」配下にファイルを配置したいのでユーザを作成しています。

ディレクトリ作成

以下でディレクトリを作成しています。

RUN mkdir /usr/local/apache2/conf/include/
RUN mkdir /home/masaki-blog/public/

設定ファイルの変更

以下で設定ファイル(httpd.conf)に設定を追加しています。

RUN echo 'Include conf/include/*.conf ' >> /usr/local/apache2/conf/httpd.conf

「include」ディレクトリの配下のファイルを読み込むようにしています。

ファイルコピー

以下でホスト側(コマンドを実行している側)のファイルをDockerイメージの所定の場所にコピーしています。

COPY ./public/*.html /home/masaki-blog/public/
COPY ./conf/*.conf   /usr/local/apache2/conf/include/

後述のHTMLファイルと設定ファイルをコピーしています。

設定ファイル(conf/common.conf)

「common.conf」で共通(デフォルト)の設定を入れています。

ServerName localhost:80

<VirtualHost *:80>
    DocumentRoot /usr/local/apache2/htdocs
</VirtualHost>

通常は「/usr/local/apache2/htdocs」にアクセスするようにしています。

設定ファイル(conf/my-httpd.conf)

「my-httpd.conf」で個別の設定を入れています。

<Directory "/home/masaki-blog/public/">
    Require all granted
</Directory>

<VirtualHost *:80>
    DocumentRoot /home/masaki-blog/public/
    ServerName masaki-blog.net
</VirtualHost>

今回は「masaki-blog.net」という名前(ドメイン)でアクセスされたら「/home/masaki-blog/public/」の内容を表示するようにしています。またディレクトリへのアクセスを許可するように「Require all granted」の設定を入れています。

HTMLファイル(public/index.html)

「/home/masaki-blog/public/」に配置するHTMLファイルを用意しています。

$ cat public/index.html
Welcome masaki-blog.net
$

内容は適当です。

カスタムイメージ作成

Dockerfileをビルドしてカスタムイメージを作成します。

$ docker build -t my-apache2-vhost .
Sending build context to Docker daemon  12.29kB
Step 1/8 : FROM httpd:2.4
 ---> c562eeace183
Step 2/8 : ARG UID=1000
 ---> Running in 378ebfd922af
Removing intermediate container 378ebfd922af
 ---> 69246a030f98
Step 3/8 : RUN useradd -m -u ${UID} masaki-blog
 ---> Running in 6e2a458f56a8
Removing intermediate container 6e2a458f56a8
 ---> d2b5d201c58e
Step 4/8 : RUN mkdir /usr/local/apache2/conf/include/
 ---> Running in b992340ad6b7
Removing intermediate container b992340ad6b7
 ---> ca129866a0ca
Step 5/8 : RUN mkdir /home/masaki-blog/public/
 ---> Running in 9bf5336e0d26
Removing intermediate container 9bf5336e0d26
 ---> b8c8f056a1ee
Step 6/8 : RUN echo 'Include conf/include/*.conf ' >> /usr/local/apache2/conf/httpd.conf
 ---> Running in 59cc61b1c99d
Removing intermediate container 59cc61b1c99d
 ---> 430ca5b878ca
Step 7/8 : COPY ./public/*.html /home/masaki-blog/public/
 ---> 27601b9ead40
Step 8/8 : COPY ./conf/*.conf   /usr/local/apache2/conf/include/
 ---> 537615d99b3e
Successfully built 537615d99b3e
Successfully tagged my-apache2-vhost:latest
$

無事にビルドできました。以下の通りDockerイメージのリストにも追加されています。

$ docker image ls my-apache2-vhost
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
my-apache2-vhost    latest              537615d99b3e        47 seconds ago      166MB
$

動作確認

期待通りの動きをするか動作確認しておきます。

コンテナ起動

まずはコンテナを起動します。

$ docker run -dit --name my-running-vhost-app -p 8080:80 my-apache2-vhost
ec33b8844428bd650f0ba119765d5e22eb4265f96e0ce05134ff2bb00ebdf8be
$

HTTPアクセス

コンテナが起動できたのでcurlでアクセスしてみます。

$ curl http://localhost:8080/
<html><body><h1>It works!</h1></body></html>
$

通常(デフォルト)のレスポンスが返ってきました。

HTTPアクセス(ホストヘッダ付き)

次にホストヘッダ付きでアクセスしてみます。

$ curl -H "host: masaki-blog.net"  http://localhost:8080/
Welcome masaki-blog.net
$

今度は「/home/masaki-blog/public/」に配置したHTMLファイルの内容が表示されました。

コマンドについて説明しておくと、「-H」はcurlでのアクセス時にヘッダを追加するオプションです。hostヘッダに「masaki-blog.net」のドメインを付与しています。

これで、VirtualHostの設定(ServerNameごとの向き先)によってアクセスされるディレクトリが切り替わることが確認できました。

作成物

今回作成したものは以下に置いています。

https://github.com/masaki-code/docker/tree/master/apache/virtualhost

コメント

タイトルとURLをコピーしました