右も左もわからない初学者がDocker+PHP+MySQLで開発環境構築。
Dockerインストール済み
windows
エディタはvscode使用
①とりあえずファイル構成
.
├── .vscode/
│ └── launch.json
├── html/
│ └── index.php
├── mysql
│ └── my.cnf
├── php/
│ ├── Dockerfile
│ └── php.ini
└── docker-compose.yml
②とりあえず書いたやつ
version: '3'
services:
#MySQL用コンテナ
mysql:
container_name: mysql
image: mysql:5.7
volumes:
- ./mysql:/var/lib/mysql #左側が保存先
#- ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf #my.cnfを読み込む
- ./mysql:/etc/mysql/conf.d/my.cnf #my.cnfを読み込む
ports:
- 3307:3306
environment:
- MYSQL_ROOT_PASSWORD=test
- MYSQL_DATABASE=test
- MYSQL_USER=test
- MYSQL_PASSWORD=password
# - TZ='Asia/Tokyo'
# command: ['mysqld', '--character-set-server=utf8mb4','--collation-server=utf8mb4_general_ci','--default-time-zone=+09:00']
#↑上2つはmy.cnfで記述してるから要らない
#phpMyAdmin用コンテナ
phpmyadmin:
container_name: phpMyAdmin
depends_on:
- mysql
image: phpmyadmin/phpmyadmin
environment:
- PMA_ARBITRARY=1
- PMA_HOST=mysql
- PMA_USER=test
- PMA_PASSWORD=password
restart: always
ports:
- "80:80"
#php用コンテナ
web:
build: ./php
volumes:
- ./php//php.ini:/usr/local/etc/php/php.ini
- ./html:/var/www/html
ports:
- 8080:80
depends_on:
- mysql
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
default-time-zone = 'Asia/Tokyo'
[mysql]
default-character-set=utf8
[client]
default-character-set=utf8
●躓いた所 : mysqlのコンテナが正常に動かない(runningにならない)
原因 : mysqlフォルダにファイルが存在したため
mysqlフォルダの中にmy.cnfを作成するとDocker-compose up -dでmysqlのコンテナが起動しなかった。
ログを確認すると(VSCODEのDockerアイコン→コンテナ名を右クリック→view Logsをクリック)
[ERROR] --initialize specified but the data directory has files in it. Aborting.
(日本語訳:[エラー] --initializeが指定されましたが、データディレクトリにファイルがあります。中止します。)
と記載があった。以下対処したこと
①mysqlフォルダを作成。フォルダ内にファイルを作成しない。
②docker-compose build→docker-compose up -d
③mysqlのフォルダや必要なファイルが作成された。その後mysqlフォルダ内にmy.cnfファイルを作成
④もう一度docker-compose up -d
⑤mysqlコンテナが起動した。
FROM php:8.0-apache
ENV TZ Asia/Tokyo
RUN pecl install xdebug && \
docker-php-ext-enable xdebug && \
echo "${TZ}" > /etc/timezone \
&& dpkg-reconfigure -f noninteractive tzdata
RUN docker-php-ext-install pdo_mysql
FROM命令でPHPイメージの作成
ENV~RUN命令 タイムゾーンの設定 Xデバッグをインストールして機能を有効にする
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
●躓いた所 : phpMyadminにログインできない
原因 : phpMyadmin用のユーザーとパスワードの設定がされていなかった。
Docker-compose.ymlのphpMyAdmin用コンテナで
PMA_USER=test
PMA_PASSWORD=password
↑の記載をしていず、最初PHPMyAdminにログインできなかった。
あと、PMA_USERとMYSQL_USER
PMA_PASSWORDとMYSQL_PASSWORDは一致していないとログインできなかった。
●躓いた所 : my.cnfが読み取られていない
原因 : 読み取り専用になっていなかった。
Windowsの場合、my.cnfは読み取り専用にしないといけないらしい。
●躓いた所 : DockerFileやDocker-compose.ymlを修正しても反映されない
原因 : 再度ビルドする必要があった。docker-compose upだとイメージが再作成されない。
●躓いた所 : MySQLに接続できない(MySQLの接続でエラー。SQLSTATE[HY000] [2002] No such file or directory)
原因 : 接続文字列を誤っていた。
https://qiita.com/b-coffin/items/8103583efe3767b6748e
この記事にあるように新規PDOを作成する際のhost名を、docker-compose.ymlで指定したservice名に変更したところ改善。(host名をmysqlにした。)
$dsn = 'mysql:host=mysql;dbname=test;charset=utf8mb4';
$user = 'test';
$pass = 'password';
●躓いた所 : まだMySQLに接続できない(SQLSTATE[HY000] [1045] Access denied for user 'root'@'xx.xx.xx.xx' (using password: YES))
原因 : ログインしていなかった(mysqldが落ちていた?)
docker-compose exec mysql mysql -proot
で、ログインしたところ接続された。(-pの直後にDocker-compose.ymlで設定したMYSQL_PASSWORDの値を入力。)
今はDocker-compose.ymlでMYSQL_PASSWORD=passwordとしているが元々はrootをパスワードにしていた。パスワードをpasswordに変更後docker-compose down→docker-compose build→docker-compose up -dとしたので-prootではなく-ppasswordとするのが正解だと思ったが、-ppasswordではログインできなかった。しかしdocker-compose exec mysql bashでコンテナにログインした後はmysql -u test -p test→passwordでログインできた。何故なのか分からない…。
●躓いた所 : MySQLに接続できない(SQLSTATE[HY000] [1045] Access denied for user 'root'@'xx.xx.xx.xx' (using password: NO))
原因 : コマンドが対話形式になっていなかった
docker exec -it mysql mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.44 MySQL Community Server (GPL)
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
-i=標準入力(stdin)を有効にする
-t=議事端末(TTY)を有効にする
この二つが「対話的に」コマンドを実行するために必要。(ソース:ChatGPT)
MySQLクライアント(mysqlコマンド)は、ユーザーからの入力を受け取って処理する対話型プログラム。とのこと。
-itがなくても前回接続できたのは何故なのか?わかり次第追記する
※参考にしたもの
・ドットインストール(Premiumプラン) PHPで作る簡易掲示板
→かなり簡易的。DBの接続はせずにタブ区切りのテキストファイルを使用する。