開発

《VPSをつい借りすぎてしまうあなたへ》さくらのVPS+LXCで快適コンテナ環境生活

2013年8月2日

機能やサービスごと、もしくはサイトごとについつい、いくつものVPSを借りてしまってはいませんか?

スクリーンショット 2013-08-02 19.20.21

僕がそうなんです。環境はお互いに独立しておいたほうが後々良いという考えのもと、さくらのVPSをサービスごとに借りてしまい、いつのまにか請求額が高くなっているというのは、よくあることです。ありますよね?

会社でもつい借りまくって毎月の請求が7万とかになってて悲しんでいます。

今回、個人的に借りていた3台のVPSを1台に集約したいと思いました。
初代の「さくらのVPS512」というプランが3つで2940円掛かっていましたが、「さくらのVPS 石狩リージョン 2G v3」の初期費用無料、月額1480円に節約したいと思います。

最近できたConoHaなど、別にさくらのVPSに限らず他社のKVMなVPSでもいいと思います。
CloudCore CV01はちょっと割高に感じるので、さくらかConoHa、それにお名前.com VPSがいいと思います。お名前.com VPS はGMOですけど、なかなか使えますし、年間一括で払えば1,153円とだいぶ格安です。さくらのVPS 2G を年間一括で借りると、月額1,356円です。

LXCは、Linuxカーネルに標準で搭載されている、アプリケーションをコンテナに収容しjailのように独立した環境を実現するための機能です。

LXCには、cgroupsを使って特定のアプリケーションともう一つの特定のアプリケーションだけを独立させたりすることもできますが、今回はOS(Linux)環境をコンテナ内に収容して独立させる方法を利用します。

こうすることでインストールするライブラリや通信、利用ポート、CPUやメモリの資源を効率的に利用しつつも独立させ、競合や汚染が発生しないようにできます。

ただし、LXCはセキュリティ上の問題をいくつか抱えているため、LXCをサービス化したり、信頼出来ない人にゲスト環境を貸したりすることはおすすめしません。

RedHat も、アプリケーションを独立させるにはいいけど、OS環境を独立させるのにLXCは現状は向いていない。やるなら完全仮想のKVMを使えという言い方をしています。

今回、LXCを利用するのは、仮想環境内で利用でき、オーバーヘッドも少なく、それでいて扱いやすいものを個人的に、もしくは単一の組織内で信頼出来る人同士で利用することを想定しています。

通常の用途で使う分には、上記で述べたセキュリティ上の問題を気にする必要はありません。
信頼出来ない人に環境を貸すのは、LXCにかぎらずKVMやXenでも同様だという考え方もあります。

なお、LXCのほかに準仮想のXenやNested KVM、docker、wardenなど複数のハイパーバイザーや、コンテナ構築ツールを検証しましたが、素のLXCが一番素直で扱い易かったので、LXCを採用しました。

この環境のメリットとして、国内のVPSサービスでDebianやUbuntuを使うときにありがちな、OSのインストールや環境構築作業から開放されることや、実験環境を作っては消して…ということをVPS1台のなかで何度でも繰り返し行えることです。国内だとデフォルトのOSがCentOSという悲しい状態なので毎回セットアップしないといけないですが、LXC環境になってから楽になりました。

VPSが安くて高性能になる分、リソースが余ってるという方も多いのではないでしょうか。
リソースを余すところなく使い切るにはコンテナ環境はとても良いと思います。

では、環境を構築して行きましょう。

ホストとなるOSは Ubuntu 12.04 です。
さくらのVPS 2G を契約してきます。

スクリーンショット 2013-08-02 15.22.14

スクリーンショット 2013-08-02 15.22.32

スクリーンショット 2013-08-02 15.22.56

スクリーンショット 2013-08-02 15.24.01

VPSの契約方法は、触ればわかると思いますが、不明な場合はさくらのサポートセンターを見るなりネットで検索するなりお願いします。

スクリーンショット 2013-08-02 15.27.00

スクリーンショット 2013-08-02 15.27.11

スクリーンショット 2013-08-02 15.27.21

