Docker環境Apache/PHPにmysqliモジュールを追加インストール

IT技術

はじめに

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
タイトルとURLをコピーしました