はじめに
DockerでApache/PHP + MySQLを構成し、mysqli接続するPHPプログラムを実行したところ、以下のエラーが発生した。原因・対処方法を記載する。
Fatal error: Uncaught Error: Call to undefined function mysqli_connect() in /var/www/html/newdata.php:60 Stack trace: #0 {main} thrown in /var/www/html/xxx.php on line xx
システム環境
構成図
ディレクトリ構成
#ls -l ./*
-rw-r--r-- 1 root root 622 8月 13 18:35 ./docker-compose.yml
./mysqldb:
合計 8
-rw-r--r-- 1 root root 13 8月 13 18:36 Dockerfile
drwxr-xr-x 6 polkitd root 4096 8月 13 18:40 data
./webapp:
合計 8
-rw-r--r-- 1 root root 18 8月 13 18:37 Dockerfile
drwxr-xr-x 2 33 tape 4096 8月 13 18:44 htdocs
#
Docker関連ファイル
#cat docker-compose.yml
version: '3'
services:
mysqldb:
image: test-mysqldb:vrfy
build: ./mysqldb
hostname: mysqldb
networks:
- dockernet
volumes:
- ./mysqldb/data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: xxxxx
MYSQL_DATABASE: TESTDB
MYSQL_USER: test
MYSQL_PASSWORD: xxxxx
webapp:
image: test-webapp:vrfy
build: ./webapp
hostname: webapp
networks:
- dockernet
volumes:
- ./webapp/htdocs:/var/www/html
ports:
- "8099:80"
restart: always
depends_on:
- mysqldb
networks:
dockernet:
#
#cat ./webapp/Dockerfile
FROM php:7-apache
#
#cat ./mysqldb/Dockerfile
FROM mysql:5
#
エラーの原因
Docker Hubからpullしてきた「php:7-apache」に、mysqliモジュールが入っていなかったためだった。
対処方法
Dockerイメージをbuildする際、mysqliモジュールを追加する。
#cat ./webapp/Dockerfile
FROM php:7-apache
RUN docker-php-ext-install mysqli ★これを追加
#
再buildする。
#docker-compose build
Building mysqldb
Sending build context to Docker daemon 219.8MB
Step 1/1 : FROM mysql:5
---> 8cf625070931
Successfully built 8cf625070931
Successfully tagged test-mysqldb:vrfy
Building webapp
Sending build context to Docker daemon 38.4kB
Step 1/2 : FROM php:7-apache
---> 93e55f680811
Step 2/2 : RUN docker-php-ext-install mysqli
---> Using cache
---> 8068971802e9
Successfully built 8068971802e9
Successfully tagged test-webapp:vrfy
#
起動済みコンテナを一度停止・削除し、再buildしたイメージで再起動する。
#docker-compose down
Stopping test_webapp_1 ... done
Stopping test_mysqldb_1 ... done
Removing test_webapp_1 ... done
Removing test_mysqldb_1 ... done
Removing network test_dockernet
#
#
#docker-compose up -d
Creating network "test_dockernet" with the default driver
Creating test_mysqldb_1 ... done
Creating test_webapp_1 ... done
#
これでエラーなくmysqli接続できた。
phpinfoでもmysqliが表示されることを確認できた。
#echo '<?php phpinfo(); ?>' > ./webapp/htdocs/phpinfo.php
#cat ./webapp/htdocs/phpinfo.php
<?php phpinfo(); ?>
#
https://xxxxx/phpinfo.php