Qrunchからお引越しした記事です : created_at: 2019-05-19 15:22:58 +0900
前回MySQLをセットアップしたので、今回はWordpress本体の設定をしていく。
Web公開するのであればApacheも必要だが、今回は割愛。
成功するまでだいぶ試行錯誤したので、その流れを記載。
コマンド実行してコンテナ作成。(最初はこれだけで終わると思っていた)
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へブラウザから接続。
⇒無事接続完了!
無事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:接続ユーザのパスワード
これでうまくいくはず、と思いきや、再度エラー。
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)
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に限らずそうだけど、問題が基盤(コンテナ)、ミドルウェア、アプリのどれにあるのかの切り分けが大事、かつ難しい。
第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セットアップ) |
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント