0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PHPで作る簡易掲示板

Last updated at Posted at 2025-04-10

右も左もわからない初学者がDocker+PHP+MySQLで開発環境構築。

Dockerインストール済み
windows
エディタはvscode使用

①とりあえずファイル構成

.
├── .vscode/
│   └── launch.json
├── html/
│   └── index.php
├── mysql
│   └── my.cnf
├── php/
│   ├── Dockerfile
│   └── php.ini
└── docker-compose.yml

②とりあえず書いたやつ

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
my.cnf
[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コンテナが起動した。

DockerFile
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デバッグをインストールして機能を有効にする

PHP.ini
[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の接続はせずにタブ区切りのテキストファイルを使用する。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?