r.blog

docker-composeでPHP × MySQL環境を構築する

久しぶりにDockerを触ったら色々忘れていたので整理。
シンプルにPHP開発環境を作成する。

環境

  • MacBook Pro(M1チップ)
  • Docker(docker-compose)


ディレクトリ構成

php-mysql
├── /html
│   ├── index.php
│   └── Dockerfile
├── /mysql
└── docker-compose.yml


 index.php
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>PHP</title>
</head>
<body>
  <?php phpinfo(); ?>
</body>
</html>


docker-compose.ymlの作成

コンテナの設計図であるdocker-compose.ymlを記述。

version: '3' #このファイルのバージョン
services:    #起動するサービス(コンテナ)の設定定義

  mysql:  #「mysql」という名前でサービスを定義
    platform: linux/x86_64        #M1チップ対応のため追記
    container_name: mysql         #コンテナ名の設定
    image: mysql:8                #使用するイメージ
    volumes:                      #データのマウント設定
      - "./mysql:/var/lib/mysql"  #左辺がローカル、右辺がコンテナ
    environment:                  #環境変数の設定
      - MYSQL_ROOT_PASSWORD=root  #MySQLのrootユーザーのパスワード
      - MYSQL_DATABASE=db_test    #作成するDB名
      - MYSQL_USER=test           #ユーザー設定
      - MYSQL_PASSWORD=test       #ユーザーパスワード
      - TZ='Asia/Tokyo'           #タイムゾーンの設定
    command: --default-authentication-plugin=mysql_native_password  #mysql8用設定

  phpmyadmin:  #「phpmyadmin」という名前でサービスを定義
    container_name: phpmyadmin    #コンテナ名の設定
    image: phpmyadmin/phpmyadmin  #使用するイメージ
    environment:
      - PMA_ARBITRARY=1           #1で任意のサーバーへの接続が許可される
      - PMA_HOST=mysql            #MySQLサーバーのホスト名を定義
      - PMA_USER=test             #MySQLサーバーに接続するユーザー名
      - PMA_PASSWORD=test         #MySQLサーバーに接続するユーザーのパスワード
    ports:                        #ポート設定
       - "8080:80"                #左辺がローカル、右辺がコンテナ

  apache:  #「apache」という名前でサービスを定義
    container_name: apache        #コンテナ名の設定
    build: ./html/                #htmlフォルダにあるDockerfileからビルド
    volumes:                      #データのマウント設定
      - ./html:/var/www/html      #左辺がローカル、右辺がコンテナ
    ports:                        #ポート設定
      - "80:80"                   #左辺がローカル、右辺がコンテナ
    depends_on:                   #依存関係の定義 apache開始の前にmysqlを起動する
      - mysql


platform: linux/x86_64 はM1MacでMySQLを使うために必要な記述。
MySQLは8を使用。8から認証の方法が変わりそのままではエラーを起こすため、commandで追加の記述を行っています。

apacheでimageの指定をしていませんが、代わりにbulidでDockerfileのパスを指定しています。
Dockerfileを通してimageをビルドします。

Dockerfileの作成

imageの設計図であるDockerfileを記述。今回はPHPのimageのためのDockerfileを作成します。

FROM php:7.2-apache 
RUN apt-get update && apt-get install -y
RUN docker-php-ext-install pdo_mysql


FROM php:7.2-apacheでベースイメージを指定しています。
RUN apt-get update && apt-get install -yでパッケージ情報を更新し、パッケージをインストールしています。(-yは全ての問い合わせに Yes で答えるオプション)
RUN docker-php-ext-install pdo_mysqlはPDOのMySQLをインストールしています。

コンテナの起動

ターミナルでphp-mysqlディレクトリに移動し、下記のコマンドでコンテナを立ち上げる。ターミナル移動の仕方は割愛。

$ docker-compose up -d

-dはバックグラウンドでコンテナを実行するオプション。

$ docker container ls 

もしくはDocker Desktopでコンテナが立ち上がっていることを確認。

http://localhost/ でphpinfo が、
http://localhost:8080/で phpMyAdminが開けたらOKです👏

DBとの接続

念の為、DBとの接続を確認してみます。index.phpを下記のように変更。

 index.php
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>PHP</title>
</head>
<body>
<?php
  try {
    $db = new PDO('mysql:dbname=db_test;host=mysql','test','test');
    echo "接続されました";
  } catch (PDOException $e) {
    echo '接続エラー: ' . $e->getMessage();
  }
?>
</body>
</html>

new PDOの中の値は適宜変えてください。

http://localhost/ にアクセスし、「接続されました」と出ていたら成功です🎉
接続エラーの場合は、後半のエラー文を読んでググる。

コンテナの停止

$ docker-compose stop

もしくはDocker Desktopで停止ボタンをクリック。

参考サイト

https://idealump.com/service/lab/95
https://qiita.com/tarch710/items/1236a23f7ffde4c512f2
https://xn--t8j3bz04sl3w.xyz/mysql/php-mysql-connection/6793/
https://keruuweb.com/docker-mysql8で認証関連のエラーが発生したのでその対策/