前期第08回 - oddmutou/jugyo-2025kyototech GitHub Wiki

今回の目標

  • データベースサーバー(MySQL)をDockerで起動できるように
  • Dockerコンテナ内のMySQLサーバーに接続して直接SQL文を叩いて操作できるように
  • PHPからMySQLに接続・操作できるように

MySQLやRDBMSについては2年生までの授業で習ったものとして進めます。分からないひとは復習してください。

MySQLをDockerで動かす

compose.yml を編集します。

vim compose.yml

内容は

https://github.com/oddmutou/jugyo-2025kyototech/blob/52b75558e51f23d9b84766d36a0a6dd8bf1ccb13/zenki_08/compose.yml

Dockerコンテナの中身は終了→起動で毎回リセットされる,使い捨てのようなものです。

データベースの中身を使いまわしたい(=永続化したい)場合は,MySQLの設定ファイルやデータベースの中身のファイルをコンテナの外側に設置してあげる必要があります。

compose.yml 内の volumes のところはそのためです。

Dockerコンテナ「mysql」内のMySQLサーバーに接続

mysqlコンテナ内で上がってるMySQLサーバーにMySQLクライアントを用い接続してみましょう。


Docker Compose で起動しているコンテナ内でコマンドを実行するためには,docker compose exec コマンドを用います。

docker compose exec 対象コンテナ名 コンテナ内で実行したいコマンド


既知かもしれませんが,MySQLのクライアントの起動は以下の通りです。

mysql 接続するデータベース名

接続するデータベース名 は,コンテナ立ち上げ時に決めたデータベース名をあてはめましょう。compose.yml内で環境変数 MYSQL_DATABASE として設定した値ですね。


結果として,今回作成したDockerコンテナ(コンテナ名はmysql)内のMySQLサーバーにmysqlコマンドで接続する場合は,以下のコマンドを叩くと良いでしょう。

docker compose exec mysql mysql example_db

PHPからMySQLサーバーに接続

PDO拡張を使います。

PDO拡張を導入するために,Dockerfileを書き換えましょう。

vim Dockerfile

内容は https://github.com/oddmutou/jugyo-2025kyototech/blob/52b75558e51f23d9b84766d36a0a6dd8bf1ccb13/zenki_08/Dockerfile

PDOの使い方は公式ドキュメントを読みましょう。

https://www.php.net/manual/ja/class.pdo.php

サンプルプログラム(PHPからMySQLサーバーに接続)

PHPからMySQLに接続する例として適当なテーブルに適当に行を挿入していくプログラムをつくります。

まず適当なテーブルをMySQLに作成します。直接接続してCREATE TABLE文を叩きます。

docker compose exec mysql mysql example_db

MySQLクライアントを起動したら以下のSQLを実行し,テーブルを作成します。

CREATE TABLE `hogehoge`(
    `text` TEXT NOT NULL,
    `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP
);

MySQLクライアントを終了する(接続を切断する)には, exit コマンドを叩くと良いでしょう。

テーブルができたら適当にINSERTしていくPHPのプログラムを書いていきます。

vim public/pdotest.php

内容は https://github.com/oddmutou/jugyo-2025kyototech/blob/52b75558e51f23d9b84766d36a0a6dd8bf1ccb13/zenki_08/public/pdotest.php

今までと同じく, http://`EC2インスタンスのIPアドレス`/pdotest.php にアクセスし,作ったPHPプログラムを実行してみましょう。

実際にデータが入ったかは,再度コンテナ内のMySQLに接続し,SQLを直接叩いて確認しましょう。

hogehogeテーブルの内容を確認するSQLの例

SELECT * FROM hogehoge;

該当ページへのアクセスのたびに行が増えていたら成功ですね。

演習

演習1

アクセスカウンタを作ってみましょう。

動作例: http://184.72.89.71/enshu1.php

実装例: https://github.com/oddmutou/jugyo-2025kyototech/commit/42410f8779162489307a76a0096b19c1c58af634

演習2

アクセスしてきたひとの接続元IPアドレス,UserAgent,アクセス日時を記録し,表示するページを作ってみましょう。

表示する際はアクセス日時の降順(新しいものが上にくる)で。

動作例: http://184.72.89.71/enshu2.php

実装例: https://github.com/oddmutou/jugyo-2025kyototech/commit/c91f1007c1897f9a9dbde43d6a5d52c3fbf83ddb

演習3

演習2でできたものは,行数(アクセス数)が増えてくると,そのうち破綻しますね。

発展させ,10行ごとにページを分けて表示するようにしてみましょう。

見た目も作り込んで,見やすくしてみましょう。

動作例: http://184.72.89.71/enshu3.php

実装例: https://github.com/oddmutou/jugyo-2025kyototech/blob/87035947e988c56232595f46e5e00cd48ed73596/zenki_08/enshu3.php