DockerでPHPのアプリを立ち上げてDB(MySQL)に接続する方法

DockerでPHPのアプリを立ち上げてDB(MySQL)に接続する方法

170 回閲覧されました

みなさんこんにちは、jonioです。

今回はPHPアプリをDockerで立ち上げるのとDBに接続する方法のメモになります。

私は初めて構築するので細かく分かっていないのをご了承下さい。

最終的なファイル構成

下記になります。

PHPプロジェクト --- Dockerfile
             |
              - docker-compose.yml
             |
              - mysql_custom.conf
             |
              - php.ini

Dockerfile

Dockerfileはアプリを立ち上げる為のコンテナ(アプリごとに独立して実行させる為の物みたいな感じ)のイメージ(コンテナを作成する為のファイルが集まった物みたいな感じ)を設定する為のファイルです。

コードを下記にします。

FROM php:7.2-apache

RUN apt-get update && apt-get install -y \
    libpng-dev \
    libjpeg-dev \
    libfreetype6-dev \
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install gd \
    && docker-php-ext-install pdo pdo_mysql

1行目を書かないとアプリを動作させることができないので必ず書きます。

意味は「phpのバージョンを7.2にしてwebサーバーはapatchを使う」ということになります。

3行目〜9行目はインストールする物を記述します。

「RUN apt-get update」はパッケージを最新の状態にするという意味です。

「apt-get install -y」はアプリを立ち上げるのに必要なパッケージをインストールして質問は全てy(イエス)と答えるという意味です。

下記は画像処理に関するパッケージをインストールする為に記述していますが必要なら書きます。

libpng-dev \
    libjpeg-dev \
    libfreetype6-dev \
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install gd \

DockerはDBにMySQLを使う場合はデフォルトでPDOができないようになっているみたいですが9行目を書くことでPDOをできるようにします。

docker-compose.yml

docker-comose.ymlは複数のコンテナを一括管理する為のファイルです。

コードを下記にします、インデントに意味があるので同じにして下さい。

version: '3'

services:
  php:
    build:
      context: .
    volumes:
      - .:/var/www/html
      - ./php.ini:/usr/local/etc/php/php.ini
      - ./logs:/var/log
    ports:
      - 8000:80
    container_name: php-container
  mysql:
    platform: linux/x86_64
    image: mysql:5.7
    volumes:
      - mysql_data:/var/lib/mysql
      - ./mysql_custom.cnf:/etc/mysql/conf.d/mysql_custom.cnf
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=blog
      - MYSQL_USER=user
      - MYSQL_PASSWORD=pass
    container_name: mysql5.7-trial2
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      PMA_HOST: mysql
      MYSQL_ROOT_PASSWORD: root
    ports:
      - 8080:80
    depends_on:
      - mysql
volumes:
  mysql_data:

mysql_custom.conf

コードを下記にします、DBで言語を日本語にする為の設定です。

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci

[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

php.ini

コードを下記にします、ログを出力する為に作成します。

error_reporting = E_ALL
display_errors = Off
log_errors = On
error_log = /var/log/php_errors.log

PHPアプリの立ち上げ

下記のコマンドのどちらかで立ち上げができます。

docker-compose up
docker-compose up -d

上はログが表示されて下はログが表示されません。

PHPアプリの停止

下記のコマンドです。

docker-compose down

PDO

コードを下記にします。

<?php
    class connect{
        const DB_NAME = "blog";
        const HOST = "mysql";
        const USER = "user";
        const PASS = "pass";

        private $dbh;

        public function __construct(){
            $dsn = "mysql:host=" . self::HOST . ";dbname=" .self::DB_NAME . ";charset=utf8mb4";

            try{
                $this->dbh = new PDO($dsn, self::USER, self::PASS);
            } catch(Exception $e) {
                exit($e->getMessage());
            }

            $this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
        }

        public function query($sql, $param = null) {
            $stmt = $this->dbh->prepare($sql);

            $stmt->execute($param);

            return $stmt;
        }
    }
?>

3行目〜6行目が個人的に大事だと思います、ここの設定が間違っていて1時間位悩みました。

3行目・5行目・6行目はdocker-compose.ymlの19行目・20行目・21行目を使います。

4行目のmysqlはdocker-compose.ymlの12行目のmysqlのことです。

テーブルの作成

dockerのコンテナの中のDBでテーブルを作成します。

コンテナの中に入るコマンドは下記になります。

docker exec -it php-container mysql -u user -p pass blog

「php-container」はdocker-compose.ymlの11行目で「blog」はdocker-compose.ymlの19行目です。

phpMyAdminにアクセス

docker-compose.ymlにphpMyAdminにアクセスする為の記述しています。

version: '3'

services:
  php:
    build:
      context: .
    volumes:
      - .:/var/www/html
      - ./php.ini:/usr/local/etc/php/php.ini
      - ./logs:/var/log
    ports:
      - 8000:80
    container_name: php-container
  mysql:
    platform: linux/x86_64
    image: mysql:5.7
    volumes:
      - mysql_data:/var/lib/mysql
      - ./mysql_custom.cnf:/etc/mysql/conf.d/mysql_custom.cnf
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=blog
      - MYSQL_USER=user
      - MYSQL_PASSWORD=pass
    container_name: mysql5.7-trial2
 
 
  //ここから
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      PMA_HOST: mysql
      MYSQL_ROOT_PASSWORD: root
    ports:
      - 8080:80
    depends_on:
      - mysql
  //ここまで
  
  
volumes:
  mysql_data:

「http://localhost:8080」にアクセスするとユーザー名とパスワードを入力しないといけないのでconnect.phpの「const USER = “user”;」のuser(ユーザー名)と「const PASS = “pass”;」のpass(パスワード)を入力すればphpMyAdminに入れます。