前期第08回 - oddmutou/jugyo-2025kyototech GitHub Wiki
今回の目標
- データベースサーバー(MySQL)をDockerで起動できるように
- Dockerコンテナ内のMySQLサーバーに接続して直接SQL文を叩いて操作できるように
- PHPからMySQLに接続・操作できるように
MySQLやRDBMSについては2年生までの授業で習ったものとして進めます。分からないひとは復習してください。
MySQLをDockerで動かす
compose.yml を編集します。
vim 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
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
今までと同じく, 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行ごとにページを分けて表示するようにしてみましょう。
見た目も作り込んで,見やすくしてみましょう。