My開発メモ

dockerのPHPコンテナからmysqlコンテナに接続する

結論

Docker内のphpコンテナからmysqlコンテナに接続する場合、ホスト名として、”localhost” ではなく、”コンテナ名” を指定しなくてはならない。

状況

次のようなDockerコンテナがある。

$ docker-compose ps
    Name                  Command               State                     Ports                   
--------------------------------------------------------------------------------------------------
mylamp-mysql   docker-entrypoint.sh mariadbd    Up      0.0.0.0:43306->3306/tcp,:::43306->3306/tcp
mylamp-pma     /docker-entrypoint.sh apac ...   Up      0.0.0.0:5000->80/tcp,:::5000->80/tcp      
mylamp-web     docker-php-entrypoint apac ...   Up      0.0.0.0:8080->80/tcp,:::8080->80/tcp      

このとき、以下のような PHPコードでデータベースに接続したいとする。

<?php
$host = "localhost:3306";
$user = "root";
$pass = "root";
$dbname = "testdb";
$dsn = "mysql:host={$host};dbname={$dbname};charset=utf-8";

try {
  $pdo = new PDO($dsn, $user, $pass);
  $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
  $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  echo "データベースに接続しました。";
} catch (PDOException $e) {
  echo $e->getMessage(), PHP_EOL;
  echo $e->getTraceAsString();
  exit;
}

これで実行すると、接続エラーが出る。

この場合、ホスト名をコンテナ名で指定するとうまくいく。

$host = "mylamp-mysql:3306";

参考資料

docker-compose.yml
version: '3.7'

services:
  web-server:
    build:
      dockerfile: php.Dockerfile
      context: .
    restart: always
    volumes:
      - "./www/:/var/www/"
    ports:
      - "8080:80"
    container_name: "mylamp-web"
    environment:
      TZ: Asia/Tokyo
      
  mysql-server:
    image: mariadb
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
      TZ: Asia/Tokyo
      LANG: ja_JP.UTF-8
    volumes:
      - "./mysql-data:/var/lib/mysql"
      - "./sql/init.sql:/docker-entrypoint-initdb.d/init.sql"
      - "./conf.mysql/charset.cnf:/etc/mysql/conf.d/charset.cnf"
    ports:
      - "43306:3306"
    container_name: "mylamp-mysql"

  phpmyadmin:
    image: phpmyadmin/phpmyadmin:latest
    restart: always
    environment:
      PMA_HOST: mysql-server
      PMA_USER: root
      PMA_PASSWORD: root
    ports:
      - "5000:80"
    container_name: "mylamp-pma"
      
volumes:
  mysql-data:
php.Dockerfile
FROM php:8.2-apache

# 必要なツール類
RUN apt-get update
RUN apt-get -y install wget unzip vim less tzdata

RUN docker-php-ext-install mysqli pdo pdo_mysql

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

COPY ./apache2/mini-blog.conf /etc/apache2/sites-available/
RUN a2dissite 000-default
RUN a2ensite mini-blog

RUN apt-get clean

カテゴリー: Docker, mariadb, memo, mysql, php

タグ: connect, Docker, mysql, PDO, php, コンテナ

カウント: 137