[2018年7月19日 追記] Ubuntu 18.04.xで動作確認。
Dockerでサービスを動かし、サービスを外部からアクセスする際の手段としてポートフォワードを使う方法があると思います。
じゃあ、これを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
永続化するにはiptables-persistentをインストールして、IPv4およびIPv6のルールを保持するように設定する。
host# apt install iptables-persistent IPv4のルールを保持するか? y IPv6のルールを保持するか? y
ブラウザーでアクセス
この時点で、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 Fusion、Parallels Desktopだとうまくいくと思います。私はParallels Desktop 12にUbuntu Server 16.04.2をインストールして試しました。もちろん、物理サーバーにLXC,LXD環境を作って、コンテナーを動かすのも同じように可能です。Ubuntu 16.04.xであればLXC,LXDはインストール済みです。