RancherOS で KVM+libvirt に固定IPで Docker ホストを作るメモ

KVM+libvirt な仮想化ホストに、ブリッジ I/F で固定IPな Docker ホストを RancherOS で作るメモ。

# RancherOS の ISO をダウンロード
wget https://releases.rancher.com/os/latest/rancheros.iso

# SSH鍵をダウンロード
curl -s https://github.com/ngyuki.keys -o authorized_keys

# ConfigDrive のディレクトリを準備
mkdir -p configdrive/openstack/latest

# ConfigDrive の user_data を作成
vim configdrive/openstack/latest/user_data
#cloud-config

ssh_authorized_keys:
$(sed 's/^/  - /' authorized_keys)

rancher:
  network:
    dns:
      nameservers:
        - 192.168.0.1
    interfaces:
      eth0:
        address: 192.168.0.100/24
        gateway: 192.168.0.1
        dhcp: false

  state:
    formatzero: true
    autoformat:
      - /dev/vda
# ConfigDrive の ISO を作成
mkisofs -R -V config-2 -o configdrive.iso configdrive

# 永続データのディスクイメージを作成
echo -n "boot2docker, please format-me" > data.img
truncate -s 1G data.img

# ゲストを作成
virt-install \
  --import \
  --name rancheros \
  --hvm \
  --virt-type kvm \
  --ram 2048 \
  --vcpus 1 \
  --arch x86_64 \
  --os-type linux \
  --boot cdrom \
  --disk "$PWD/data.img,device=disk,bus=virtio,cache=writeback" \
  --disk "$PWD/rancheros.iso,device=cdrom" \
  --disk "$PWD/configdrive.iso,device=cdrom" \
  --network network=front,model=virtio \
  --graphics none \
  --serial pty \
  --console pty

動作確認します。

ssh docker@192.168.0.100 docker run --rm hello-world
ssh docker@192.168.0.100 docker run -d -p 80:80 nginx
curl http://192.168.0.100/

補足とか

cloud-init

RancherOS は cloud-init で初期設定が可能なのですが、cloud-init がそのまま使用されているわけではなく、独自のこれ https://github.com/rancher/os/tree/master/config/cloudinit が使用されているようです(CoreOS からのフォーク?)。

なので DataSources も一部しかサポートしていません。NoCloud がダメっぽかったので ConfigDrive で初期設定しています。

autoformat

user_data で下記の通りにしておくと /dev/vda が永続データ用の領域として自動でフォーマットされるのですが、そのディスクの先頭に boot2docker, please format-me が記述されている必要があります。

rancher:
  state:
    formatzero: true
    autoformat:
      - /dev/vda

なお、この方法でフォーマットすると /dev/vda にはパーティションテーブル無しで直接ファイルシステムが作成されます。

パーティションが切られてたほうが良いなら、次のようにあらかじめディスクイメージにパーティションを作成しておけば OK です。

truncate -s 1G data.img
virt-format --format=raw --partition=gpt --filesystem=ext4 --label=B2D_STATE -a data.img