さくらのVPSコントロールパネルで「OS再インストール」から「カスタムOSインストールへ」のリンクをクリックし、 Ubuntu 12.04 を選択してセットアップを進めてください。
JAVAがうまく動かない環境では、リモートコンソールが開かないので、Java環境とブラウザを整えるところからですね…。

スクリーンショット 2013-08-02 15.34.30

スクリーンショット 2013-08-02 15.34.46

スクリーンショット 2013-08-02 15.34.55

スクリーンショット 2013-08-02 15.35.18

スクリーンショット 2013-08-02 15.35.26

スクリーンショット 2013-08-02 15.35.32

スクリーンショット 2013-08-02 15.35.45

スクリーンショット 2013-08-02 15.40.51

スクリーンショット 2013-08-02 15.40.59

スクリーンショット 2013-08-02 15.41.09

スクリーンショット 2013-08-02 15.41.15

スクリーンショット 2013-08-02 15.41.22

スクリーンショット 2013-08-02 15.43.05

スクリーンショット 2013-08-02 15.43.21

スクリーンショット 2013-08-02 15.43.34

スクリーンショットのとおりに進めていただいて構いません。

DebianとUbuntuでは、rootのパスワードを空にすると root のパスワードログインを無効にして sudo を使うようになります。個人的にはrootパスワードを空にするのが良いと思います。

スクリーンショット 2013-08-02 16.46.23

スクリーンショット 2013-08-02 17.05.11

作った環境にログインします。

sudo apt-get install lxc

で、LXCをインストールします。

スクリーンショット 2013-08-02 17.08.37

スクリーンショット 2013-08-02 17.08.37

スクリーンショット 2013-08-02 17.08.47

スクリーンショット 2013-08-02 17.08.59

スクリーンショット 2013-08-02 17.09.19

スクリーンショット 2013-08-02 17.09.27

「/etc/iptables.rule」を作ります。

sudo vi /etc/iptables.rule
# Generated by iptables-save v1.4.12 on Thu Aug  1 19:06:58 2013
*filter
:INPUT DROP [54:4666]
:FORWARD ACCEPT [3:252]
:OUTPUT ACCEPT [27:2716]
-A INPUT -p tcp -m state --state NEW -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -j DROP
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -i lxcbr0 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22222 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 5000 -j ACCEPT
-A INPUT -p udp -m udp --sport 123 --dport 123 -j ACCEPT
-A INPUT -p udp -m udp --sport 53 -j ACCEPT
COMMIT
# Completed on Thu Aug  1 19:06:58 2013
# Generated by iptables-save v1.4.12 on Thu Aug  1 19:06:58 2013
*nat
:PREROUTING ACCEPT [345:17831]
:INPUT ACCEPT [134:8662]
:OUTPUT ACCEPT [6:448]
:POSTROUTING ACCEPT [9:640]
-A PREROUTING -i eth0 -p tcp -m tcp --dport 22 -j DNAT --to-destination 10.0.3.10:22
-A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.0.3.20:80
-A PREROUTING -i eth0 -p tcp -m tcp --dport 443 -j DNAT --to-destination 10.0.3.20:443
-A POSTROUTING -s 10.0.3.0/24 ! -d 10.0.3.0/24 -j MASQUERADE
COMMIT
# Completed on Thu Aug  1 19:06:58 2013

のような内容にしてください。

SSHの22番ポートにきたアクセスはLXCゲストの 10.0.3.10の22番に転送、HTTP/HTTPSアクセスは 10.0.3.20に転送というNATを書いています。
5000番ポートはあとで使うWebUIです。固定IPアドレスの環境からのみ使う方は、iptablesにIPアドレスでの制限を入れるなりしてください。
22222番は、ホストのSSHのポートをあとで22222に変更する予定なのでそのために開いていますが、特定の環境からだけアクセスしたいとか、コンテナゲスト側からアクセスされないようにしたいという設定は、希望に合わせて書き換えてください。

次に「/etc/network/if-pre-up.d/iptables」を作成します。

sudo vi /etc/network/if-pre-up.d/iptables

で中身を

#!/bin/sh
/sbin/iptables-restore < /etc/iptables.rule

