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)で起動すると、
- phpmyadmin コンテナの初回起動によって、/var/www/html 以下に PHPMyAdmin が展開される
- web コンテナの初回起動時によって/usr/local/apache2/に Apache が展開される。(/usr/local/apache2/htdocs に index.html が置かれる)
- 両方ともボリュームで共有されているため、後で起動したほう(httpd)で上書きされてしまう
- 結果アクセスすると 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
:
:
:
サブディレクトリのサンプル
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 によりマウントするため中身がなくなってしまうための模様