riina-k.net

音楽・小説・プログラミングを手がけるリイナの拠点。

Docker Compose と nginx でリバースプロキシを作ろうとしたお話(解答編)

Docker Compose と nginx でリバースプロキシを作ろうとしたお話(出題編) の続き。
リバースプロキシでバーチャルホスト動かせました!!

今回作ったのは、riina-k.metest.riina-k.me 2つのバーチャルホスト。
改めて全体像を記します。
まずディレクトリ構成

/
+ var/
  + docker/
    + proxy/
      | docker-compose.yml <- Docker Compose 設定ファイル
      + nginx-proxy/
      | | Dockerfile <- nginx コンテナの設定ファイル
      | | nginx.conf <- コンテナにコピーする nginx の設定ファイル
      + vhosts/
        + riina-k.me/
        | | Dockerfile <- riina-k.me Apache コンテナの設定ファイル
        | | httpd.conf <- コンテナにコピーする Apache の設定ファイル
        | | php.ini <- コンテナにコピーする PHP の設定ファイル
        | + var/
        |   + www/
        |     + html/ <- riina-k.me のドキュメントルート
        |       | index.html <- <h1>riina-k.me</h1> とだけ書いてある
        + test.riina-k.me/
          | Dockerfile <- test.riina-k.me Apache コンテナの設定ファイル
          | httpd.conf <- コンテナにコピーする Apache の設定ファイル
          | php.ini <- コンテナにコピーする PHP の設定ファイル
          + var/
            + www/
              + html/ <- test.riina-k.me のドキュメントルート
                | index.html <- <h1>test.riina-k.me</h1> とだけ書いてある

各種設定ファイル
※今回の肝になった箇所(ハマった場所ともいう)を太字にしておきます。

/var/docker/proxy/docker-compose.yml

version: '3'

services:
  nginx-proxy:
    build: ./nginx-proxy
    restart: on-failure
    container_name: nginx-proxy
    privileged: true
    expose:
      - "80"
    ports:
      - "80:80"
    networks:
      - app-net

  apache.riina-k.me:
    build: ./vhosts/riina-k.me
    restart: on-failure
    container_name: apache.riina-k.me
    environment:
      VIRTUAL_HOST: riina-k.me
    expose:
      - "8080"
    ports:
      - "8080:8080"
    volumes:
      - ./vhosts/riina-k.me/var/www/html:/var/www/html
    networks:
      - app-net

  apache.test.riina-k.me:
    build: ./vhosts/test.riina-k.me
    restart: on-failure
    container_name: apache.test.riina-k.me
    environment:
      VIRTUAL_HOST: test.riina-k.me
    expose:
      - "8081"
    ports:
      - "8081:8081"
    volumes:
      - ./vhosts/test.riina-k.me/var/www/html:/var/www/html
    networks:
      - app-net

networks:
  app-net:
    driver: bridge

/var/docker/proxy/nginx-proxy/Dockerfile

FROM nginx:alpine
COPY ./nginx.conf /etc/nginx/nginx.conf

EXPOSE 80

/var/docker/proxy/nginx-proxy/nginx.conf

user nginx;
worker_processes auto;

events {
    worker_connections 1024;
}

http {
    sendfile on;

    upstream me_servers {
        server apache.riina-k.me:8080;
    }
    upstream test_servers {
        server apache.test.riina-k.me:8081;
    }

    server {
        listen 80;
        server_name riina-k.me;

        proxy_set_header Host $host;

        location / {
            proxy_pass http://me_servers/;
        }
    }

    server {
        listen 80;
        server_name test.riina-k.me;

        proxy_set_header Host $host;

        location / {
            proxy_pass http://test_servers/;
        }
    }
}

/var/docker/proxy/vhosts/riina-k.me/Dockerfile

FROM centos:latest

RUN yum -y update
RUN yum -y install httpd
RUN rm -f /etc/httpd/conf.d/welcome.conf
RUN yum install -y php | true 
RUN yum install -y net-tools | true

COPY ./httpd.conf /etc/httpd/conf/
COPY ./php.ini /etc/

EXPOSE 8080

CMD /usr/sbin/httpd -DFOREGROUND

/var/docker/proxy/vhosts/riina-k.me/httpd.conf

(略)
Listen 8080
(略)
ServerName riina-k.me:8080
(略)

/var/docker/proxy/vhosts/riina-k.me/php.ini

特に変わったことはしてないので省略


/var/docker/proxy/vhosts/riina-k.me/var/www/html/index.html

<h1>riina-k.me</h1>

ここまでは前回と同様。

以下、新たに切ったサブドメイン関連のファイル。
ポートが被ると Docker から怒られたので、8081 に変えています。ていうかそれ以外一緒のはず。

/var/docker/proxy/vhosts/test.riina-k.me/Dockerfile

FROM centos:latest

RUN yum -y update
RUN yum -y install httpd
RUN rm -f /etc/httpd/conf.d/welcome.conf
RUN yum install -y php | true 
RUN yum install -y net-tools | true

COPY ./httpd.conf /etc/httpd/conf/
COPY ./php.ini /etc/

EXPOSE 8081

CMD /usr/sbin/httpd -DFOREGROUND

/var/docker/proxy/vhosts/test.riina-k.me/httpd.conf

(略)
Listen 8081
(略)
ServerName test.riina-k.me:8081
(略)

/var/docker/proxy/vhosts/test.riina-k.me/php.ini

特に変わったことはしてないので省略


/var/docker/proxy/vhosts/test.riina-k.me/var/www/html/index.html

<h1>test.riina-k.me</h1>

以上の設定で Docker Compose を実行すると

