🥳

NGINX UnitでAdminer (Docker-compose)

2021/07/01に公開

docker-composeで構築したWordPressにAdminerを追加してみました。

今回の目標

  • 公式のイメージを使わず、独自のAdminerコンテナを作成する。
  • Adminerコンテナ内のNGINX UnitをAdminerが動作するアプリケーションサーバーとして設定する。
  • ホストと通信できるNGINXコンテナからadminerコンテナへのリバースプロキシを設定する。
  • ホストから指定したURLへアクセスすることで、Adminerのログイン画面が開く。
  • ログイン後、AdminerからmariaDBコンテナ内に保存されたWordPressのデータベースの情報が確認できる。

Dockerイメージの作成

諸般の事情で公式のイメージを利用できないため、Dockerfileの作成から始めました。
公式のガイド等を参考にNGINX UnitとAdminerの動作に必要そうなパッケージとAdminer本体を追加します。
NGINX Unitの設定を定義したjsonファイルとAdminerのCSSをコピーした後、NGINX Unitの設定をREST APIから読み込みます。
今回、CSSファイルは公式のpepa-linha-darkを使用しました。
NGINXコンテナと通信するポートをEXPOSEしてNGINX Unitをノーデーモンで起動、
最終的にDockerfileは以下のようになりました。

Dockerfile
FROM alpine:3.13.5

RUN set -x \
    && apk update \
    && apk add --no-cache \
    curl \
    unit \
    unit-php7 \
    php \
    php7-mysqli \
    php7-session

RUN mkdir -p /var/www/html \
    && curl -L https://github.com/vrana/adminer/releases/download/v4.8.1/adminer-4.8.1.php \
    > /var/www/html/adminer.php

COPY ./conf/config.json /tmp/config.json
COPY ./conf/adminer.css /var/www/html/adminer.css
RUN unitd \
    && curl -X PUT -d @/tmp/config.json --unix-socket /run/control.unit.sock http://localhost/config \
    && chmod +r /var/www/html/adminer.css

EXPOSE 8300

CMD [ "unitd", "--no-daemon" ]

config.jsonでは、EXPOSEしたポート8300をlistenし、デフォルトドキュメントとしてadminer.phpを設定、同じディレクトリに設置したadminer.cssへリクエストがあった時は静的ファイルとして返せるようルートの設定を行いました。
参考: NGINX Unit Static Files

config.json
{
  "listeners": {
    "*:8300": {
      "pass": "routes"
    }
  },
  "routes": [
    {
      "match": { //cssファイルへのリクエストはファイルを返す。
        "uri": ["/adminer.css"]
      },
      "action": {
        "share": "/var/www/html/"
      }
    },
    {
      "action": {
        "pass": "applications/adminer"
      }
    }
  ],
  "applications": {
    "adminer": {
      "type": "php",
      "root": "/var/www/html/",
      "index": "adminer.php"
    }
  }
}

NGINXコンテナの設定

NGINXコンテナには、ポートの公開とリバースプロキシの設定を追加します。

Dockerfile
+ EXPOSE 8300
nginx.conf
server {
  ~~~~~~
+   location /adminer/ { # https://localhost/adminer/へのリクエストはNGINX Unitへ
+       proxy_pass http://adminer:8300/;
+   }
  ~~~~~~
}

docker-composeの設定

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

docker-compose.yml
version: "3"

networks:
    network:
        driver: bridge

services:
    nginx:
        networks:
            - network

    mariadb:
        networks:
            - network

+   adminer:
+       build:
+           context: ./adminer
+       container_name: adminer
+       restart: always
+       networks:
+           - network #NGINX, mariaDBと同一ネットワーク

動作確認

これで一通りの設定が終わったので、サービス起動後https://localhost/adminer/にアクセスすることでAdminerが動作してることが確認できると思います。

Adminer開けた!

WordPressのデータベースのホスト、ユーザー名、パスワードを使って…

データベースが確認できた!

データベースにアクセスできました!
これで終わりです。
今回は、動作確認が目的なのでセキュリティ等に問題があるかもしれません。
記事の内容に誤りがあったらコメントいただけると幸いです。
読んでくださってありがとうございました。

Discussion