🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

1回答

1296閲覧

docker-compose,mysql,phpにおいて、sqlデータベースとhtml,phpファイルが生成されない問題

Ayanami

総合スコア0

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

0クリップ

投稿2021/03/11 17:24

前提・実現したいこと

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?>

試したこと

  1. 実行前にvolumeはすべて削除し、存在しないことを確認してからupを実行しました。
  2. 実行前に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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gpsoft

2021/03/12 11:21

同じ内容で試してみましたが、問題なさそうでした。 不思議ですね。 私のOSはLinuxなので、Windows独特の何かがあるのかな。 upしたとき、ターミナルに、エラーメッセージ的なものは出てませんか?
guest

回答1

0

問題1のデータベースが作成されていないのは、何らかの理由によって作成されていないだろうと言うところしか現状では分かりません。 docker-compose logs mysql を実行することで、何か原因がわかるかもしれませんので、まずはコマンドを実行して、次のようなログが出ているかどうかを確認されてみてはいかがでしょうか。

mysql_1 | 時間 [Note] [Entrypoint]: /usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/init.sql mysql_1 | 時間 [Note] [Entrypoint]: Stopping temporary server

もしこの Entrypoint でエラーが出ていれば、そのエラー内容を確認する必要があります。

問題2については、docker-compose.yaml の volume: 指定が原因です。index.html や index.php は phpapp イメージの中に作成されています。こちらのコマンドで確認できます。

$ docker run --entrypoint /usr/bin/ls -it phpapp -al /var/www/html

ただし、 docker-compose.yaml で、この /var/www/html をホスト側の ./app で上書きするボリュームのマウント指定があります。

volumes: - "./app:/var/www/html"

ホスト側の ./app には counter.php しかありませんので、index.html や index.php は見えなくなるのは、そのような設定をしているから、というのが理由になります。

投稿2021/04/03 07:54

zembutsu

総合スコア1584

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問