4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?