徒然なるままに プログラミングメモや日々の生活などつれづれとつづっていくblog

2016年10月20日

既存サーバーのWordPressデータをDockerコンテナへ移設する

Filed under: Docker,Linux,OSS,Wordpress,オープンソース — ranpei @ 4:27 AM

Dockerコンテナ環境の構築が完了しましたので、

既存サーバーのデータをDockerコンテナへ移設します。

※ なお、初期インストール画面での設定は終えているものとして話を進めていきます。

1.移設元サーバーから移設データを取り出す

移設するデータは記事データである”MySQLのdumpファイル”、

画像などのメディアファイルやプラグインなどが格納されている”wp-contentディレクトリ”の2つ。

[shell]
// WordPress配置ディレクトリに移動 (各々のサーバー環境に合わせて読みかえてください)
# cd /var/www/html/wordpress
// wp-contentフォルダをtarで固める
# tar cvf wp-content.tar wp-content
// SQLデータをエクスポート
# mysqldump -u {ユーザー名} -p {パスワード} {データベース名} >> wordpress-export.sql
[/shell]

2.Dockerコンテナに反映させる

wp-contentディレクトリをDockerコンテナに配置する

※ Dockerコンテナ名:wordpress

[shell]
// SCPでファイルを移動
# cd /tmp
# scp {移設元サーバーIP}:/var/www/html/wordpress/wp-content.tar wp-content.tar
// wordpressコンテナ内にwp-content.tarをコピー
# docker cp wp-content.tar wordpress:/var/www/html
// tarファイルを展開
# docker exec wordpress tar xvf wp-content.tar
# docker exec wordpress /bin/bash -c "chown www-data:www-data -R /var/www/html/wp-content"
// ディレクトリのパーミッションを変更
# docker exec wordpress /bin/bash -c "chmod 777 -R /var/www/html/wp-content/cache && chmod 777 -R /var/www/html/wp-content/uploads"
[/shell]

記事データをMySQLコンテナにインポートする。

※ Dockerコンテナ名:mysql

[shell]
// SCPでファイルを移動
# cd /tmp
# scp {移設元サーバーIP}:/var/www/html/wordpress/wordpress-export.sql wordpress-export.sql
// mysqlコンテナ内にwordpress-export.sqlをコピー
# docker cp wordpress-export.sql mysql:/tmp/
// インポート
# docker exec mysql /bin/bash -c "mysql -h mysql -u {ユーザー名} -p {パスワード} {データベース名} < /tmp/wordpress-export.sql"
[/shell]

で、ブラウザでアクセスするときちんとデータが反映されていたので

これで、移設完了・・・・・と思っていたらブログの記事を書いているときに

画像をアップロードできない問題が発生しまして・・・・・

調べたところ今回の移設でwordpressの配置パスが変わったため

それに合わせて「メディア設定」>「アップロードするファイルの保存場所」のパス設定を

変更する必要がありましたのでメモしておきます。

アップロードパスの変更

 

これでWordpressデータの移設が完了しました。

2016年10月9日

Nginxをゲートウェイとした構成を構築する。

Filed under: apache,Concrete5,Docker,OSS,Roundcube,Wordpress — ranpei @ 12:43 AM

Nginxをゲートウェイにして「Concrete5」「Wordpress」「Roundcube」を構築していきます。

1.docker-compose.ymlを作ってみる

[shell]
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
[/shell]

/etc/nginx/conf.dをDockerホストからマウントするようにして
ホスト上のファイルを修正することで変更を容易にするようにしています。

ファイルの配置と設定は以下

[shell]
作業Root/
├ docker-compose.yml
|
├ /gateway_proxy
| ├ config.d/
| | └ example.com.conf
| └ htdocss
| └ index.html
|
├ concrete56-ja/
| └ Dockerfile
|
└ mysql/
└ initdb.d/
└ create_database.sql
[/shell]

・example.com.conf

[shell]
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;
}
}
[/shell]

・index.html
~省略~

・create_database.sql

[shell]
— 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’;
[/shell]

buildすれば各コンテナが配置されます。

[shell]

$docker-compose up -d

[/shell]

で、起動するわけなんですが
ブラウザでアクセスしてみるとこんな感じに・・・・

alias%e8%a8%ad%e5%ae%9a%e5%89%8d_concrete5 alias%e8%a8%ad%e5%ae%9a%e5%89%8d_wordpressalias%e8%a8%ad%e5%ae%9a%e5%89%8d_roundcube

 

※ 左から「Concrete5」「Wordpress」「Roundcube」です。

Roundcube以外がうまく行ってませんね。。。。

 

 

 

2.問題へ対応する

調べてみたところ”/blog/”を”/”にリバースしているため「Concrete5」「Wordpress」は”/”にアクセスが来たと解釈しURL生成していました。

そのためリダイレクト先やCSS、JSのURLが正確なパスではないためブラウザからはアクセスできなくなってしまっているわけです。

で、結局どうしたかというと・・・・・・・

「Concrete5」「Wordpress」のApacheに強引にAliasを切って対応しましたwww

いやね、Proxyの設定見直せばいけるかなと思ったんですが

調べれば調べるほど全然ダメみたいで・・・

結局、最終構成は以下となりました。

[shell]
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
[/shell]

 

・ファイル配置

[shell]
作業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
[/shell]

・example.com.conf

[shell]
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;
}
}
[/shell]

・concrete-alias.conf

[shell]
alias /concrete /var/www/html
[/shell]

・wordpress-alias.conf

[shell]
alias /wordpress/var/www/html
[/shell]

・index.html
~省略~

・create_database.sql

[shell]
— 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’;
[/shell]

volumeがファイル単体もマウントできるんでできた荒業ですw

完全にバッドノウハウですよね・・・・

まあ、今後の課題ですかな・・・

Powered by WordPress