読者です 読者をやめる 読者になる 読者になる

Lambdaカクテル

ソフトウェア開発者です.玉石混淆です.

DockerでMinecraftサーバを動かし,Convoyでバックアップしてみた

最近サーバ*1を買ったので,今運用しているVPSから各種サーバを移行しています.

せっかくなので最近の技術を勉強がてら導入したいと思い,Dockerを活用したサーバ構成にすることにしました.今回はMinecraftのサーバを移行することにします. また,DockerプラグインであるConvoyの情報が乏しく,迷った箇所があったので,後学のためのメモとしてこのエントリを書くことにしました.ご参考になれば幸いです.

サーバ名などの固有名詞などは本来のものとは変えてあるので,適宜読み替えてください.

本エントリが行ったおおまかな手順は,

  1. (Dockerのインストール)
  2. Convoyのインストール
  3. MSMイメージのビルド
  4. MSMコンテナのデプロイ(データ移行)
  5. Convoyのスナップショット・バックアップ機能の確認

となっています.

概要

f:id:Windymelt:20160604192249p:plain

  • 買ったマシンには,CentOS 7がインストールされている.
  • マイクラサーバは,Minecraft Server Managerで管理する.
    • MSMは,複数あるマイクラサーバの管理をするツールで,起動やバックアップなどを行うことができる.
    • /opt/msm/servers/以下に,マイクラサーバ本体であるmine1mine2がある.この中にMODやblacklist,JARファイルなどが格納されている.
  • DockerでMSMを管理する.
  • Convoyを使ってコンテナとデータを分離し,データのバックアップができるようにする.
    • マイクラサーバそれぞれ(/opt/msm/servers/{mine1, mine2})にデータボリューム(後述)を用意し,コンテナからアクセスさせる.
    • Convoyには,LVM管理下のストレージをデータ用に使ってもらう.

どうしてそんなことを?

Dockerを使う理由

  • マイクラサーバはJavaで動く.他のサーバとJavaのバージョン競合を起こすかもしれない.したがってJava環境を隔離する必要がある.
  • マイクラサーバを建てたくても,環境構築が面倒だ.Dockerにより,素早くサーバを構築できる.

Convoyを使う理由

  • Docker単独では不十分なデータボリュームの管理能力を向上させられる.
  • Convoyにはデータボリュームのスナップショットやバックアップ/レストア機能がある.Dockerにはない.
    • AWS S3へのバックアップもできる.
  • Dockerから半ば独立したConvoy管理のデータボリュームにより,コンテナとデータを疎結合にできる.

データボリュームとは

サーバを構成するデータは,おおむね動的な要素と静的な要素に分けることができる. データベースサーバのストレージやメールサーバに溜まったメール,HTTPサーバのコンテンツなどは動的な要素で, 一方サーバの設定ファイルや起動に必要なスクリプトは静的な要素だといえる.

動的な要素は定期的なバックアップと,障害発生時の復旧が重要だ.その一方で,静的な要素についても設定構成の保存や環境再構築のための作業が重要だ. 動的な要素と静的な要素はそれぞれ別の系統によって別々に管理するべきだ.そうすれば,各種データは疎結合になり,それぞれの自由な組替えが可能になる.

そして,静的な要素を管轄するのが (コンテナ)イメージ で,動的な要素を管轄するのが データボリューム だ.

イメージはDockerが管理する「環境」の素で,イメージのインスタンスがコンテナである.コンテナ内でファイルが変更されると,それは変更前のイメージと紐付けられ,系譜として管理される.イメージについてはこれ以上の説明は割愛する.

データボリュームはイメージから独立した保存領域で,コンテナ間で共有したり,ホスト上のファイルシステムと接続することができる. また,コンテナを削除してもデータボリュームは残る.

データボリューム自体には系譜的な記録やスナップショットやバックアップなどの機能はない.

ボリュームドライバとは

Dockerには ボリュームドライバ という概念がある.これは,Dockerのデータボリュームを誰が管理するかという部分をDockerから分離するもので, Convoyは数あるボリュームドライバのうちの一つである.

Convoyにはデータボリュームをスナップショット・バックアップ/レストアする機能がある.

Convoyを使うには,データ自体を記録するストレージと,メタデータを記録するストレージがそれぞれ必要である.(物理的に別々である必要はない.)

手順

Dockerのインストールまでは割愛する.

