ytooyamaのブログ

サーバ構築とか、仕事で発見したこととか、趣味のこととかを書いています。

Docker ComposeでMySQL 8を使ってWordPressをコンテナーデプロイする

Docker Composeはアプリケーションの動作に必要なソフトウェアをコンテナーに一気にデプロイするツールです。 デプロイするアプリケーションや設定はYAMLに記述します。Webで検索するとたくさん情報やテンプレートが見つかります。

ちょっとすぐWordPressの環境が必要になり、検索していたらDockerの公式サイトや日本語のドキュメントサイトが見つかりました。Docker Composeでデプロイする例がズバリ掲載されていました。

WordPressの方はlatestイメージを使っており、MySQLの方は5.7を使っています。現在はMySQLの方は8系のイメージが公開されており、バージョンとして8やlatestを指定すると8が利用されます(もちろん、5.6や5.7のイメージも引き続き利用可能です)。せっかくだったら新しいものを使いたいところです。

というわけで、試しにmysql:latestを指定してDocker ComposeでWordPressをデプロイしてみました。

進捗はdocker-compose psで確認し、MySQLとWordPressがUpになったことを確認し、8000番ポートで待ち受けしているWebサーバーにアクセスしてみると、「Error establishing a database connection」と表示されています。要するにデータベースエラーですね。

docker-compose logsコマンドを実行してみると認証系のエラーが出ています。ソースを忘れましたが、MySQL 8でデフォルトの認証系の設定が変わったらしく、そのままではデプロイできないことがわかりました。

wordpress_1  | MySQL Connection Error: (2002) Connection refused
wordpress_1  | 
wordpress_1  | MySQL Connection Error: (2002) Connection refused
wordpress_1  | 
wordpress_1  | MySQL Connection Error: (2002) Connection refused
wordpress_1  | 
wordpress_1  | MySQL Connection Error: (2002) Connection refused
wordpress_1  | [28-Jul-2019 11:19:36 UTC] PHP Warning:  mysqli::__construct(): The server requested authentication method unknown to the client [caching_sha2_password] in Standard input code on line 22
...
wordpress_1  | 
wordpress_1  | MySQL Connection Error: (2054) The server requested authentication method unknown to the client
wordpress_1  | 
wordpress_1  | WARNING: unable to establish a database connection to 'db:3306'
wordpress_1  |   continuing anyways (which might have unexpected results)
wordpress_1  | 

とりあえずこの問題を回避するには

引き続きMySQL 5.7を使う

使えるうちはMySQL 5.7のDockerイメージを使うという方法です。いますぐに使えなくなることはないかと思いますが、いずれサポート終了になる可能性があります。

MySQL 8の認証の設定を変えてデプロイする

こんな感じでYAMLを書いたところ、うまくいきました。Dockerのバージョンによって利用できるCompose Versionは異なりますが、今回は日本語のドキュメントと同じ2を使った例にしてみます。

次のように書き換えると、MySQL8を使ってコンテナー上にWordPressアプリケーションをデプロイできます。実際にデプロイする場合はデータベース名、パスワードなどを書き換えて実行してください。

何を追加しているか簡単に説明すると、イメージの下で、コマンドオプションとして「--default-authentication-plugin=mysql_native_password」を追加しています。

ちなみに一度失敗したときのデータベースがプロジェクト用ディレクトリーの.dataに存在しますので、書き換えて実行してもうまくいかない場合はこれを削除してからdocker-compose up -dを実行してみてください。

version: '2'
services:
  db:
    image: mysql:8
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - "./.data/db:/var/lib/mysql"
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: wordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    links:
      - db
    ports:
      - "8000:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_PASSWORD: wordpress

docker-compose up -dを実行します。しばらくすると、ブラウザーでアクセスできます。

f:id:ytooyama:20190728204416p:plain
WordPress初期画面

うまくいきました。

ちなみに片付ける場合はdocker-compose downコマンドで実行します。

このブログサイトはJavaScriptを使っていますが、読み込んでいるJavaScriptは全てはてなが提供しているものであり、筆者が設置しているものではありません。