nginx リバースプロキシの後ろの plantuml を VM 管理から docker-compose に変更する

目的

仮想マシンで提供していた plantuml-server を Docker コンテナーに変更します。

plantuml-server は↓を tomcat で稼働させていました。 github.com

前提

nginx を docker-compose でリバースプロキシとして利用している

https://example.com/plantuml/ で plantuml サーバーを提供しています。

/plantuml にアクセスすると nginx が仮想マシン (192.0.2.170) に転送するようにしています。1

    location /plantuml/ {
        # etc...
        proxy_pass http://192.0.2.170:8080;
    }

修正内容

サブディレクトリー対応するよう plantuml/Dockerfile を作成

Docker Hub に plantuml-server があります。 が、サブディレクトリー (/plantuml) に対応していないため、そのままでは利用できません。 https://example.com にアクセスすると plantuml server が見られる状態を https://example.com/plantuml に変えたいです。

Jetty は war の名前を変えると対応できるので、以下の Dockerfile を書きます。

FROM plantuml/plantuml-server:jetty

ARG BASE_URL=plantuml
RUN mv /var/lib/jetty/webapps/ROOT.war /var/lib/jetty/webapps/$BASE_URL.war

(ROOT.war は特殊なファイル名のようです。https://example.com/ROOT ではなく https://example.com へのアクセスで公開されるアプリケーションになります。)

docker-compose.yml への追加

docker-compose.yml からの相対パスplantuml/Dockerfile の位置に、先程の Dockerfile を配置します。

docker-compose.yml に plantuml サービスを追加します。

plantuml:
  build: ./plantuml/
  restart: always

また、nginx サービスに plantuml へのネットワーク接続を追加します。

 nginx:
   image: nginx:1.14.2-alpine
   volumes:
     - ./files/nginx/etc/letsencrypt:/etc/letsencrypt
     - ./nginx/conf.d:/etc/nginx/conf.d
   ports:
     - 192.0.2.146:443:443
   restart: always
+  links:
+    - plantuml

docker-compose を再起動します。

docker-compose build && (docker-compose down; docker-compose up -d)

nginx 設定の修正・適用

nginx/conf.d/default.conf を修正します。

-        proxy_pass http://192.0.2.170:8080;
+        proxy_pass http://plantuml:8080;

nginx プロセスの設定を更新します。

docker-compose exec nginx nginx -s reload

疑問点

plantuml/plantuml-server:jetty の Dockerfile では ARG でサブディレクトリーが指定されています。 docker-compose で args を指定できるのは build (image ではなく) のときなので使いませんでした。

docker-compose.yml で完結せずに Dockerfile を作らないといけないのは収まりが悪いですが、実はどうにかできるのでしょうか。


  1. 192.0.2.0/24 は例示用 IPv4 アドレス https://tools.ietf.org/html/rfc5737