【Docker】WordPressのエラー対処法:「Unknown database ‘DB名’」「Can’t select database 」MySQLで設定すれば解決

troubled-real-woman-in-front-of-laptopWordPress

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.

内容は、データベースサーバーに接続できたが、指定したデータベースが見つからないので、接続できません。というもの。

データベースが存在しているか?指定ユーザーが対象のデータベースにアクセスする権限を持っているか?データベースの接頭語は正しいか?

という確認事項が記載されている。

対処法一覧

このエラーが発生したときに確認するべきポイントがいくつかある。

  1. docker-compose.ymlの設定
  2. wp_config.phpの設定
  3. 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つ。これらの情報が接続対象のデータベースと一致しているかを確認する。

  1. define( ‘DB_NAME’, ‘データベース名’ );
  2. define( ‘DB_USER’, ‘ユーザー名’);
  3. define( ‘DB_PASSWORD’, ‘パスワード’ );
  4. define( ‘DB_HOST’, ‘ホスト名’ );
  5. $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コンテナに入る

まずは 、dokcer 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
「-p」のパスワード指定時の注意点
  • 「-p」の後に空白を入れずにパスワードを記述する
  • 「Warning: Using a password on the command line interface can be insecure.」セキュリティの警告がでるが問題ない。警告を出したくない場合は以下で対応可能。
  • 「-p」の後ろに空白を入れ、パスワードを指定しなければ、コマンド実行後にパスワードを聞かれる。入力している文字は表示されないが、パスワードを入力してEnterをクリックすればログインできる。
  • 「-p」は「–password」と同じ。

デフォルトの設定の場合

もし、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サイトを起動することができる。

お疲れさまでした~

タイトルとURLをコピーしました