2020-12-26に投稿

Dockerの学習 #5 (Wordpressを使おう その2:Wordpressセットアップ)

Qrunchからお引越しした記事です : created_at: 2019-05-19 15:22:58 +0900

前回MySQLをセットアップしたので、今回はWordpress本体の設定をしていく。
Web公開するのであればApacheも必要だが、今回は割愛。

成功するまでだいぶ試行錯誤したので、その流れを記載。

Wordpressセットアップ

1回目の失敗:ポートフォワーディング設定漏れ

コマンド実行してコンテナ作成。(最初はこれだけで終わると思っていた)
docker run --name wp_con01 wordpress

作成自体は正常に終了。psコマンドで確認するとポートは80番。
http://192.168.99.100(DockerのIP)へブラウザから接続。
⇒接続できない。

色々調べてみると、ホスト側とコンテナ側でポートフォワーディングの設定を実施しないと接続できない様子。

というわけで、stopでコンテナ停止、rmでコンテナ削除を実施した後に、再度コンテナ作成。
docker run --name -p 8080:80 wp_con01 wordpress

これでホスト側の8080番ポートとコンテナ側の80番ポートのフォワーディング設定が実施された。
psで参照するとこんな感じ。

CONTAINER ID        IMAGE               COMMAND                  CREATED        STATUS              PORTS                               NAMES
eb276daaee38        wordpress           "docker-entrypoint.s"    3 hours ago    Up 3 hours          0.0.0.0:8080->80/tcp                wp_con01

この状態でhttp://192.168.99.100(Docker VMのIP):8080へブラウザから接続。
⇒無事接続完了!

2回目の失敗:コンテナ間のネットワーク設定

無事Wordpressの設定も完了したので、ブラウザから設定を進める。
が、MySQLの設定内容を埋めて先に進もうとするとDB接続エラーが発生する。

「そもそもコンテナとコンテナってNW接続って許可されているんだろうか?」
と、思い色々調査すると、接続させるには設定が必要なことが判明。

方法としては--linkでつなげるか、ネットワークを作成しそのネットワークにコンテナを所属させるか、の2通り。
--linkは今後使われなくなる非推奨オプションらしいので、ネットワーク参加の方で設定を実施。

まず、ネットワークを作成。
docker network create my_network
作成後、確認。

$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
83102481c8be        bridge              bridge              local
0568528ca361        host                host                local
ef68ec9b2ee9        my_network          bridge              local
d00080a53d5d        none                null                local
$

基本、何も指定していないとデフォルトの「bridge」ネットワークに所属するらしいのだが、
このネットワークはDNSの設定がなく、コンテナ名で名前解決ができないらしい。

ネットワークを作成したので、そのネットワークに所属させる形でコンテナ再作成。
前回作成したMySQLのコンテナも作り直す。

また、接続に必要な情報を全部環境変数指定してやる方向に変更した。
docker run --name mysql -p 3306:3306 --network my_network -e MYSQL_ROOT_PASSWORD=password -e MYSQL_USER=wp_user -e MYSQL_PASSWORD=password -e MYSQL_DATABASE=wordpress mysql

--networkで所属ネットワークを作成したmy_networkに指定。

(環境変数の補足)
・MYSQL_ROOT_PASSWORD:管理者パスワード
・MYSQL_USER:ユーザ名
・MYSQL_PASSWORD:ユーザのパスワード
・MYSQL_DATABASE:データベース名

続けてWordpressのコンテナ。こちらも接続に必要な情報を環境変数で指定。
docker run --name wp_con01 --link mysql_con01:mysql -p 8080:80 -e WORDPRESS_DB_USER=wp_user -e WORDPRESS_DB_PASSWORD=password wordpress

こちらも所属ネットワークをmy_networkに指定。

(環境変数の補足)
・WORDPRESS_DB_USER:接続ユーザ
・WORDPRESS_DB_PASSWORD:接続ユーザのパスワード

これでうまくいくはず、と思いきや、再度エラー。

3回目の失敗:MySQLのコンテナ名

