Nginxをゲートウェイにして「Concrete5」「Wordpress」「Roundcube」を構築していきます。
1.docker-compose.ymlを作ってみる
version: '2'
services:
######################
# gateway-proxy
######################
gateway-proxy:
image: nginx
container_name: gateway-proxy
ports:
- "80:80"
volumes:
- /var/run/docker.sock:/tmp/docker.sock
- ${PWD}/gateway_proxy/conf.d:/etc/nginx/conf.d
- ${PWD}/gateway_proxy/htdocss/index.html:/usr/share/nginx/html/index.html
links:
- concrete
- wordpress
- roundcube
environment:
- NGINX_HOST={ホストのドメイン}
#####################
# concrete
#####################
concrete:
build: concrete56-ja
container_name: concrete
links:
- mysql
#####################
# wordpress
#####################
wordpress:
image: wordpress
container_name: wordpress
links:
- mysql
environment:
- WORDPRESS_DB_HOST=mysql:3306
- WORDPRESS_DB_NAME=blog
- WORDPRESS_DB_USER=blog
- WORDPRESS_DB_PASSWORD=blog
#####################
# roundcube
#####################
roundcube:
image: robbertkl/roundcube
container_name: roundcube
environment:
- ROUNDCUBE_DEFAULT_HOST={IMAPサーバーIP or ドメイン}
- ROUNDCUBE_DEFAULT_PORT=143
- ROUNDCUBE_SMTP_SERVER={SMTPサーバーIP or ドメイン}
- ROUNDCUBE_SMTP_PORT=25
- ROUNDCUBE_SMTP_USER=%u
- ROUNDCUBE_SMTP_PASS=%p
#####################
# mysql
#####################
mysql:
image: mysql/mysql-server
container_name: mysql
volumes:
- /var/run/docker.sock:/tmp/docker.sock
- mysqldata:/var/lib/mysql
- ${PWD}/mysql/initdb.d:/docker-entrypoint-initdb.d
environment:
- MYSQL_ROOT_PASSWORD={MySQLルートパスワード}
- MYSQL_ALLOW_EMPTY_PASSWORD=true
volumes:
mysqldata:
driver: local
/etc/nginx/conf.dをDockerホストからマウントするようにして
ホスト上のファイルを修正することで変更を容易にするようにしています。
ファイルの配置と設定は以下
作業Root/
├ docker-compose.yml
|
├ /gateway_proxy
| ├ config.d/
| | └ example.com.conf
| └ htdocss
| └ index.html
|
├ concrete56-ja/
| └ Dockerfile
|
└ mysql/
└ initdb.d/
└ create_database.sql
・example.com.conf
server {
listen 80 default_server;
server_name example.com;
client_max_body_size 512M;
#
# Log
#
access_log /var/log/nginx/example.com_access.log;
error_log /var/log/nginx/example.com_error.log;
#
# Header
#
#proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_read_timeout 600s;
proxy_connect_timeout 10s;
#
# Setting
#
#############################
# Nginxドキュメントルート
#############################
location / {
root /usr/share/nginx/html;
index index.html;
}
#############################
# Concrete5
#############################
location /concrete/ {
proxy_set_header Host $host;
proxy_pass http://concrete/;
proxy_redirect http://concrete/ http://$host/;
proxy_redirect default;
}
#############################
# WordPress
#############################
location /blog/ {
proxy_set_header Host $host;
proxy_pass http://wordpress/;
proxy_redirect http://wordpress/ http://$host/;
proxy_redirect default;
}
#############################
# Roundcube
#############################
location /webmail/ {
proxy_cookie_path /webmail/ /;
proxy_pass http://roundcube/;
proxy_redirect / /webmail/;
proxy_redirect default;
}
}
・index.html
~省略~
・create_database.sql
-- WordPress
CREATE DATABASE IF NOT EXISTS blog CHARACTER SET utf8;
GRANT all ON concrete.* TO 'blog'@'%' identified by 'blog';
-- Concrete5
CREATE DATABASE IF NOT EXISTS concrete CHARACTER SET utf8;
GRANT all ON concrete.* TO 'concrete'@'%' identified by 'concrete';
buildすれば各コンテナが配置されます。
$docker-compose up -d
で、起動するわけなんですが
ブラウザでアクセスしてみるとこんな感じに・・・・
※ 左から「Concrete5」「Wordpress」「Roundcube」です。
Roundcube以外がうまく行ってませんね。。。。
2.問題へ対応する
調べてみたところ”/blog/”を”/”にリバースしているため「Concrete5」「Wordpress」は”/”にアクセスが来たと解釈しURL生成していました。
そのためリダイレクト先やCSS、JSのURLが正確なパスではないためブラウザからはアクセスできなくなってしまっているわけです。
で、結局どうしたかというと・・・・・・・
「Concrete5」「Wordpress」のApacheに強引にAliasを切って対応しましたwww
いやね、Proxyの設定見直せばいけるかなと思ったんですが
調べれば調べるほど全然ダメみたいで・・・
結局、最終構成は以下となりました。
version: '2'
services:
######################
# gateway-proxy
######################
gateway-proxy:
image: nginx
container_name: gateway-proxy
ports:
- "80:80"
volumes:
- /var/run/docker.sock:/tmp/docker.sock
- ${PWD}/gateway_proxy/conf.d:/etc/nginx/conf.d
- ${PWD}/gateway_proxy/htdocss/index.html:/usr/share/nginx/html/index.html
links:
- concrete
- wordpress
- roundcube
environment:
- NGINX_HOST={ホストのドメイン}
#####################
# concrete
#####################
concrete:
build: concrete56-ja
container_name: concrete
volumes:
- ${PWD}/concrete/concrete-alias.conf:/etc/apache2/sites-enabled/concrete-alias.conf
links:
- mysql
#####################
# wordpress
#####################
wordpress:
image: wordpress
container_name: wordpress
volumes:
- ${PWD}/wordpress/wordpress-alias.conf:/etc/apache2/sites-enabled/wordpress-alias.conf
links:
- mysql
environment:
- WORDPRESS_DB_HOST=mysql:3306
- WORDPRESS_DB_NAME=blog
- WORDPRESS_DB_USER=blog
- WORDPRESS_DB_PASSWORD=blog
#####################
# roundcube
#####################
roundcube:
image: robbertkl/roundcube
container_name: roundcube
environment:
- ROUNDCUBE_DEFAULT_HOST={IMAPサーバーIP or ドメイン}
- ROUNDCUBE_DEFAULT_PORT=143
- ROUNDCUBE_SMTP_SERVER={SMTPサーバーIP or ドメイン}
- ROUNDCUBE_SMTP_PORT=25
- ROUNDCUBE_SMTP_USER=%u
- ROUNDCUBE_SMTP_PASS=%p
#####################
# mysql
#####################
mysql:
image: mysql/mysql-server
container_name: mysql
volumes:
- /var/run/docker.sock:/tmp/docker.sock
- mysqldata:/var/lib/mysql
- ${PWD}/mysql/initdb.d:/docker-entrypoint-initdb.d
environment:
- MYSQL_ROOT_PASSWORD={MySQLルートパスワード}
- MYSQL_ALLOW_EMPTY_PASSWORD=true
volumes:
mysqldata:
driver: local
・ファイル配置
作業Root/
├ docker-compose.yml
|
├ /gateway_proxy
| ├ config.d/
| | └ example.com.conf
| └ htdocss
| └ index.html
|
├ wordpress/
| └ wordpress-alias.conf
|
├ concrete56-ja/
| ├ Dockerfile
| └ concrete-alias.conf
|
└ mysql/
└ initdb.d/
└ create_database.sql
・example.com.conf
server {
listen 80 default_server;
server_name example.com;
client_max_body_size 512M;
#
# Log
#
access_log /var/log/nginx/example.com_access.log;
error_log /var/log/nginx/example.com_error.log;
#
# Header
#
#proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_read_timeout 600s;
proxy_connect_timeout 10s;
#
# Setting
#
#############################
# Nginxドキュメントルート
#############################
location / {
root /usr/share/nginx/html;
index index.html;
}
#############################
# Concrete5
#############################
location /concrete/ {
proxy_set_header Host $host;
proxy_pass http://concrete/concrete/;
proxy_redirect http://concrete/ http://$host/;
proxy_redirect default;
}
#############################
# WordPress
#############################
location /blog/ {
proxy_set_header Host $host;
proxy_pass http://wordpress/blog/;
proxy_redirect http://wordpress/ http://$host/;
proxy_redirect default;
}
#############################
# Roundcube
#############################
location /webmail/ {
proxy_cookie_path /webmail/ /;
proxy_pass http://roundcube/;
proxy_redirect / /webmail/;
proxy_redirect default;
}
}
・concrete-alias.conf
alias /concrete /var/www/html
・wordpress-alias.conf
alias /wordpress/var/www/html
・index.html
~省略~
・create_database.sql
-- WordPress
CREATE DATABASE IF NOT EXISTS blog CHARACTER SET utf8;
GRANT all ON concrete.* TO 'blog'@'%' identified by 'blog';
-- Concrete5
CREATE DATABASE IF NOT EXISTS concrete CHARACTER SET utf8;
GRANT all ON concrete.* TO 'concrete'@'%' identified by 'concrete';
volumeがファイル単体もマウントできるんでできた荒業ですw
完全にバッドノウハウですよね・・・・
まあ、今後の課題ですかな・・・