やりたいこと
DockerにてWordPressを構築し、ブラウザから80番ポートでアクセスしたい。
ただし、ホスト側でもApacheを使っているため、WordPressコンテナを80番ポートに紐づけるわけにはいかない。
ということで、WordPressコンテナは8080番ポートに紐づけます。
そしてWordPress用のサブドメインを切って、そこに来たアクセスをホスト側のApacheでlocalhostの8080番ポートにリバースプロキシするようにする。
経緯(自分用メモなので、読みたい人だけどうぞ)
- サーバにWordPressを導入したい
- Dockerで構築しようと、ネットで調べると、すぐ方法はでてくるが、どのサイトのサンプルもポート番号が8080とか。
- 80番でWordPressを起動したいが、ホスト側でもすでにApacheを使っていて、80番は使えない!
- そこでバーチャルホストを使おうとする。
- WordPressコンテナ内のHTMLは永続化のため、ボリュームマウントしてあるから、そのディレクトリ
/var/lib/docker/volumes/wordpress_v-wordpress-html/_data
をバーチャルホストで指定してみる。 - うまくいかない
- WordPressコンテナ内のApacheで何か設定がしてあるっぽいから、これを飛ばして直接アクセスするのは微妙
- じゃあホスト側のApacheをプロキシとして、localhostの8080番に飛ばせばいいのでは
こんな感じになります。
前提
OS:CentOS8
Docker:20.10.7
docker-compose:1.27.4
Apache:2.4.37
この辺は既に入っている前提でやります。
WordPress
まずはDockerコンテナ内でWordPressを構築します。
Docker-ComposeのファイルにWordPress, MySQL, phpMyAdminを記述します。
version: "3"
services:
db:
image: mysql:5.7
volumes:
- v-wordpress-db:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: root_pass_fB3uWvTS
MYSQL_DATABASE: wordpress_db
MYSQL_USER: wp_user
MYSQL_PASSWORD: wp_user_pass
wordpress:
image: wordpress:latest
volumes:
- v-wordpress-html:/var/www/html
- v-wordpress-php:/usr/local/etc/php/conf.d/php.ini
restart: always
depends_on:
- db
ports:
- 8080:80
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_NAME: wordpress_db
WORDPRESS_DB_USER: wp_user
WORDPRESS_DB_PASSWORD: wp_user_pass
phpmyadmin:
image: phpmyadmin/phpmyadmin:latest
restart: always
depends_on:
- db
ports:
- 8888:80
volumes:
v-wordpress-db:
v-wordpress-html:
v-wordpress-php:
下記コマンドでコンテナを起動します。
docker-compose up
これでブラウザからhttp://mydomain:8080
にアクセスすればWordPressが表示されるはずです!
もしできない場合は、コンテナがうまく起動していないのか、ファイアウォールなどで8080へのアクセスを制限している可能性があります。
Apache(リバースプロキシ)
続いてApacheの設定を行います。
現状、mydomain
へのアクセスはこうなっていると思います。
-
http://mydomain
-> もともとのサイト -
http://mydomain:8080
-> WordPress
それをサブドメインを使って、こうします。
-
http://original.mydomain
-> もともとのサイト -
http://wp.mydomain
-> WordPress
Apacheの設定ファイルがあるディレクトリに移動します。
だいたい/etc/httpd/conf.d
だと思います。
そこにファイルを2つ作ります。
original.mydomain(もともとのサイト)
<VirtualHost *:80>
ServerName original.mydomain
DocumentRoot "/var/www/html/original.mydomain"
<Directory "/var/www/html/original.mydomain">
Options FollowSymLinks
AllowOverride All
Order deny,allow
Allow from all
</Directory>
ErrorLog logs/original.mydomain-error_log
CustomLog logs/original.mydomain-access_log combined
</VirtualHost>
もし/var/www/html/
にもともとのサイトがある場合は、/var/www/html/original.mydomain/
に移し替えましょう。
http://original.mydomain
にアクセスしてみてください。
元のサイトが表示されていればOKです。
wp.mydomain(WordPress)
<VirtualHost *:80>
ServerName wp.mydomain
ProxyPass / http://localhost:8080/
</VirtualHost>
ProxyPassディレクティブでプロキシを設定します。
よくProxyPassと一緒にProxyPassReverseというのを見るかもしれませんが、これはプロキシ先がリダイレクトを発行するときに必要になってくるようなので、今回は不要です。
これで設定は終わりです。
http://wp.mydomain
にアクセスしてみてください。
WordPressが表示されていれば成功です!
最後に
Apacheのバーチャルホストやプロキシの勉強になってよかったです。
他にいい方法あれば教えてください。