ytooyamaのブログ

サーバ構築とか、仕事で発見したこととか、趣味のこととかを書いています。

UbuntuのLXCコンテナーでサービスを動かす

Dockerでサービスを動かし、サービスを外部からアクセスする際の手段としてポートフォワードを使う方法があると思います。

runnable.com

qiita.com

じゃあ、これをLXD,LXCでやるとどうやるのという話ですが、lxcコマンドには特にそのようなオプションを指定するものはないようなので、次のようにiptablesで設定すれば良いようです。以下、Ubuntu 16.04.xでLXC,LXDを使う場合を例として説明します。

これくらいの方法、ドキュメント化されているだろうと思ったら全然見つからなかったのでまとめておきます。こういう話ってQiitaに書いたら喜ばれるんだろうか。週末書くかも。

サービスの起動設定

コンテナーはLXC、コンテナーホストの管理はLXDで行うために、LXDサービスを起動しておきます。

host# systemctl start lxd
host# systemctl enable lxd

初期設定

初めて起動する場合は次のように実行してください。詳細はこちら

host# lxd init

コンテナの起動

初回はデプロイ用のコンテナーイメージをダウンロードします。本例はmy-ubuntuという名前のコンテナーにTrustyをインストールします。

host# lxc launch ubuntu:14.04 my-ubuntu
host# lxc list
+-----------+---------+----------------------+------+------------+-----------+
|   NAME    |  STATE  |         IPV4         | IPV6 |    TYPE    | SNAPSHOTS |
+-----------+---------+----------------------+------+------------+-----------+
| my-ubuntu | RUNNING | 10.251.33.235 (eth0) |      | PERSISTENT | 0         |
+-----------+---------+----------------------+------+------------+-----------+

コンテナにApache Webサーバーをインストー

lxc exec my-ubuntu bashと実行してコンテナーにログインしてから実行しても良いですが、次のようにコマンドを渡してホストからコンテナーを制御することもできます。

host# lxc exec my-ubuntu apt update
host# lxc exec my-ubuntu apt install apache2

iptablesの設定

ホスト上でポートフォワードの設定を行います。ホスト:50080にアクセスすると、コンテナーの80ポートにアクセスするように設定するには次のように実行します。Dockerでポートフォワードを設定するときと同様、ポート番号被りに注意します。「DYNAMIC AND/OR PRIVATE PORTS」を使うと良いでしょう。

host# iptables -t nat -A PREROUTING -p tcp -i enp0s5 --dport 50080 -j DNAT --to-destination 10.251.33.235:80
  • 上例「-i enp0s5」がNAT接続に使うNIC。外部と繋がっている側を指定
  • 上例「–dport 50080」が「Host IP:dport」で指定したポートでアクセスできるために必要な設定
  • 上例「–to-destination 10.251.33.235:80」がアクセスした時の実際の行き先

iptablesの設定をセーブ

iptablesの設定をセーブする。永続化したい場合は各自調べてください。

host# iptables-save

ブラウザーでアクセス

この時点で、http://<LXCHostのIPアドレス>:50080/でアクセスすればコンテナー上にインストールしたApache Webサーバーにアクセスできます。

では次に、PHPを追加してみましょう。

host# lxc exec my-ubuntu apt update
host# lxc exec my-ubuntu apt install php5

次のように実行して、テスト用のPHPスクリプトを作成します。

ログイン
host# lxc exec my-ubuntu bash
ファイル作成
my-ubuntu# echo "<?php phpinfo() ?>" > /var/www/html/test.php

ブラウザーhttp://<LXCHostのIPアドレス>:50080/test.phpにアクセスすると、PHPのテスト用スクリプトを表示できます。つまり、LXCコンテナーApache Webサーバー、PHPの環境を作れたというわけです。仮想マシンと比べてあっという間に構築できるのがコンテナーの魅力です。Dockerも良いですが、LXCも触ると楽しいですよ。

注意点

VirtualBox VMではちょっとうまく動きませんでした。KVMやESXi、VMware Workstation、VMware FusionParallels Desktopだとうまくいくと思います。私はParallels Desktop 12にUbuntu Server 16.04.2をインストールして試しました。もちろん、物理サーバーにLXC,LXD環境を作って、コンテナーを動かすのも同じように可能です。Ubuntu 16.04.xであればLXC,LXDはインストール済みです。