APのコンテナが複数あって、それを1つのnginxからリバースプロキシして振り分けることをしてみる。
まず、APコンテナは以下のDockerfileとする。
ap1/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で動いている普通のコンテナ。これを、ビルドして起動する。
ap1/buildstart.sh
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はこちら。
frontnginx/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
起動用のスクリプトは以下のとおり。
frontnginx/buildstart.sh
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の設定を、以下のようにする。
default
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からプロキシさせる