docker上のnginxから、別のコンテナのwebへリバースプロキシさせる

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からプロキシさせる