として保存してください。

sudo chmod +x /etc/network/if-pre-up.d/iptables

してください。これでネットワークが立ち上がる前にiptablesが適用されます。

ホストのSSHポートを変更します。

sudo vi /etc/ssh/sshd_config

で sshd_config を編集し、 Port 22 の部分を Port 22222 など、先ほど作ったiptablesの内容に合わせるようにしてください。

編集が終わったら

sudo service ssh restart

でSSHdの設定を反映します。

sudo /etc/network/if-pre-up.d/iptables

を実行して、iptablesの設定を適用します。

sudo iptables -nL -t filter

sudo iptables -nL -t nat

で設定を確認してください。

次に、LXC Web Pannel をインストールします。
スクリーンショット 2013-08-02 17.10.41

sudo -s

でrootに昇格してください。

wget http://lxc-webpanel.github.io/tools/install.sh -O - | bash

で、 LXC Web Pannel を自動インストールします。しばらく待てばOKです。

次に、コンテナテンプレートを調整します。デフォルトのリポジトリが archive.ubuntu.com になっていて遅いので、国内のrikenやKDDI labsなどお好みのリポジトリに変更してください。

sudo vi /usr/lib/lxc/templates/lxc-ubuntu

write_sourcelist()内の「MIRROR=${MIRROR:」の行と「SECURITY_MIRROR=${SECURITY_MIRROR:-」の行を変更します。

case $2 in
      amd64|i386)
            MIRROR=${MIRROR:-http://ftp.riken.go.jp/Linux/ubuntu}
            SECURITY_MIRROR=${SECURITY_MIRROR:-http://ftp.riken.go.jp/Linux/ubuntu}
            ;;

のような感じです。

インストールが終わったら、 http://IPアドレス:5000/ にアクセスします。

スクリーンショット 2013-08-02 17.12.05

スクリーンショット 2013-08-02 17.12.15

テンプレートは ubuntu を選択して、名前は好きに付けます。

初回はubuntuのパッケージを準備するのにだいぶ時間がかかりますが待ちましょう。また、Safariでやるとうまく動かなかったのでブラウザはChromeがいいと思います。

main というメインに使う環境と、baseというクローン用のベースイメージ環境を作ります。

main のほうは、 Start at boot を ON にしましょう。

IP addressの設定は、base を 10.0.3.240、mainを10.0.3.10 にします。10.0.3.10 は最初のiptablesでNAT先に設定したものです。
このIPアドレスは 10.0.3.2〜10.0.3.254の範囲で設定するようにしてください。

.10、.20などキリの良い数字で機能別に分けたり工夫してください。

スクリーンショット 2013-08-02 17.26.49

mainのほうにログインします。

スクリーンショット 2013-08-02 17.28.34

LXCゲストの初期IDとパスワードは ubuntu です。 ubuntu@VPSサーバ、パスワードも ubuntu でログインします。
スクリーンショット 2013-08-02 17.28.51

スクリーンショット 2013-08-02 17.29.10

スクリーンショット 2013-08-02 17.29.41

sudo adduser isidai

で、普段使いのユーザIDを作ります。

sudo visudo

で最後の行に

isidai ALL=(ALL:ALL) NOPASSWD:ALL

などを設定してsudoを使えるようにします。 %admin や %sudo のグループに入れても構いません。お好みでどうぞ。また、NOPASSWD: をつけることでパスワードを聞かれないようにしていますが、パスワードを聞かれたいという方は付けなくてもOKです。

このあと、一度ログアウトして、新しく作ったユーザで入ります。

スクリーンショット 2013-08-02 17.30.12

無事に入れたら

sudo deluser ubuntu

として、ubuntuユーザを削除します。

またlocalesの設定がおかしいので治します。

スクリーンショット 2013-08-02 17.31.16

スクリーンショット 2013-08-02 17.31.52

sudo vi /etc/environment

で、

LANGUAGE=en_US.UTF-8
LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8

を追記して保存します。
その後、

sudo locale-gen en_US.UTF-8
sudo dpkg-reconfigure locales
sudo update-locale LANG=en_US.UTF-8

を実行します。

ローカルタイムもAsia/Tokyoに変更します。

sudo ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

次に、クローン用のベースイメージの作成に入ります。

スクリーンショット 2013-08-02 17.33.12

最初に main の環境で

ssh-keygen -t rsa

で鍵を作っておきます。パスフレーズは必要な人は入力し、不要な人は空にします。

スクリーンショット 2013-08-02 17.32.53
LXCゲストからは他のゲストを名前で引けますので

ssh ubuntu@base.

としてアクセスできます。最後のピリオドを忘れないでください。

ubuntuユーザでベースイメージにログインしたら、main環境と同じようにユーザの作成とenviromentの設定をしてください。その後、

sudo apt-get install zsh vim htop
chsh -s /usr/bin/zsh

など、普段、最低限必須としているパッケージを入れていきます。
その後、.zshrcや.vimrc、tumxやscreenが必要な人はそういった設定を施します。

スクリーンショット 2013-08-02 17.34.46
base側に新しく作ったユーザに、main環境で作った公開鍵を渡しておきます。

main側から

scp ~/.ssh/id_rsa.pub isidai@base.:~/authorized_keys

などのようにして渡します。

base側で

mkdir ~/.ssh
chmod 700 ~/.ssh
mv ~/authorized_keys ~/.ssh/
chmod 600 ~/.ssh/authorized_keys

で、鍵を配置できました。
一旦ログアウトしてからmain側でSSHログインをしてみて、鍵ログインができればOKです。

これは、LXCゲスト間の通信でいちいちパスワードを聞かれたくないので鍵認証にしていますが、毎回パスワードを聞かれても良いひとは鍵の交換をする必要はありません。

スクリーンショット 2013-08-02 17.38.31

base側に環境ができたら Web Pannel からシャットダウンするか、

sudo shutdown -h now

してください。
スクリーンショット 2013-08-02 17.38.54

次にバーチャルホストでリバースプロキシするnginxサーバと独立環境のwordpress環境を作っていきます。

Web Pannel の右上にある Clone CT を選択すると、クローンができます。SnapshotかClassicか選べますが、環境のクローンならClassicを選びましょう。
右側に新しいコンテナの名前をつけます。 nginx と wordpress を作ります。

スクリーンショット 2013-08-02 17.41.22

それぞれにIPアドレスを設定して起動します。nginxは80番と443番の通信をNATで受け取るコンテナになりますので、iptablesで設定した 10.0.3.20 に設定します。wordpressは.30とか.21とか適当で構いません。

スクリーンショット 2013-08-02 17.41.38

main環境から

ssh nginx.

でログインします。

先ほど環境構築をしたbaseからのクローンなので、OSの設定等も不要で鍵ログインですぐに自分の好みの環境が出てくると思います。

スクリーンショット 2013-08-02 17.42.13

sudo apt-get install nginx

でNginxをインストールします。

スクリーンショット 2013-08-02 17.44.46

sudo vi /etc/nginx/sites-available/wordpress

などで、設定ファイルを作ります。

server {
    server_name kraftwerk.jp www.kraftwerk.jp;
    proxy_set_header  Host www.kraftwerk.jp;
    location / {
        proxy_pass http://wordpress.:80;
    }
}

のような感じで、Nginxのリバースプロキシを設定します。

スクリーンショット 2013-08-02 17.44.49

sudo ln -s /etc/nginx/sites-available/wordpress /etc/nginx/sites-enabled/

で有効化し、

sudo service nginx reload

で、設定をリロードします。

同様にwordpress側も設定し、apache2を入れたりmysqlを入れたりwordpressを入れたり設定します。これはほかのサイトを参考にしてみてください。
スクリーンショット 2013-08-02 17.47.53

あとは、DNSを変更するなりhostsをいじって、先ほどnginxコンテナで設定したドメインにアクセスしてリバースプロキシでバーチャルホストが処理されているか確認出来ればOKです。
色々な使い方ができると思います。

僕は、subsonicやimotenを入れています。

以上、お疲れ様でした。

Pocket

You Might Also Like