View on GitHub

technote

devcontainer.json

{
  "name": "php-dev",
  "dockerComposeFile": "docker-compose.yml",
  "service": "php",
  "workspaceFolder": "/var/www/html",
  "remoteEnv": {
    "ENV_FILE": "/var/www/html/.env"
  },
  "settings": {
    "terminal.integrated.shell.linux": "/bin/bash"
  },
  "extensions": [
    "felixfbecker.php-debug",
    "xdebug.php-pack"
  ],
  "postCreateCommand": "docker-php-ext-install mysqli"
}

docker-compose.yml

version: "3.8"

services:
  php:
    build: .
    volumes:
      - ../src:/var/www/html
    ports:
      - "8888:80"
    depends_on:
      - db
    environment:
      DB_HOST: db
      DB_PORT: 3306
      DB_DATABASE: appdb
      DB_USER: user
      DB_PASSWORD: *

  db:
    image: mariadb:10.5
    restart: always
    environment:
      MARIADB_DATABASE: appdb
      MARIADB_USER: user
      MARIADB_PASSWORD: *
      MARIADB_ROOT_PASSWORD: rootpass
    ports:
      - "3306:3306"
    volumes:
      - db-data:/var/lib/mysql

volumes:
  db-data:

Dockerfile

FROM php:7.4-apache

RUN apt-get update && apt-get install -y \
    libpng-dev \
    libjpeg-dev \
    libonig-dev \
    libxml2-dev \
    zip \
    unzip \
    curl \
    mariadb-client \
    && docker-php-ext-install pdo pdo_mysql mysqli

# Enable Apache mod_rewrite
RUN a2enmod rewrite

# Set working directory
WORKDIR /var/www/html

index.php

<?php
$host = getenv('DB_HOST');
$db   = getenv('DB_DATABASE');
$user = getenv('DB_USER');
$pass = getenv('DB_PASSWORD');
$port = getenv('DB_PORT');

$dsn = "mysql:host=$host;port=$port;dbname=$db;charset=utf8";

try {
    $pdo = new PDO($dsn, $user, $pass);
    echo "DB接続成功!";
} catch (PDOException $e) {
    echo "DB接続エラー: " . $e->getMessage();
}
?>

.env.sample

DB_HOST=db
DB_PORT=3306
DB_DATABASE=appdb
DB_USER=user
DB_PASSWORD=*