Docker で PHP + SQLite3 の開発環境を構築する

SQLite を試験したくなったので、環境を Docker で作ることにしました。

ベースは CentOS7 + Apache + PHP7 (Composer, Xdebug) の開発環境を Docker で作る で。

構成

ディレクトリ構造

PROJECT_ROOT/
    │
      # 略
    │
    ├ sqlite/
    │
      # 略

SQLite 用のディレクトリを掘っただけで、後は同じです。

docker-compose.yml

version: '3.8'
services:
  web:
    build:
      context: ./apache/docker
      dockerfile: Dockerfile
      args:
        # 略
        SQLITE_TABLENAME: $SQLITE_TABLENAME
    labels:
      lamp.sqlite.php: "SQLite PHP"
    volumes:
      # 略
      # sqlite
      - ./sqlite:/var/sqlite/
      # 略
    entrypoint: bash -c "bash /workspace/entrypoint.sh $WEB_ROOT_DIRECTORY $WEB_DOMAIN $WEB_HOST_PORTNUM $WEB_CONTAINER_PORTNUM $WEB_HOST_PORTSSL $WEB_CONTAINER_PORTSSL $SQLITE_TABLENAME && /bin/bash"

docker-compose.yml も大部分は同じです。変数(SQLITE_TABLENAME)とボリュームがそれぞれ1つ増えたのと、 entrypoint へ渡す引数が1つ増えたくらいです。

.env

WEB_ROOT_DIRECTORY=sample_sqlite
WEB_DOMAIN=lvh.me
WEB_HOST_PORTNUM=8080
WEB_CONTAINER_PORTNUM=80
WEB_HOST_PORTSSL=4043
WEB_CONTAINER_PORTSSL=443
SQLITE_TABLENAME=maindb

上述の通り、 SQLite のファイル名を決める変数が増えました。

apache/docker/Dockerfile

FROM centos:centos7

# 略

# enable repository remi & remi-php74
RUN yum-config-manager --enable remi && yum-config-manager --enable remi-php74
# php
RUN yum -y install php php-devel php-pdo php-mysqlnd php-mbstring php-gd php-pear php-pecl-apc-devel zlib-devel php-xml php-mcrypt php-pecl-xdebug
# sqlite
RUN yum -y install sqlite sqlite-devel
# disable repository remi & remi-php74
RUN yum-config-manager --disable remi && yum-config-manager --disable remi-php74

# 略

# volume directory
RUN mkdir /template
RUN mkdir /var/www/${WEB_ROOT_DIRECTORY}
RUN mkdir /var/www/${WEB_ROOT_DIRECTORY}/web
RUN mkdir /workspace
RUN mkdir /var/sqlite

こちらも概ね同じ。 PHP のインストール直後に sqlite, sqlite-devel をインストールしています。また、最後にボリュームとしてマウントするディレクトリを作成しています。

workspace/entrypoint.sh

# 略

# make sqlite file & create dummy table
if [[ ! -e /var/sqlite/${7}.sqlite3 ]]; then
    echo ".exit" | echo "create table testtable(one varchar(10), two smallint);" | sqlite3 /var/sqlite/${7}.sqlite3
fi

# Apache start
/usr/sbin/httpd -DFOREGROUND &

entrypoint も同様ほぼ同じですが、 Apache 起動前に「もし SQLite のデータファイルが該当ディレクトリにない場合は作成」の処理を追加しました。テーブルがないとファイルが生成されなかったので、ダミーテーブルも CREATE しています。

検証

上述で構築された SQLite にダミーデータを流し込んでテストしてみます。

# sqlite3 /var/sqlite/maindb.sqlite3

sqlite> insert into testtable values('hello', 10);
sqlite .exit
#

まずはダミーテーブルにダミーデータを INSERT します。

<?php

try {
    $pdo = new PDO('sqlite:/var/sqlite/maindb.sqlite3');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
    $stmt = $pdo->prepare("SELECT * FROM testtable WHERE two >= :two");
    $stmt->execute([
        'two' => 5
    ]);
    $result = $stmt->fetchAll();
    var_dump($result);
}
catch (Exception $e) {
    echo $e->getMessage() . PHP_EOL;
}

次に上述のような index.php を作成し、Webアクセスします。

/var/www/sample_sqlite/web/index.php:25:
array (size=1)
  0 => 
    array (size=2)
      'one' => string 'hello' (length=5)
      'two' => string '10' (length=2)

結果。これで PHP から PDOオブジェクト 経由でダミーテーブルに接続できたので、ひとまず環境構築という点では完了です。

参考

この記事を書いた人

アルム=バンド

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。