Docker使ってVPS構築しなおした
年末だし、VPSのバックアップとか、いろいろやって綺麗に作り直そう!と考えていたら年が明けて、 一週間もがたちました。
いままで自分はslankdev.netとlibpgen.orgの2つをwordpressのマルチサイト機能で管理していたんですが、 つい先日どこかのプロが不手際でmariadbのコンテナを壊して泣いているとTwitterで見たのをきっかけで コンテナに興味を持ち始めました。
@slankdev mariadbのコンテナを殺してしまいました
— 鏡音リン (@nomuken) 2015年12月15日
ということで、僕もDockerで構築し直そう!ってなったわけです。 ついでにConohaの新しいVPSにお引越しもしました!SSDやったぜ。
どんな記事でどんな目的?
どんな記事か
Dockerを使用して一つのサーバーで複数のWebサイトを保守管理する環境を構築する記事です。 Docker-Composeを使用しています。
どんな目的か
- Dockerを利用して複数のサイトをお互いに依存なく管理する。
- 初期構築後でもサイトを増やしたり、減らしたりを安全で簡単にできるようにする。
- 今後、メールサーバとか別のサーバーも安全に追加消去できるようにしたい。
変更前と変更後
@slankdev これがBefore pic.twitter.com/YAmIfp77oj
— slankdev (@slankdev) 2016年1月10日
そして完成後のアーキテクチャはこんな感じ。
@slankdev そしてこれがAfter pic.twitter.com/ABs6IVCJsl
— slankdev (@slankdev) 2016年1月10日
立てたコンテナ
今回立てたコンテナは実に8つ… takahoyoさんには「うはぁ」とか言われました… それぞれの役割を以下に示します。
コンテナ名 | 用途 |
---|---|
NginxProxy | slankdev.netを管理.プロキシの機能も.データはDataVolume0を参照 |
WordPress1 | blog.slankdev.netを管理.DBサーバはmariadb1を参照.データはDataVolume1を参照 |
WordPress2 | libpgen.orgを管理.DBサーバはmariadb2を参照. データはDataVolume2を参照 |
MariaDB1 | WordPress1の記事などを管理. データはDataVolume1を参照 |
MariaDB2 | WordPress2の記事などを管理. データはDataVolume1を参照 |
DataVolume0 | slankdev.netのWebページのデータを保持するDataVolumeContainer |
DataVolume1 | blog.slankdev.netのWebページのデータを保持するDataVolumeContainer |
DataVolume2 | libpgen.orgのWebページのデータを保持するDataVolumeContainer |
各コンテナの関係はこんな感じです
ブログ用です。TL汚します。ゴメンなさい pic.twitter.com/cqP3PceeRn
— slankdev (@slankdev) 2016年1月10日
ProxyサーバでHTTPリクエストを受け取り、それがslankdev.net宛なら自身のディレクトリを参照、 blog.slankdev.net宛ならWordPress1の80番ポートへリダイレクト、 libpgen.org宛ならWordPress2の80番ポートへリダイレクトするようにNginxを設定します。
Dockerは一つのコンテナに一つのプロセス、というのが基本らしいのでWordPressの参照するDBサーバは 別のコンテナを用意し、それを参照するようにしました。
というかコンテナの考え的に一つのコンテナの中で復数のプロセスを立ち上げるのはアレなのでは?
— 鏡音リン (@nomuken) 2016年1月4日
Proxyサーバ、WPが2つ、DBサーバが2つで計5つのコンテナをDocker-Composeで一括ですることにしました。
事前にドメインを今回使うサーバに向けておきます。 今回使用するサーバのIPアドレスは163.44.165.49なので
- slankdev.net <–> 163.33.165.49
- blog.slankdev.net <–> 163.33.165.49
- libpgen.org <–> 163.44.165.49
Data Volume Container
今回はDocker-Composeで管理する5つのコンテナの他に3つのData Volume Containerをたてました。 このData Volume Containerは他のコンテナと違い、プロセスは動かさずデータの保存のみに使用します。 WordPressはwp-content以下のtheme, plugin, uploadフォルダがユーザ依存するので、そのデータと SQLサーバとして/var/lib/mysql以下のファイルに記事などのデータベースを保持する、そのデータを 保存するコンテナをbusyboxのコンテナで作成しました。
Data Volume ContainerのみをDocker-Composeの管理対象外にした理由は、記事の移動やバックアップなどが、 独立している方が柔軟に行えるためです。3つに分けた理由は3つのサイトを依存せず管理したかった、 という理由です。
Data Volume Containerに関してはこことかここを参考にしました。
とりあえずこんな感じで8つのコンテナをたてることにしました。
各コンテナの設定内容
まず最初にData Volume Container のDockerfileを示します。 このコンテナは作成して、すぐ終了させてそのままにしておきます。
# This is wordpress's data container image
# /var/lib/mysql -> This is database's volume that has post and pages database
# /var/www/html -> This is wordpress's volume that has theme, plugin, etc..
FROM busybox
MAINTAINER Hiroki Shirokura (slank) slank.dev@gmail.com
VOLUME /var/lib/mysql
VOLUME /var/www/html
次に今回、主となるDocker-Composeの設定内容を以下に示します。
proxy:
build: ./proxy
ports:
- "80:80"
links:
- "server1:wp1"
- "server2:wp2"
volumes_from:
- dataonly0
server1:
build: ./wordpress
links:
- "db1:mysql"
volumes_from:
- dataonly1
server2:
build: ./wordpress
links:
- "db2:mysql"
volumes_from:
- dataonly2
db1:
build: ./mariadb
environment:
MYSQL_ROOT_PASSWORD: example
volumes_from:
- dataonly1
db2:
build: ./mariadb
environment:
MYSQL_ROOT_PASSWORD: example
volumes_from:
- dataonly2
先ほどの設定のまんまなんですごくシンプルだと思います。 各コンテナのイメージは今後のことを考えてDockerfileにしたんですけど、 Proxy以外はほとんど公式イメージのlatestなんで割愛します。(そのまま公式イメージで動くはず)
ProxyのDockerfileだけはNginxの設定をしなくてはいけなかったので、Dockerfileに一部記述があります。
ProxyのDockerfileを以下に示します。
# This Dockerfile is Nginx Reverse Proxy
# Basic-config "nginx.conf"
# Proxy-config "server.conf"
FROM nginx
MAINTAINER Slank slank.dev@gmail.com
ADD nginx.conf /etc/nginx/nginx.conf
ADD server.conf /etc/nginx/conf.d/server.conf
次にnginxの設定を入れるnginx.confとserver.confを示します。 前者は全てネットのテンプレパクりました、ゴメンなさい。
nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
server.conf
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
server {
listen 80;
server_name slankdev.net;
location / {
root /var/www/html;
index index.html index.htm;
}
}
server {
listen 80;
server_name blog.slankdev.net;
location / {
proxy_pass http://wp1;
}
}
server {
listen 80;
server_name libpgen.org;
location / {
proxy_pass http://wp2;
}
}
各設定はこんな感じです。次はいよいよコンテナを作って動かします。
コンテナの作成と実行
docker-composeコマンドとdockerコマンドを使用してコンテナを立てます。もうここは超簡単です。
まずData Volume Container。Dockerfileno
[server]# cd DataVolumeContainer
[server]# ls
Dockerfile
[server]# docker build -t dataonly .
[server]# docker images dataonly
EPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
dataonly latest 7db4343d9c17 10 hours ago 1.113 MB
[server]# docker run -it --name dataonly0 dataonly
/ # exit
[server]# docker run -it --name dataonly1 dataonly
/ # exit
[server]# docker run -it --name dataonly2 dataonly
/ # exit
[server]#
これでData Volume Containerの準備は整ったので、Docker Composeで残りのコンテナを一気に動かします。
[server]# ls docker-compose.yml
docker-compose.yml
[server]# docker-compose build
...省略...
Successfully build 04b15ec46002
[server]# docker-compose up -d
Starting vps20160110_db1_1
Starting vps20160110_db2_1
Starting vps20160110_server2_1
Starting vps20160110_server1_1
Starting vps20160110_proxy_1
[server]#
これで完了です。
本当はこれからWordPressの記事やテーマの復元作業があるのですが、それは今回の目的とは違うので 割愛します。
まとめ
なんとかぐちゃぐちゃながら、Docker入門をすることができました。(できてません) 今回使用したファイルなどは一応GitHubに置いてあります。
Nginx楽しかった。次はメールサーバとかGitサーバも立ててみたい。 :)