前提・実現したいこと
docker-composeを使い、phpアプリケーションとmysqlデータベースをそれぞれ別のコンテナに実装して、httpdでやり取りをさせるテストプログラムを勉強用に動作させようとしています。ローカル環境はDocker Desktop for Windowsです。
以下のサイト様のプログラムをお手本に、現環境でも動くようにバージョンの変更などを行ったところです。
https://qiita.com/hiyuzawa/items/81490020568417d85e86
発生している問題・エラーメッセージ
問題1:コンテナmysqlにて、データベースtestが作成されることを期待していますが、下に示すように作成されていません。
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.06 sec)
また、以下はGoogleブラウザ上、http://localhost:8080/counter.phpで表示されたエラー文です。
データベースtestが存在しないことを指摘していると考えています。
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [1049] Unknown database 'test'' in /var/www/html/counter.php:9 Stack trace: #0 /var/www/html/counter.php(9): PDO->__construct('mysql:dbname=te...', 'root', 'secret') #1 {main} thrown in /var/www/html/counter.php on line 9
問題2:コンテナphpappにて、index.htmlとindex.phpがそれぞれ作成されることを期待していますが、下に示すように作成されていません。
[root@5ff0d7fc458d /]# ls var/www/html counter.php
該当のソースコード
ファイル構造
./app/counter.php ./mysql/init/init.sql ./mysql/data ./htdocs ./docker-compose.yml ./build/phpapp/Dockerfile
以下ソースコード
./docker-compose.yml
yml
1version: "2" 2services: 3 mysql: 4 image: mysql:5.7 5 ports: 6 - "3306:3306" 7 volumes: 8 - "./mysql/init:/docker-entrypoint-initdb.d" 9 - "./mysql/data:/var/lib/mysql" 10 environment: 11 - MYSQL_ROOT_PASSWORD=secret 12 command: --innodb-use-native-aio=0 13 phpapp: 14 image: phpapp 15 build: ./build/phpapp 16 volumes: 17 - "./app:/var/www/html" 18 ports: 19 - "8080:80"
./build/phpapp/Dockerfile
Dockerfile
1FROM centos:7 2 3RUN yum update -y \ 4 && yum install httpd php php-mysqli php-pdo -y \ 5 && echo "Hello from httpd" > /var/www/html/index.html \ 6 && echo "<?php phpinfo(); " > /var/www/html/index.php \ 7 && yum clean all 8 9EXPOSE 80 10 11ENTRYPOINT ["/usr/sbin/httpd", "-DFOREGROUND"]
./mysql/init/init.sql
sql
1CREATE DATABASE IF NOT EXISTS test; 2CONNECT test; 3 4CREATE TABLE IF NOT EXISTS counter ( 5 id INT AUTO_INCREMENT PRIMARY KEY, 6 create_at TIMESTAMP 7);
./app/counter.php
php
1<?php 2 ini_set( 'display_errors', 1 ); 3 date_default_timezone_set('Asia/Tokyo'); 4 5 $pdo = new PDO( 6 'mysql:dbname=test;host=mysql;charset=utf8mb4', 7 'root', 8 'secret' 9 ); 10 11 $stmt = $pdo->prepare("INSERT INTO counter () VALUE ()"); 12 $stmt->execute(); 13 14 $stmt = $pdo->prepare("SELECT * FROM counter ORDER BY id DESC limit 1"); 15 $stmt->execute(); 16 $row = $stmt->fetch(PDO::FETCH_ASSOC); 17 18 print_r($row); 19 20?>
試したこと
- 実行前にvolumeはすべて削除し、存在しないことを確認してからupを実行しました。
- 実行前にphpappイメージは削除し、存在しないことを確認してからupを実行しました。
REPOSITORY TAG IMAGE ID CREATED SIZE docker101tutorial latest c7b49e875a0d 27 hours ago 27.9MB mysql 5.7 d54bd1054823 12 days ago 449MB alpine/git latest a939554ad0d0 2 weeks ago 25.1MB nginx latest 35c43ace9216 3 weeks ago 133MB
また、以下のサイト様のプログラムを参考に、現環境でも動くようにバージョンの変更などを行ったところです。
https://qiita.com/hiyuzawa/items/81490020568417d85e86
変更内容:
./build/phpapp/Dockerfileにて、
php-mysql --> サービス終了によりphp-mysqliに変更。
FROM centos --> ブラウザ上http://localhost:8080/counter.phpでエラー文さえ表示されず503エラーが出たので、centos:7 にバージョンダウン。
補足情報(FW/ツールのバージョンなど)
動作環境:
Docker Desktop for Windows 3.2.1
Windows 10
Client: Docker Engine - Community Cloud integration: 1.0.9 Version: 20.10.5 API version: 1.41 Go version: go1.13.15 Git commit: 55c4c88 Built: Tue Mar 2 20:14:53 2021 OS/Arch: windows/amd64 Context: default Experimental: true Server: Docker Engine - Community Engine: Version: 20.10.5 API version: 1.41 (minimum version 1.12) Go version: go1.13.15 Git commit: 363e9a8 Built: Tue Mar 2 20:15:47 2021 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.4.3 GitCommit: 269548fa27e0089a8b8278fc4fc781d7f65a939b runc: Version: 1.0.0-rc92 GitCommit: ff819c7e9184c13b7c2607fe6c30ae19403a7aff docker-init: Version: 0.19.0 GitCommit: de40ad0