インストール
LXC関連のrpmやdebootstrapのrpmはEpelリポジトリに登録されているらしいのでEpelを追加してからLXC関連パッケージをインストールします。
$ sudo yum install -y epel-release
$ sudo yum update
$ sudo yum install lxc lxc-templates lxc-doc lxc-libs rsync debootstrap
LXCコンテナでDebianやUbuntuを使う予定がない場合は、debootstrapのインストールは不要です。
rsyncはコンテナインストールする時に使用するみたいです。
仮想ネットワーク
LXC単体で仮想ネットワークを提供できるかどうかは後々調べるとして、bridge-utilsを利用して仮想ネットワークを構築します。
$ sudo yum install bridge-utils
仮想ブリッジインタフェース
下記の内容で/etc/sysconfig/network-scripts/ifcfg-lxcbr0
を作成し、NetworkManagerを再起動すれば有効になる...はずなのですが、なぜかOSを再起動しないと有効にならなかった。
NAME=lxcbr0
DEVICE=lxcbr0
TYPE=Bridge
BOOTPROTO=static
ONBOOT=yes
IPADDR=172.16.1.1
PREFIX=24
DEFROUTE=no
NM_CONTROLLED=no
#DNS1=192.168.xxx.x
#SEARCH=example.com
LXCコンテナのインストール
CentOS
$ sudo lxc-create -n centos7 -t centos -- --release 7
コンテナの作成が完了すると、デフォルトパスワードが/var/lib/lxc/centos7/tmp_root_pass
に出力されます。
作成するコンテナのCentOSのバージョンは--release
で指定します。環境依存かもしれませんが、CentOS7は安定稼働させられていませんので、ちょっと古いですが、LXCコンテナでCentOSを動かす場合、今のところ(2016年4月現在)CentOS6がお勧めかもしれないです。
Debian Linux
$ sudo lxc-create -n debian_jessie -t debian -- --release jessie
--release
でDebian Linuxのバージョンが指定できます。Debian Linux8をインストールする場合はjessie
、Debian Linux7の場合はwheezy
を指定します。
デフォルト設定でほぼ最小構成のインストールですが、さらに最小を目指す場合は/usr/share/lxc/templates/lxc-debian
の下記の行で$packagesで指定するパッケージを削除したり、--exclude
でインストール対象から外したいパッケージを指定していてください。
echo "Downloading debian minimal ..."
debootstrap --verbose --variant=minbase --arch=$arch \
--include=$packages \
"$release" "$cache/partial-$release-$arch" $MIRROR
ネットワークインタフェース設定
各コンテナのコンフィグファイルに下記の記述を追加します。
ほとんどの設定はコンテナをインストールした段階で設定されているはずなので、lxc.network.link
で指定するインタフェース名だけを設定するだけだと思います。
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = lxcbr0
lxc.rootfs = /var/lib/lxc/intranet/rootfs
コンテナの起動
$ lxc-start -n debian_jessie
または、
$ lxc-start -n debian_jessie -d
$ lxc-console -n debian_jessie
で起動します。debianコンテナのデフォルトのrootパスワードはroot
みたいです。
前者のコマンド(-dなし)でコンテナを起動した場合、コンテナ起動後、コンテナのコンソールに自動で接続し、コンテナ終了までコンテナのコンソールを抜けられません。
後者のコマンド(-dあり)でコンテナを起動した場合、lxc-console
コマンドを入力するまでコンテナのコンソールに接続しません。また、コンソール接続後、Ctrl+a q
でコンテナのコンソールを抜けることができます。
コンテナの自動起動
/var/lib/lxc//configに
lxc.start.auto = 1
を追加し、
$ sudo systemctl enable lxc.service
のようにして、lxc.service
がOS起動時に自動起動するよう設定すればlxc.start.auto=1
を設定したコンテナが自動起動するはずです。
よくある問題
コンテナからインターネットにつながらない
LXCコンテナからLXCホストを踏み台にしてインターネットに接続する場合、LXCホストのファイアウォール周り設定を変更する必要があります。
下記のようにiptablesの設定を一度クリアして、最低限の設定だけを追加した方がトラブルシューティングしやすいと思います。
sudo echo 1 > /proc/sys/net/ipv4/ip_forward
sudo iptables -F
sudo iptables -F -t nat
sudo iptables -t nat -A POSTROUTING -o eno16777736 -j MASQUERADE
(eno16777736がインターネット方向のインタフェースと思って読んでください。)
WindowsからLXCホストにログインせずにコンテナにログインしたい
NAT(NAPT)の設定を行い、Windows PCに仮想ネットワークへのルートを追加すると、LXCホストにログインせずにコンテナにログインできます。
コマンドプロンプトで、
> route add 172.16.1.0 mask 255.255.255.0 LXCホストのIPアドレス
または、
> route add 172.16.1.0 mask 255.255.255.0 LXCホストのIPアドレス -p
のような感じでルートを追加します。前者はWindowsを再起動するたびにルートを追加する必要があります。後者のように「-p」をつけると、Windowsを再起動してもルートを保持します。
コンテナのrootパスワード忘れた
LXCでは、LXCホストからコンテナのルートファイルシステムを直接参照できるので、chroot
コマンドを実行することで、rootに限らずその他アカウントのパスワード変更ができます。パッケージのインストールもできたりします。
Debianコンテナからpingが実行できない
別に問題というわけではありませんが、Debianコンテナではデフォルトでpingコマンドはインストールされないみたいです。なので、必要な場合は手動でインストールする必要があります。
$ sudo apt-get install iputils-ping
または、
$ sudo chroot /var/lib/lxc/debian_jessie/rootfs/ apt-get install iputils-ping
lxc-start: lxc_start.c: main: 295 Executing '/sbin/init' with no configuration file may crash the host
コンテナを起動しようとしたとき、
# lxc-start -n debian -d
lxc-start: lxc_start.c: main: 295 Executing '/sbin/init' with no configuration file may crash the host
のエラーメッセージが出力された場合、
# lxc-start -f /var/lib/lxc/debian8/config -n debian -d
のようにして、コンフィグファイルを指定すると直るようです。1回正常に起動できれば、それ以降はコンフィグファイルを指定しなくてもよいようです。
理由は不明ですが...