LoginSignup
4
4

More than 3 years have passed since last update.

DockerでPHPの環境構築をする方法 〜docker-compose.yml〜(PDOが使用できます)

Last updated at Posted at 2021-02-01

PHP、Apache、MySQL、phpMyAdminをdocker-compose.ymlで一気に構築する。
なお、MySQLにはtestデータベースがあり、userテーブルの中に、usernameemailのカラムがある。

ディレクトリ構成

Desktop/docker
           ├html
           │  └index.php
           ├php
           │  ├Dockerfile
           │  └php.ini
           ├docker-compose.yml
           ├my.conf

デスクトップ上にDockerというディレクトリを作成し、その中に各ディレクトリ、ファイルを作成している。

#各ファイルの中身

html/index.php

PDOクラスで必要とするhostは、localhostではなくmysqlの任意でつけたコンテナ名を記載する。
ユーザ名とパスワードもdocker-compose.ymlで記載したものを記述する。

index.php
<?php
function connect_db(){
    //ホスト名、データベース名、文字コードの3つを定義する
    $host = 'mysql5.7';
    $db = 'test';
    $charset = 'utf8';
    $dsn = "mysql:host=$host; dbname=$db; charset=$charset";

    //ユーザー名、パスワード
    $user = 'test';
    $pass = 'test';

    //オプション
    $options = [
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES   => false,
    ];

    try{

        //上のデータを引数に入れて、PDOインスタンスを作成
        $pdo = new PDO($dsn, $user, $pass, $options);

    }catch(PDOException $e){
        echo $e->getMessage();
    }

    //PDOインスタンスを返す
    return $pdo;
}

//データベースと接続して、PDOインスタンスを取得
$pdo = connect_db();

//実行したいSQLを準備する
$sql = 'SELECT * FROM user';
$stmt = $pdo->prepare($sql);

//SQLを実行
$stmt->execute();

//データベースの値を取得
$result = $stmt->fetchall();
?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <?php
    foreach($result as $r){
        echo 'username: '. $r['username'];
        echo '<br>';
        echo 'email: '. $r['email'];
        echo '<hr>';
    }
    ?>
</body>
</html>

php/Dockerfile

ベースイメージのphp:7.2-apacheはデフォルトではどうやらPDOクラスを使用できないらしいから、Dockerfileにて記載。

Dockerfile
FROM php:7.2-apache
# PDOを使用できるようにする
RUN docker-php-ext-install pdo_mysql

php/php.ini

php.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

docker-compose.yml

docker-compose.yml
version: '3'

services:
  php:
    build: ./php
    volumes:
      - ./php/php.ini:/usr/local/etc/php/php.ini
      - ./html:/var/www/html
    ports:
      - 8080:80
    container_name: php7.2

  mysql:
    image: mysql:5.7
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    volumes:
      - ./mysql:/var/lib/mysql
      - ./my.cnf:/etc/mysql/conf.d/my.cnf
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=test
      - MYSQL_USER=test
      - MYSQL_PASSWORD=test
      - "TZ=Asia/Tokyo"
    container_name: mysql5.7

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=mysql
      - PMA_USER=test
      - PMA_PASSWORD=test
    links:
      - mysql
    ports:
      - 4040:80
    volumes:
      - ./phpmyadmin/sessions:/sessions
    container_name: phpmyadmin

my.cnf

デフォルトだと、文字コードがlatinになっているから、utf-8に変更するためのファイル

my.cnf
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci

[client]
default-character-set=utf8

コンテナの作成と開始

それぞれのファイルに記述したら、ターミナルでDockerディレクトリの配下をカレントディレクトリとし、docker-composeコマンドを実行する。
docker-compose.ymlのある場所をカレントディレクトリとすること。

terminal
docker-compose up -d

動作確認

webサーバ

localhost:8080/index.phpにアクセスする。

phpMyAdmin

localhost:4040にアクセスする。

おまけ コマンドメモ

サービスの停止

docker-compose stop

サービスの開始(既にコンテナが存在する場合)

docker-compose start

コンテナの削除

docker-compose down

イメージの一括削除

docker images -aq | xargs docker rmi
4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4