高速通信計算研究所

slankdevの報告

Docker使ってVPS構築しなおした

年末だし、VPSのバックアップとか、いろいろやって綺麗に作り直そう!と考えていたら年が明けて、 一週間もがたちました。

いままで自分はslankdev.netとlibpgen.orgの2つをwordpressのマルチサイト機能で管理していたんですが、 つい先日どこかのプロが不手際でmariadbのコンテナを壊して泣いているとTwitterで見たのをきっかけで コンテナに興味を持ち始めました。

ということで、僕もDockerで構築し直そう!ってなったわけです。 ついでにConohaの新しいVPSにお引越しもしました!SSDやったぜ。

どんな記事でどんな目的?

どんな記事か

Dockerを使用して一つのサーバーで複数のWebサイトを保守管理する環境を構築する記事です。 Docker-Composeを使用しています。

どんな目的か

  • Dockerを利用して複数のサイトをお互いに依存なく管理する。
  • 初期構築後でもサイトを増やしたり、減らしたりを安全で簡単にできるようにする。
  • 今後、メールサーバとか別のサーバーも安全に追加消去できるようにしたい。

変更前と変更後

まず今までのVPSアーキテクチャを示す。

そして完成後のアーキテクチャはこんな感じ。

立てたコンテナ

今回立てたコンテナは実に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

各コンテナの関係はこんな感じです

ProxyサーバでHTTPリクエストを受け取り、それがslankdev.net宛なら自身のディレクトリを参照、 blog.slankdev.net宛ならWordPress1の80番ポートへリダイレクト、 libpgen.org宛ならWordPress2の80番ポートへリダイレクトするようにNginxを設定します。

Dockerは一つのコンテナに一つのプロセス、というのが基本らしいのでWordPressの参照するDBサーバは 別のコンテナを用意し、それを参照するようにしました。

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

としてドメインIPアドレスを結びつけておきます。

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サーバも立ててみたい。 :)

参考文献