phpMyAdmin の Docker 版 FPM イメージを使う2

Nextcloud の Docker FPM バージョンの使い方に、volumes_from を使用して httpd と nextcloud のディレクトリを共有する使い方があったので、試してみる

バージョン 3 の docker-compose.yml で volumes_from を使う – Qiitaより、volumes_from は version 2 系の仕様のため、version 3 系で使用するには、最上位の volumes キーでボリュームを定義し、各サービスの volumes キーでそれを利用する形にする

サンプル

  • docker-compose.yml

    version: "3"
    
    services:
      db:
        image: mysql:8
        environment:
          MYSQL_ROOT_PASSWORD: pass
          MYSQL_DATABASE: my_db
          MYSQL_USER: my_user
          MYSQL_PASSWORD: my_pass
    
      web:
        build: web
        ports:
          - "80:80"
        volumes:
          - ./web/phpmyadmin.conf:/usr/local/apache2/conf/phpmyadmin.conf:ro
          - data:/usr/local/apache2/htdocs
        depends_on:
          - phpmyadmin
    
      phpmyadmin:
        image: phpmyadmin:fpm-alpine
        environment:
          PMA_HOST: db
        volumes:
          - data:/var/www/html
        depends_on:
          - db
    
    volumes:
      data:
    
  • web/Dockerfile

    FROM httpd:2-alpine
    RUN sed -i \
        -e 's/^#\(LoadModule .*proxy_module\)/\1/' \
        -e 's/^#\(LoadModule .*proxy_fcgi_module\)/\1/' \
        conf/httpd.conf
    RUN echo 'Include conf/phpmyadmin.conf' >> /usr/local/apache2/conf/httpd.conf
    
    
  • web/phpmyadmin.conf

    DirectoryIndex index.php
    
    ProxyPassReverse ^/(.*\.php) fcgi://phpmyadmin:9000/var/www/html/$1
    ProxyPassMatch ^/(.*\.php) fcgi://phpmyadmin:9000/var/www/html/$1
    
    

ポイント

  • 最上位でボリュームdataを定義し、phpmyadmin コンテナの*/var/www/htmlと web コンテナ(Apache)の/usr/local/apache2/htdocs*にマウントする
  • web コンテナは PHPMyAdmin へのプロキシ設定を追加するため、httpdイメージを元にカスタマイズする、前回はオリジナルの httpd.conf を元に変更した httpd.conf を追加していたが、今回は設定ファイルを分けて読み込む形にした
  • depends_onを使用して、web コンテナの起動は phpmyadmin コンテナの後にする、逆の順番(phpmyadmin → web)で起動すると、
    1. phpmyadmin コンテナの初回起動によって、/var/www/html 以下に PHPMyAdmin が展開される
    2. web コンテナの初回起動時によって/usr/local/apache2/に Apache が展開される。(/usr/local/apache2/htdocs に index.html が置かれる)
    3. 両方ともボリュームで共有されているため、後で起動したほう(httpd)で上書きされてしまう
    4. 結果アクセスすると index.html しかない状況になる

docker-compose upで db コンテナの起動の完了を待って http://localhost でアクセスすると PHPMyAdmin が表示される。

このとき、PHP ファイルは phpmyadmin コンテナ上の PHP-FPM で処理され、CSS や Javascript,画像類は web コンテナ上の Apache からレスポンスされるため、前回のようにContent-typeを再定義する必要なない

phpmyadmin_1  | 172.24.0.Z -  DD/MMM/YYYY:HH:II:SS +0000 "GET /index.php" 200
web_1       | 172.24.0.X - - [DD/MMM/YYYY:HH:II:SS +0000] "GET / HTTP/1.1" 200 5007
web_1       | 172.24.0.X - - [DD/MMM/YYYY:HH:II:SS +0000] "GET /themes/pmahomme/jquery/jquery-ui.css HTTP/1.1" 200 36566
web_1       | 172.24.0.X - - [DD/MMM/YYYY:HH:II:SS +0000] "GET /js/vendor/codemirror/addon/lint/lint.css?v=5.1.3 HTTP/1.1" 200 3035
web_1       | 172.24.0.X - - [DD/MMM/YYYY:HH:II:SS +0000] "GET /js/vendor/jquery/jquery.min.js?v=5.1.3 HTTP/1.1" 200 89501
web_1       | 172.24.0.X - - [DD/MMM/YYYY:HH:II:SS +0000] "GET /js/vendor/codemirror/addon/hint/show-hint.css?v=5.1.3 HTTP/1.1" 200 623
web_1       | 172.24.0.X - - [DD/MMM/YYYY:HH:II:SS +0000] "GET /js/vendor/codemirror/lib/codemirror.css?v=5.1.3 HTTP/1.1" 200 8709
web_1       | 172.24.0.X - - [DD/MMM/YYYY:HH:II:SS +0000] "GET /js/vendor/jquery/jquery-migrate.js?v=5.1.3 HTTP/1.1" 200 25300
:
:
:

image-20220414133025779

サブディレクトリのサンプル

http://localhost/phpMyAdmin のようにサブディレクトリで運用したいときは、httpd の volumes のマウント先と、プロキシの設定を URL のパスに合わせて変更するだけ

  • docker-compose.yml

           - "80:80"
         volumes:
           - ./httpd/phpmyadmin.conf:/usr/local/apache2/conf/phpmyadmin.conf:ro
    -      - data:/usr/local/apache2/htdocs
    +      - data:/usr/local/apache2/htdocs/phpMyAdmin
         depends_on:
           - phpmyadmin
    
  • web/phpmyadmin.conf

     DirectoryIndex index.php
    
    -ProxyPassReverse ^/(.*\.php) fcgi://phpmyadmin:9000/var/www/html/$1
    -ProxyPassMatch ^/(.*\.php) fcgi://phpmyadmin:9000/var/www/html/$1
    +ProxyPassReverse ^/phpMyAdmin/(.*\.php) fcgi://phpmyadmin:9000/var/www/html/$1
    +ProxyPassMatch ^/phpMyAdmin/(.*\.php) fcgi://phpmyadmin:9000/var/www/html/$1
    

ホスト側 Apache とつなげようとしたができなかった

ホスト上にある、MySQL と Apache に接続したくて、volumes を使って、PHPMyAdmin のコードをホスト上に展開させ、それ Apache から参照させつつ、PHP に関しては phpmyadmin コンテナに流す設定にしたかったが、./data に PHPMyAdmin のコードが展開されないためできなかった

docker-compose.yml

phpmyadmin:
  image: phpmyadmin:fpm-alpine
  environment:
    - PMA_HOST=host.docker.internal
  ports:
    - 9000:9000
  volumes:
    - ./data:/var/www/html
  extra_hosts:
    - "host.docker.internal:host-gateway"

Support request: How do you use the FPM version? · Issue #284 · phpmyadmin/docker · GitHubより、コンテナ構築時に/var/www/html に展開しているため、その後コンテナ開始時に volumes によりマウントするため中身がなくなってしまうための模様