Wordpress側で次のエラーが発生。mysqlのサービスがない旨のメッセージ。
MySQL Connection Error: (2002) php_network_getaddresses: getaddrinfo failed: Name or service not known

ネットで調査してみると「コンテナ名をmysqlにしないとエラーになる」旨の情報あり。

※--linkで(--link test-mysql:mysql)と指定すれば問題なさそうだった。
 ただし、今回は--linkを利用しない方向にしたので、コンテナ名を泣く泣くmysqlに変更。
 また、docker-composeでの構築であればコンテナ名はmysqlでなくとも問題なさそう?
 ほかに何かよい方法があるのかもしれない。

この状態で再度Wordpressのコンテナを作成したところ、再度エラー。(orz)

4回目の失敗:MySQLの認証設定

Wordpress側で次のエラーが発生。どうも認証周りで失敗している模様。
MySQL Connection Error: (2054) The server requested authentication method unknown to the client

エラーメッセージで調べてみると、MySQL内ユーザの認証方式を弄ってやらないといけなそうなことが判明。
EXECでMySQLのコンテナに接近し、ALTER文を発行。

$ 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 18
Server version: 8.0.16 MySQL Community Server - GPL

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

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> alter user wp_user identified WITH mysql_native_password by 'password';
Query OK, 0 rows affected (0.13 sec)

※ALTER文:alter user [wordpress接続ユーザ] identified WITH mysql_native_password by '[wordpress接続ユーザのパスワード]';

実行後、再度Wordpressコンテナ作成。
⇒今度はエラーなし!!!!!!

http://192.168.99.100:8080から、ようやく初期設定画面に遷移できた。(つかれた・・・)

まとめ

まとめると、次の流れが必要だった。
- 1.ネットワークの作成
docker network create my_network
・コンテナを所属させるネットワークの作成。

  • 2.MySQLコンテナの作成
    docker run --name mysql -p 3306:3306 --network my_network -e MYSQL_ROOT_PASSWORD=password -e MYSQL_USER=wp_user -e MYSQL_PASSWORD=password -e MYSQL_DATABASE=wordpress mysql
    ・名前は「mysql」で作成。
    ・作成したネットワークに所属させる。
    ・環境変数にてユーザやデータベース情報の設定もしてしまう。

  • 3.MySQLの設定変更
    docker exec -it mysql mysql -u root -p
    mysql> alter user wp_user identified WITH mysql_native_password by 'password';
    ・MySQLにて、Wordpress用のユーザの認証方式をNativeに変更してやる。

  • 4.Wordpressコンテナの作成
    docker run --name wp --network my_network -p 8080:80 -e WORDPRESS_DB_USER=wp_user -e WORDPRESS_DB_PASSWORD=password wordpress
    ・ホストからアクセスするにはポートフォワーディングの設定が必要。
    ・作成したネットワークに所属させる。
    ・環境変数にて接続情報の設定もしてしまう。

所感

・すごい苦労したが、ネットワーク等含めてコンテナの考え方を学べてよかった。
・実際に手を動かすのがやっぱり大事。
・途中で心が折れそうだったけど、無事作成できてよかった。
・ネット上はだいたい「--link」でつなげてる情報ばっかりだった。
・Dockerに限らずそうだけど、問題が基盤(コンテナ)、ミドルウェア、アプリのどれにあるのかの切り分けが大事、かつ難しい。

ツイッターでシェア
みんなに共有、忘れないようにメモ

view_list Docker自己学習
第1回 Dockerの学習 #1 (イメージファイルとPULLコマンド)
第2回 Dockerの学習 #2 (コンテナの起動・操作コマンド RUN、EXEC、ATTACH、STOP・KILL・START)
第3回 Dockerの学習 #3 (PS、IMAGES、COMMIT、PUSH、RM、RMI、(BUILD))
第4回 Dockerの学習 #4 (Wordpressを使おう その1:Mysqlセットアップ)
第5回 Dockerの学習 #5 (Wordpressを使おう その2:Wordpressセットアップ)

ANA

日々勉強中です ( ..)φ

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント