APのコンテナが複数あって、それを1つのnginxからリバースプロキシして振り分けることをしてみる。
まず、APコンテナは以下のDockerfileとする。
FROM debian:8.1 MAINTAINER 74th<site@j74th.com> RUN apt-get update RUN apt-get install -y apache2 libapache2-mod-php5 EXPOSE 80 VOLUME ["/var/www/html"] ENTRYPOINT service apache2 start && \ tail -f /var/log/apache2/access.log
PHP+Apacheで動いている普通のコンテナ。これを、ビルドして起動する。
docker build -t 74th/ap1 . docker run -d \ -v `pwd`/html:/var/www/html \ --name ap1 \ 74th/ap1
APコンテナのポイント
EXPOSE
でポート80を指定する。しかしdocker run
では、-p 80:80
などと外部に出したりしない。- ちゃんとコンテナ名
--name ap1
を付け、nginxから参照できるようにする。 VOLUME
で、コンテンツをコンテナと共有する。
起動していることを確認する。
$docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8f27081607b0 74th/ap1 "/bin/sh -c 'service 2 hours ago Up 2 hours 80/tcp ap1
次に、これにnginxからアクセスできるようにする。 nginxのDockerfileはこちら。
FROM debian:8.1 MAINTAINER 74th<site@j74th.com> RUN apt-get update RUN apt-get install -y nginx COPY ./default /etc/nginx/site-enabled/default EXPOSE 80 ENTRYPOINT service nginx start && \ tail -f /var/log/nginx/access.log
起動用のスクリプトは以下のとおり。
docker build -t 74th/frontnginx . docker run -d \ -p 80:80 \ --link ap1:ap1 \ --name frontnginx \ 74th/frontnginx
ここまでのポイントは、以下のとおり。
EXPOSE
で指定し、さらにdocker run -p 80:80
で、こちらは80番ポートを外部公開する。- コンテナ間リンク
--link
をAPコンテナに設定して起動する。 - nginxの設定ファイル
default.conf
を、書き換えてコンテナの中に入れる。
さて、このnginxの設定を、以下のようにする。
server { listen 80 default_server; listen [::]:80 default_server; # ap1 location / { proxy_pass http://ap1; } }
実は、--link
オプションで指定したエイリアスへは、/etc/hosts に設定が追加されるため、nginxのコンテナからはhttp://ap1
でAPコンテナにアクセスできる。これだけでOKなのである。
なんとも簡単。
ポイント
--link
で設定したAPコンテナをホスト名として、nginxからプロキシさせる