# docker -v
Docker version 1.11.1, build 5604cbe

LVMでConvoy用のLVを用意しておく.ここでは1GiBのメタデータ領域と,大きなデータ用領域をそれぞれ確保した.これもDockerとはあまり関係ないので割愛.

Convoyの導入

コンテナを作る前に,まずはConvoyをインストールする.インストールするといっても簡単で,ConvoyレポジトリのQuick start guideを参考に進めていこう.

ダウンロードして展開し,配置する.

$ wget https://github.com/rancher/convoy/releases/download/v0.4.3/convoy.tar.gz
$ tar xvf convoy.tar.gz
$ sudo cp convoy/convoy convoy/convoy-pdata_tools /usr/local/bin/
$ sudo mkdir -p /etc/docker/plugins/
$ sudo bash -c 'echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec'

最終行のunix:///のスラッシュは3つある.僕はここでハマったので注意しよう.コピペしよう.

さて,Quick start guideではループバックデバイスを使ってファイルシステム上にメタデータとデータのための領域を確保しているが,今回はLVM上のLVを使う.

Convoyをデーモンとして起動させるが,今回は素朴にnohupで動かす. そのうちsystemctlやinit.d用に起動スクリプトを用意したい.(LVの名前は適宜読み替える)

$ sudo nohup convoy daemon --drivers devicemapper --driver-opts dm.datadev=/dev/mapper/working-dockerdata --driver-opts dm.metadatadev=/dev/mapper/working-meta &

これでConvoyのセットアップは完了だ.

Dockerでイメージをビルドし,走らせる

さて,MSMのイメージを走らせたいところだが,そんなものはないので作らないといけない.

イメージをビルドする

MSMのインストール手順のページを参考にDockerfileを作成する.基本的に書かれているコマンドを順に実行させるだけなので,それほど難しくないはず.Dockerfileの作成については,効率的に安全な Dockerfile を作るには - Qiitaがたいへん参考になった.

とはいえ一からこれをやるのは面倒なので,Dockerfileを利用可能な形でアップしておいた.

github.com

これのgenericブランチ*2をcloneしてきて,Dockerfileを調整しよう.今回はサーバを2つ建てるので,EXPOSEするポートを増やした.

$ git clone git@github.com:windymelt/docker-msm.git
$ cd docker-msm
$ git checkout generic
$ vi Dockerfile # EXPOSE行にポートを追加する
EXPOSE 25565 25566
$

イメージをビルドする.

$ docker build -t msm-image .

(データの移行)

これでMSMを走らせることができる状態になった.このまま走らせたいところだが,既に旧サーバが存在していてデータを移行しなければならない場合は,旧サーバのデータディレクトリとConvoyとの両方をマウントして,Convoyにデータを移す.飛ばしたい人は飛ばしてもいいよ.

まずは旧サーバにつないでデータをコピーしてくる.ここではscpを使う.

$ cd ../ # イメージのディレクトリから元のディレクトリに戻る
$ scp old-minecraft-vps:/opt/msm/servers
$ cd servers
$ ls
mine1 mine2 # マイクラサーバをコピーしたことを確認
$

新サーバにデータが落ちてきたので,データをConvoyにコピーする.ここでmsm-imageイメージを使う必要はないので,busyboxイメージを使う.

-tiオプションは,要するに「そのままログインしてね」という意味.

最初2つの-vオプションは母艦上のファイルシステムとコンテナ内のファイルシステムをマウントするためのもので,後者2つの-vオプションはConvoy上のデータボリュームを使うことを指示するためのもの.移行するマイクラサーバの数が2つなので,それぞれについてデータボリュームを用意するためにオプションを2つずつつけている.

--volume-driver=convoyは,ボリュームドライバとしてConvoyを使うことを指示するためのもの.

$ sudo docker run --name copying -ti -v servers/mine1:/opt/msm/servers/mine1_old -v servers/mine2:/opt/msm/servers/mine2_old  -v mine1_data:/opt/msm/servers/mine1 -v mine2_data:/opt/msm/servers/mine2 --volume-driver=convoy busybox /bin/bash
# cd /opt/msm/servers
# rsync -av mine1_old/ mine1/
# rsynv -av mine2_old/ mine2/
# exit
$

MSM,起動

データがConvoyにコピーされた.いよいよmsm-imageイメージを起動する.

