DockerでApach+PHP+MySQLの環境構築までの道 2
前回のあらすじ
前回の「DockerでApach+PHP+MySQLの環境構築までの道 1」では MySQL の文字化けに頭を悩まされました。
問題の解決には至らず
Dockerfile で権限の644を与えました。
FROM mysql:8.0 COPY ./my.cnf /etc/mysql/conf.d/my.cnf RUN chmod 644 /etc/mysql/my.cnf
すると、以下のように utf8mb4 の指定に成功したわけですが
それでも日本語入力は受け付けませんでした。この問題だけのために時間を割くわけにはいかないので妥協点として 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
というエラーに変わります。
似た現象を見つけたのですがすでに実行済みだったので解決しませんでした。
試したこと
- $dsn で port3306 の指定、
charset=utf8mb4
の指定、host を127.0.0.1と localhost で試す - Dockerfile に
RUN docker-php-ext-install pdo_mysql
でインストール - 認証を
mysql_native_password
に変更 - php.ini に
mysql.default_socket = /tmp/mysql.sock
を追加
上記サイトに載っていた127.0.0.1に権限を与えるというコマンドはなぜか構文エラーが出て受け付けてくれなかったので失敗。
ちなみに phpinfo だと PDO はきちんと認識できている様子。
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 側の設定になのか問題があるのだろうか?わからないことが多すぎる。
というわけで、まだ勉強の前の環境構築に右往左往してます。そろそろ誰かに質問しないと頭がパンクしそうです。