パパエンジニアのポエム

奥さんと娘ちゃんへの愛が止まらない

PHPとnginxとMySQLをdocker-composeでミニマム構築

ちょっとPHP触ってみたくなったのでnginxMySQLなWebアプリケーションをdocker-composeで構築してみる。

PHPの環境構築

PHPの実行環境をnginxで構築する場合、PHP-FPMを使いやり取りを行うらしい。
nginx と PHP-FPM の仕組みをちゃんと理解しながら PHP の実行環境を構築する - Qiita

php.iniファイルが↓

[Date]
date.timezone = "Asia/Tokyo"

[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

Dockerfileが↓

FROM php:fpm-alpine

COPY php.ini /usr/local/etc/php/

RUN docker-php-ext-install mysqli pdo pdo_mysql mbstring

nginxの環境構築

nginxのパラメータは正直ググりながら適当にやったら動いたという代物笑。
本格的に使うときにちゃんと調べる。

server {
    listen 80;
    server_name _;
 
    root  /var/www/html;
    index index.php index.html;
 
    access_log /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log;
 
    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }
 
    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_index index.php;    
        fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include       fastcgi_params;
    }
}

index.php

何を表示しようかと思ったけど、とりまDBに接続できてればよいかという発想で書いた。

<?php

printf("%s\n", date("Y/m/d H:i:s"));

$db = new mysqli("php-db", "root", "zaqroot", "test");

if ($db->connect_errno) {
  echo $db->connect_errno . " : " . $db->connect_error;
  exit();
}

$arr = $db->query("SELECT * FROM hoge");
while ($val = $arr->fetch_assoc()) {
  var_dump($val);
}

$db->close()

?>

docker-compose

肝心のdocker-composeファイルがこちら。
MySQLlatestを使ってます。

version: '3'
services:
  nginx:
    image: nginx:alpine
    container_name: php-nginx
    ports:
      - 8000:80
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf
      - ./www/html:/var/www/html
    depends_on:
      - php
  php:
    build: ./php
    container_name: php-app
    ports:
      - 9000:9000
    volumes:
      - ./www/html:/var/www/html
    depends_on:
      - db
  db:
    image: mysql:latest
    container_name: php-db
    ports:
      - 13306:3306
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      - "MYSQL_USER=root"
      - "MYSQL_ROOT_PASSWORD=zaqroot"
      - "TZ=Asia/Tokyo"
    volumes:
      - ./mysql/data:/var/lib/mysql

出来たものがこちら

GitHub - yuki-toida/php-tutorial

感想

全然わからないが、なんとなくPHPを生のまま書くのは死ねる気がする。
一旦Laravel使ってみてからじゃないと評価できなそう。
というわけで次回はLaravel使う。