-dオプションはコマンド(/bin/bash)をバックグラウンドで実行するためのもの.

-pオプションはポートの開放を指示するためのもの.

$ sudo docker run -ti -d --name msm -v mine1_data:/opt/msm/servers/mine1 -v mine2_data:/opt/msm/servers/mine2 --volume-driver=convoy -p 25565:25565 -p 25566:25566 msm-image /bin/bash
$

起動したら中のマイクラサーバを起動させよう.(Dockerfileを工夫すれば自動的に起動させることができると思うが,勉強不足でまだ至っていない.)

$ sudo docker attach msm
# msm mine1 start # /usr/local/bin/msm
# msm mine2 start

これでMinecraftクライアントからサーバに接続できるようになったはずだ.

Convoyでバックアップ,レストア

Convoyによるバックアップは簡単だ.だが直接データボリュームをバックアップすることはできない.まずはデータボリュームのスナップショットを作成し,ある時点での状態を保存した上で,スナップショットに対してバックアップを行うという仕組みになっている.

スナップショット

Convoyでスナップショットを作成するには,convoy snapshot createを使う.--nameオプションによってスナップショットに名前を付けられる.

$ sudo su
# convoy snapshot create mine1_data --name snap_mine1_001
#

ちなみにConvoyで作成したスナップショットは,convoy listを使って表示されるデータボリュームリストの下に表示される.名前が分からなくなったりしたら活用しよう.

バックアップ

Convoyでスナップショットのバックアップを作成するには,convoy backup createを使う.書き出す先は,--destオプションで指定する.以下の例では,バックアップをホスト上の/var/convoyに書き出している.

# convoy backup create snap_mine1_001 --dest vfs:///var/convoy/

バックアップURL が表示されるので,復元に備えて控えておこう.

バックアップ自体は単一ファイルではないので,必要ならば/var/convoyをtarなどでアーカイブしよう.ちなみにConvoy公式サイトでは,S3へのバックアップが説明されている.バックアップ先はオブジェクトストレージになっており,可能ならば自動的に差分バックアップが実施される.バックアップ先が削除されれば,自動的に完全なバックアップを作成する.すごい・・・すごすぎるぞConvoy・・・

レストア

Convoyでバックアップからデータボリュームを復元するには,データボリュームを作成するのと同じようにconvoy createを使う.ただし,--backupオプションで バックアップURL を指定する.

# convoy create mine1_restored --backup vfs:///var/convoy/....

Convoyは,既にあるデータボリュームにバックアップを復元することはできない.必ず新しくデータボリュームを作成することになる.スナップショットについても言えるが,こうなっているのは事故防止のためだと思われる.

新たにデータボリュームを復元したら,データボリュームを交換して再起動させよう.

$ sudo docker stop msm
$ sudo docker rm msm
$ sudo docker run -ti -d --name msm -v mine1_restored:/opt/msm/servers/mine1 -v mine2_data:/opt/msm/servers/mine2 --volume-driver=convoy -p 25565:25565 -p 25566:25566 msm-image bash
# msm mine1 start
# msm mine2 start
# exit
$

これでバックアップからマイクラサーバが起動した.

まとめ

このエントリでは,Dockerの基礎的な部分と,Convoyの簡単な使用方法を,MSMによるマイクラサーバ管理という実例をまじえて解説しました.より詳しくDockerについて知りたい方は公式サイトのドキュメントを覗かれるとよいでしょう.Convoyについて知りたい方は,あまり情報はありませんが公式サイトや英語での検索をおすすめします.MSMについては公式サイト以外にも日本語での情報を検索できます.

また,EXPOSEを利用して開いたポートは外部からアクセスできるようになるので,ホストが接続しているネットワークが外部から隔離され,セキュリティが確保されていることをよく確認してください.

例では,Convoyが使うストレージとしてLVMが提供する論理ボリュームを利用しましたが,ループバックデバイスを使ってファイルをストレージにして稼動することもできます.ただしこの方法は不安定で実用には向きません. LVMについてはLVM - ArchWikiを,ループバックデバイスについては Linux のループデバイスを使ってみる - CUBE SUGAR CONTAINERを参照すると分かりやすくてよいと思います.

よい鉱山ライフをお送りください.

参考書籍

*1:FUJITSU PRIMERGY TX1310M1

*2:masterは適当にいじってある