質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

1回答

1236閲覧

ローカル開発環境 (docker) の DB に socket を用いて接続しようとすると Address not available になります。

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

0クリップ

投稿2021/11/10 14:21

編集2021/11/21 07:03

前提・実現したいこと

構築したローカルの Docker 開発環境にて
PHP の PDO を使って、ソケット経由で DB 接続テストをしたいです。
このために必要な処置につきまして、何卒ご教授ください。

※ 補足
後述の通り TCP 経由で接続テストはできておりますが
後学のために勉強させて頂きたく、質問をいたしました。
よろしくお願いいたします。

発生している問題・エラーメッセージ

// 下記の signup.php プログラムを chrome 上で実行した結果です SQLSTATE[HY000] [2002] Address not available

当エラーに関する情報は非常に多くありましたが
自力でこの問題を解決することができませんでした。

該当のソースコード

<PHP> signup.php ``` <?php

// 簡素な入力フォームから POST データを取得して、DB 接続テストをしようとしています。

require_once('config/config.php');

try {
$pdo = new PDO(DSN, DB_USER, DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (Exception $e) {
echo $e->getMessage() . PHP_EOL;
}

try {
$stmt = $pdo->prepare("insert into users(email, password) value(?, ?)");
$stmt->execute([$email, $password]);
echo '登録完了';
} catch (Exception $e) {
}

config/config.php

// 3306 か 3307 か自信がなかったため両方試しました(いずれもNG)。

<?php define('DSN', 'mysql:host=localhost:port=3306;dbname=cms001;'); define('DB_USER', 'hoge'); define('DB_PASS', 'hoge'); ``` Dockerfile ``` FROM php:8.0-fpm-alpine RUN cp /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini COPY ./docker/php/php.ini /usr/local/etc/php/conf.d/php.ini RUN apk update --no-cache \ && apk add zip git autoconf libzip-dev libpng-dev libxpm-dev\ libjpeg-turbo-dev freetype-dev build-base mariadb-client \ unzip vim zlib oniguruma \ && docker-php-ext-configure zip \ --with-zip \ && docker-php-ext-configure gd \ --with-jpeg=/usr/include/ \ --with-freetype=/usr/include/ \ && docker-php-ext-install zip gd pdo_mysql mysqli \ && pecl install xdebug WORKDIR /var/www ``` docker-compose.yml ``` version: '3.8' services: web: container_name: nginx image: nginx:latest ports: - "8081:81" restart: always volumes: - "./docker/htdoc:/var/www" - "./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf" depends_on: - php-fpm db: container_name: mariadb image: mariadb:latest volumes: # データ永続化 - "./docker/mariadb/db/mariadb:/var/lib/mysql" # 設定ファイル - "./docker/mariadb/my.conf:/etc/mysql/conf.d/my.cnf:ro" ports: - "3307:3306" restart: always environment: MYSQL_ROOT_PASSWORD: root MYSQL_PORT: 3306 MYSQL_USER: docker MYSQL_PASSWORD: docker php-fpm: container_name: php-fpm build: context: . volumes: - "./docker/htdoc:/var/www" - "./docker/php/php.ini:/etc/php/conf.d/php.ini" ports: - "3001:3001" restart: always depends_on: - db ``` php.ini (docker build 時に用いるファイル) ``` register_globals = off [Date] date.timezone = "Asia/Tokyo"; [mbstring] mbstring.internal_encording = "UTF-8"; mbstring.language = "Japanese"; [xdebug] xdebug.mode = debug xdebug.start_with_request = yes xdebug.client_host = "host.docker.internal" xdebug.client_port = 10903 xdebug.log = "/var/log/xdebug.log" [pdo] pdo_mysql.default_socket=/run/mysqld/mysqld.sock ``` ### 試したこと 1 ローカルのターミナルで mysql-client を使って tcp 経由で接続できます。 ``` // OK $ mysql -h localhost --port 3307 --protocol tcp -u root -p ``` 2 /run/mysqld/mysqld.sock について確認しました。 phpinfo では /run/mysqld/mysqld.sock を使う設定になっているようです。 ``` // phpinfo(); Directive Local Value Master Value pdo_mysql.default_socket /run/mysqld/mysqld.sock /run/mysqld/mysqld.sock ``` mariadb コンテナの docker desktop のログより mariadb が /run/mysqld/mysqld.sock を使う設定になっているようです。 ``` [Note] mysqld: ready for connections. Version: '10.6.4-MariaDB-1:10.6.4+maria~focal' socket: '/run/mysqld/mysqld.sock' port: 3306 mariadb.org binary distribution ``` mariadb コンテナの CLI にて当該 socket が存在して、mysql からアクセスできる権限になっていることを確認しました。 ``` $ ls -al mysqld.sock srwxrwxrwx 1 mysql mysql 0 Nov 10 13:03 mysqld.sock $ pwd /var/run/mysqld ``` 3 回答にてご指摘いただいた内容を確認しました。 config.php の DNS の host を db に試したところ繋がらず、エラー内容が変わりました。 (localhost 以外に 127.0.0.1 を試しましたが同様の結果になりました。) ``` // SQLSTATE[HY000] [2002] Connection refused <?php define('DSN', 'mysql:host=db:port=3306;dbname=cms001;'); define('DB_USER', 'hoge'); define('DB_PASS', 'hoge'); ``` ### 解決 ・config/config.php の修正によって解決 ``` // 修正前 // define('DSN', 'mysql:host=127.0.0.1:port=3306;dbname=cms001;'); // 修正後 define('DSN', 'mysql:host=db;port=3306;dbname=cms001;'); ```

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

DSNのhostdbにしても繋がらないですか?

投稿2021/11/11 01:13

KAOsaka

総合スコア531

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/11/11 10:18 編集

ご回答ありがとうございます。 config.php の DNS の host を db に試したところ繋がらず、エラー内容が変わりました。 (localhost 以外に 127.0.0.1 を試しましたが同様の結果になりました。) SQLSTATE[HY000] [2002] Connection refused ``` <?php define('DSN', 'mysql:host=db:port=3306;dbname=cms001;'); define('DB_USER', 'hoge'); define('DB_PASS', 'hoge'); ```
KAOsaka

2021/11/12 01:10

portは3307ではないですか?
dameo

2021/11/13 10:45

nginxの設定がなかったりディレクトリ構成などいろいろおかしい部分ありましたが、portは3306で合ってますよ phpまで来てるなら、DSNの...localhost:port...が...localhost;port...だと思います
KAOsaka

2021/11/13 11:23

あー、コンテナの3306をホストの3307にバインドしてるんですね。たしかにDSNおかしいですね。
退会済みユーザー

退会済みユーザー

2021/11/21 07:00

>DSNの...localhost:port...が...localhost;port...だと思います こちらを反映したところ接続が成功しました。 お二方とも、お時間を頂き本当にありがとうございました! ・config/config.php() の修正によって解決 (修正前)define('DSN', 'mysql:host=127.0.0.1:port=3306;dbname=cms001;'); ↓↓↓ (修正後)define('DSN', 'mysql:host=db;port=3306;dbname=cms001;'); ※ host 名の修正と、「コロン」を「セミコロン」に修正
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問