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