[root@riina-02 proxy]# docker ps
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                    NAMES
d4673bbfa4a5        proxy_nginx-proxy              "nginx -g 'daemon of…"   5 seconds ago       Up 3 seconds        0.0.0.0:80->80/tcp       nginx-proxy
d48a93f0cb93        proxy_apache.riina-k.me        "/bin/sh -c '/usr/sb…"   5 seconds ago       Up 3 seconds        0.0.0.0:8080->8080/tcp   apache.riina-k.me
94765db7608b        proxy_apache.test.riina-k.me   "/bin/sh -c '/usr/sb…"   5 seconds ago       Up 3 seconds        0.0.0.0:8081->8081/tcp   apache.test.riina-k.me
[root@riina-02 proxy]# curl riina-k.me
<h1>riina-k.me</h1>
[root@riina-02 proxy]# curl riina-k.me:8080
<h1>riina-k.me</h1>
[root@riina-02 proxy]# curl riina-k.me:8081
<h1>test.riina-k.me</h1>
[root@riina-02 proxy]# curl test.riina-k.me
<h1>test.riina-k.me</h1>
[root@riina-02 proxy]# curl test.riina-k.me:8080
<h1>riina-k.me</h1>
[root@riina-02 proxy]# curl test.riina-k.me:8081
<h1>test.riina-k.me</h1>

なんか微妙に変な動きしてるけど、基本的には「8080 でアクセスしたら riina-k.me」、「8081 でアクセスしたら test.riina-k.me」、デフォルトポートの場合はそれぞれのドメインを見に行くようになりました。
あとは 8080 と 8081 を塞げば大丈夫かなぁ。

いやーホスト名とコンテナ名の取り違えは盲点でした……
nginx 初体験なので、まだまだ足りない設定とかあると思いますが、ひとまず動いたよーというご報告でした。


3/9 17:28追記

変に開いていた 8080 と 8081 を塞ぎ、それと Apache コンテナ側のポートを 8080 に統一しました。
外向きのポートが開いてたから、ポートが被ると怒られてたんですね……

/var/docker/proxy/docker-compose.yml

(略)
  apache.riina-k.me:
    build: ./vhosts/riina-k.me
    restart: on-failure
    container_name: apache.riina-k.me
    environment:
      VIRTUAL_HOST: riina-k.me
    expose:
      - "8080"
    ports:
      - "8080:8080" <- 削除
    volumes:
      - ./vhosts/riina-k.me/var/www/html:/var/www/html
    networks:
      - app-net

  apache.test.riina-k.me:
    build: ./vhosts/test.riina-k.me
    restart: on-failure
    container_name: apache.test.riina-k.me
    environment:
      VIRTUAL_HOST: test.riina-k.me
    expose:
      - "8081"
    ports:
      - "8081:8081" <- 削除
    volumes:
      - ./vhosts/test.riina-k.me/var/www/html:/var/www/html
    networks:
      - app-net
(略)

/var/docker/proxy/nginx-proxy/nginx.conf

(略)
    upstream me_servers {
        server apache.riina-k.me:8080;
    }
    upstream test_servers {
        server apache.test.riina-k.me:8081;
        server apache.test.riina-k.me:8080; <- ポート変更
    }
(略)

/var/docker/proxy/vhosts/test.riina-k.me/Dockerfile

FROM centos:latest

RUN yum -y update
RUN yum -y install httpd
RUN rm -f /etc/httpd/conf.d/welcome.conf
RUN yum install -y php | true 
RUN yum install -y net-tools | true

COPY ./httpd.conf /etc/httpd/conf/
COPY ./php.ini /etc/

EXPOSE 8081
EXPOSE 8080 <- ポート変更

CMD /usr/sbin/httpd -DFOREGROUND

/var/docker/proxy/vhosts/test.riina-k.me/httpd.conf

(略)
Listen 8081
Listen 8080 <- ポート変更
(略)
ServerName test.riina-k.me:8081
ServerName test.riina-k.me:8080 <- ポート変更
(略)

この設定で動かしてみると

[root@riina-02 proxy]# docker ps
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                NAMES
a558eb7b47fc        proxy_apache.test.riina-k.me   "/bin/sh -c '/usr/sb…"   12 seconds ago      Up 8 seconds        8080/tcp             apache.test.riina-k.me
193e25e7bf5a        proxy_apache.riina-k.me        "/bin/sh -c '/usr/sb…"   12 seconds ago      Up 8 seconds        8080/tcp             apache.riina-k.me
48e657d732d5        proxy_nginx-proxy              "nginx -g 'daemon of…"   12 seconds ago      Up 8 seconds        0.0.0.0:80->80/tcp   nginx-proxy

2つの Apache コンテナがちゃんと同じポートで動いてます。

[root@riina-02 proxy]# curl riina-k.me
<h1>riina-k.me</h1>
[root@riina-02 proxy]# curl riina-k.me:8080
curl: (7) Failed connect to riina-k.me:8080; 接続を拒否されました
[root@riina-02 proxy]# curl riina-k.me:8081
curl: (7) Failed connect to riina-k.me:8081; 接続を拒否されました
[root@riina-02 proxy]# curl test.riina-k.me
<h1>test.riina-k.me</h1>
[root@riina-02 proxy]# curl test.riina-k.me:8080
curl: (7) Failed connect to test.riina-k.me:8080; 接続を拒否されました
[root@riina-02 proxy]# curl test.riina-k.me:8081
curl: (7) Failed connect to test.riina-k.me:8081; 接続を拒否されました

無事、余計なポートが塞がりました。

SSL編へ続く

  1. コメント 0

  1. トラックバック 0

return top