プログラミングいちねんせい

プログラミング歴ゼロの初心者がもがくサイトです

DockerでApach+PHP+MySQLの環境構築までの道 2

前回のあらすじ

前回の「DockerでApach+PHP+MySQLの環境構築までの道 1」では MySQL の文字化けに頭を悩まされました。

javacurry.hatenablog.jp

問題の解決には至らず

Dockerfile で権限の644を与えました。

FROM mysql:8.0

COPY ./my.cnf /etc/mysql/conf.d/my.cnf

RUN chmod 644 /etc/mysql/my.cnf

すると、以下のように utf8mb4 の指定に成功したわけですが

f:id:javacurry:20210518210930j:plain

それでも日本語入力は受け付けませんでした。この問題だけのために時間を割くわけにはいかないので妥協点として Docker での MySQL はしばらくのあいだは英語入力のみで勉強をすすめたいと思います。SQL 文の勉強のための環境は Windows にインストールした PostgreSQL ですすめるつもりです。utf8mb4 の指定に成功しても入力できないとなれば私の脳みそではお手上げです。なので、次に進みます。

次は PHP の導入

docker-compose は以下のように構成しました。

version: '3'
services:
    php:
        build: ./php
        volumes:
            - ./php:/var/www/html
        ports:
            - 8080:80
        depends_on: 
            - db
    db:
        build: ./mysql
        command:
            mysqld --default-authentication-plugin=mysql_native_password
        environment: 
            MYSQL_ROOT_PASSWORD: ****
            MYSQL_DATABASE: db
            MYSQL_USER: user
            MYSQL_PASSWORD: ****
            TZ: 'Asia/Tokyo'
        ports: 
            - "3306:3306"
        volumes: 
            - ./mysql/mysql_init:/docker-entrypoint-initdb.d
            - ./mysql/mysql_data:/var/lib/mysql
            - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf

restart: alwaysをつけなかったのは、なぜか文字通り restart を繰り返してコンテナが up にならなかったためです。

そして PHP 用の Dockerfile です。

FROM php:8.0.6-apache

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

RUN docker-php-ext-install pdo_mysql

php.ini です。

[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
mysql.default_socket = /tmp/mysql.sock

index.php です。

<?php
$dsn = 'mysql:dbname=db;port=3306;charset=utf8mb4;host=127.0.0.1';
$user = 'user';
$password = '****';


try {
    $dbh = new PDO($dsn, $user, $password);
    echo "接続に成功しました\n";
} catch (PDOException $e) {
    echo "接続に失敗しました\n";
    echo $e->getMessage() . "\n";
}

ここで問題が発生

困ったことに接続に失敗しました SQLSTATE[HY000] [2002] Connection refusedというエラーが表示されPHPからMySQLに接続ができません。hostをlocalhostに変更すると接続に失敗しました SQLSTATE[HY000] [2002] No such file or directoryというエラーに変わります。

似た現象を見つけたのですがすでに実行済みだったので解決しませんでした。

teratail.com

teratail.com

試したこと

  1. $dsn で port3306 の指定、charset=utf8mb4の指定、host を127.0.0.1localhost で試す
  2. Dockerfile にRUN docker-php-ext-install pdo_mysqlでインストール
  3. 認証をmysql_native_passwordに変更
  4. php.ini にmysql.default_socket = /tmp/mysql.sockを追加

mgng.mugbum.info

f:id:javacurry:20210519182355j:plain

上記サイトに載っていた127.0.0.1に権限を与えるというコマンドはなぜか構文エラーが出て受け付けてくれなかったので失敗。

ちなみに phpinfo だと PDO はきちんと認識できている様子。

f:id:javacurry:20210519182348j:plain

MySQL の utf8mb4 もそうだけど、実際に指定できていたり読み込めているのに動作しないというのは初学者には頭が痛すぎる。

わかってないこと

  • Docker で Apache の導入はする必要がない?
  • Apache がなくても PHP が動いてるのは PHP8.0-apache のイメージを利用しているから?
  • Web では例として CentOS+Apache+PHP+MySQL が多いけど Linux 系のなかでインストールするべき?だとしたら Docker では、どう動かせばいい?
  • docker-compose のdepends_onは合っているのか?
  • php.index のなかの$dsnで指定するdbnameはどこの名前?

まとめ

Docker から MySQL-u root -pではログインできるのに PHP から接続できないということは PHP 側の設定になのか問題があるのだろうか?わからないことが多すぎる。

というわけで、まだ勉強の前の環境構築に右往左往してます。そろそろ誰かに質問しないと頭がパンクしそうです。