Dcoker上にWordpressとMySQLのコンテナを作成し、ページを開こうとすると「Unknown database ‘DB名’」「Can’t select database 」というエラーが発生することがある。
この原因と対処法について。
エラーの内容
発生するエラーは、起動中のサービスがdocker-compose.ymlで指定したデータベースにアクセスしようとしたときに、データベースが存在していないことが原因。
Unknown database ‘データベース名’
Can’t select database
We were able to connect to the database server (which means your username and password is okay) but not able to select the データベース名 database.
Are you sure it exists?
Does the user wp_user have permission to use the データベース名 database?
On some systems the name of your database is prefixed with your username, so it would be like username_データベース名. Could that be the problem?
If you don’t know how to set up a database you should contact your host. If all else fails you may find help at the WordPress Support Forums.
内容は、データベースサーバーに接続できたが、指定したデータベースが見つからないので、接続できません。というもの。
データベースが存在しているか?指定ユーザーが対象のデータベースにアクセスする権限を持っているか?データベースの接頭語は正しいか?
という確認事項が記載されている。
対処法一覧
このエラーが発生したときに確認するべきポイントがいくつかある。
- docker-compose.ymlの設定
- wp_config.phpの設定
- MySQLコンテナに指定したデータベースが存在しているか
docker-compose.ymlの設定
コンテナが起動して、上記のようなエラーページが開けていればdocker-compse.ymlの設定はほぼ問題ない。
念の為、DBのログイン情報とWordpressのログイン情報があっているか確認する。また、変数名も指定されたものを使うこと。
例えば、データベースのサービスの設定でDBの名前は「MYSQL_DATABASE」というように指定しなければいけないが、これを「MYSQL_DB_NAME」としてしまうと上手く接続できない。
docker-compose.ymlの設定例は以下ご参考。
version: "3.7"
services:
db:
image: mysql:5.6
container_name: mysql
#restart: always
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: wp_db
MYSQL_USER: wp_user
MYSQL_PASSWORD: root
wp:
image: wordpress:latest
container_name: wordpress
#restart: always
depends_on:
- db
ports:
- "10090:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wp_user
WORDPRESS_DB_PASSWORD: root
WORDPRESS_DB_NAME: wp_db
WORDPRESS_DEBUG : 1
volumes:
- ./html:/var/www/html
config.phpの設定
WordPressがどのデータベースに接続するか、そしてどのテーブルを使うかの情報は、Wordpressサイトのルートディレクトリ直下にある、wp_config.phpに記載されている。
このファイルをエディタで開く。DB接続のために重要な情報は以下の5つ。これらの情報が接続対象のデータベースと一致しているかを確認する。
- define( ‘DB_NAME’, ‘データベース名’ );
- define( ‘DB_USER’, ‘ユーザー名’);
- define( ‘DB_PASSWORD’, ‘パスワード’ );
- define( ‘DB_HOST’, ‘ホスト名’ );
- $table_prefix = ‘テーブルの接頭語’;
設定例は以下のようになる。(コメントアウトはデフォルトで記載されている)
// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', 'wp_db' );
/** MySQL database username */
define( 'DB_USER', 'wp_user');
/** MySQL database password */
define( 'DB_PASSWORD', 'root' );
/** MySQL hostname */
define( 'DB_HOST', 'db' );
/**WordPress Database Table prefix.*/
$table_prefix = 'wp_';
例えば、上記例であれば、データベース名は 「wp_db」, ユーザー名は 「wp_user」, パスワードは「root」, ホスト名は「db」、テーブル接頭語「wp_」となる。
ただし、Dockerで起動したWordpressの場合は、一般的に、getenv_dockerという関数を使って、docker-compose.ymlで指定した環境変数を抽出してきている。
/ ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', getenv_docker('WORDPRESS_DB_NAME', 'wordpress') );
/** MySQL database username */
define( 'DB_USER', getenv_docker('WORDPRESS_DB_USER', 'example username') );
/** MySQL database password */
define( 'DB_PASSWORD', getenv_docker('WORDPRESS_DB_PASSWORD', 'example password') );
/** MySQL hostname */
define( 'DB_HOST', getenv_docker('WORDPRESS_DB_HOST', 'mysql') );
/**WordPress Database Table prefix.*/
$table_prefix = getenv_docker('WORDPRESS_TABLE_PREFIX', 'wp_');
この場合は、docker-compose.ymlで指定した環境変数が正しいかを確認する。
MySQLコンテナに指定したデータベースが存在しているか
docker-compose.ymlや、wp_config.phpに問題がない場合は、そもそもMySQL上に対象のデータベースが存在していない可能性がある。
MySQLコンテナに入って、DBの存在を確認後、もしなければ新規作成する。
Docker上のMySQLコンテナに入る
まずは 、docker ps コマンドで、現在起動しているコンテナを確認する。
> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
db17e4d0fc2b wordpress:latest "docker-entrypoint.s…" 42 hours ago Up 28 hours 0.0.0.0:10090->80/tcp, :::10090->80/tcp wp
d01dd3b83a41 phpmyadmin/phpmyadmin:latest "/docker-entrypoint.…" 42 hours ago Up 28 hours 0.0.0.0:10099->80/tcp, :::10099->80/tcp phpmyadmin
dab19e479a65 mysql:5.6 "docker-entrypoint.s…" 42 hours ago Up 28 hours 3306/tcp wp_mysql
上記例の場合、3つのコンテナが起動している。(1)WordPress, (2)phpMyAdmin, (3)MySQL。この中でMySQLの対話モードに入れるのは(3)MySQL コンテナ。(phpMyAdminではない)
コンテナの中に入るコマンドは以下。
$docker exec -it コンテナ名 bash
> docker exec -it wp_mysql bash
root@dab19e479a65:/#
「root@dab19e479a65:/#」のように表示されれば、コンテナの中に入ることに成功。
MySQLの対話モードを起動する
コンテナに入ったら、まずはMySQLが存在するか確認する。
$ mysql –version でバージョン情報が表示されれば、MySQLがインストールされている。
root@dab19e479a65:/# mysql --version
mysql Ver 14.14 Distrib 5.6.51, for Linux (x86_64) using EditLine wrapper
バージョンが確認できたら、ルートユーザーとしてMySQLにログインする。(※注 docker-compose.ymlで指定したユーザーではない)
以下コマンドを実行。
$ mysql -u ルートユーザー名 -h ホスト名 -pパスワード
オプション | 内容 | 必要性 | デフォルト |
-u | ユーザー名 | 必須 | root |
-h | ホスト名 | 省略可(localhostとみなす) | localhost |
-p | パスワード | 必須 | root |
デフォルトの設定の場合
もし、MySQLの設定がデフォルトのままで、ルートユーザーの情報などを変更していない場合は以下の設定になっている。
- ルートユーザー名: root
- ホスト名: localhost ※省略可能
- パスワード: root
次のコマンドを実行すればルートユーザーとしてログインできる。
# mysql -u root -proot
これでDocker上のMySQLコンテナの対話モードの起動が完了。これでSQLが実行できる。
データベースを作成する
いよいよデータベースの作成を行う。まずは、現在作成済みのデータベース一覧を確認する。
mysql> show databases;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| wp_db |
+--------------------+
4 rows in set (0.00 sec)
次に、createコマンド使ってデータベースを作成する。
mysql> create database データベース名;
mysql> create database prograshi_db;
Query OK, 1 row affected (0.00 sec)
最後に「show database」コマンドでデータベースが正しく作成されているかを確認する。
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| wp_db |
| prograshi_db |
+--------------------+
5 rows in set (0.00 sec)
ここに、対象のデータベース名が表示されれば設定は完了。
ブラウザをリロードする
ブラウザをリロードすると、いつものWordpressインストールの画面が表示される。
あとは、画面表示に沿って入力していけば、Wordpressサイトを起動することができる。
お疲れさまでした~