Help us understand the problem. What is going on with this article?

Debian Stretch + systemd-nspawn でコンテナ環境を立ち上げる

More than 1 year has passed since last update.

systemdのバージョンを確認する

$ systemd --version
systemd 232
+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN

セットアップ

  • ホストは Debian 9.5 (stretch) on SakuraVPS
  • ゲストも Debian 9.5 (stretch)
  • コンテナ名としてstretchを用いる
sudo apt-get update

# systemd-nspawnとdebootstrapをインストールする
sudo apt-get install systemd-container debootstrap

# ホストのsystemd-networkdを有効化して起動する
sudo systemctl enable systemd-networkd
sudo systemctl start systemd-networkd

# コンテナのrootfsをつくる
# コンテナにdbusがはいってないとmachinectlコマンドが使えないので、同時にいれる
sudo debootstrap --include=dbus stretch /var/lib/machines/stretch

# コンテナを起動する
sudo systemctl start systemd-nspawn@stretch.service

# ホスト起動時にコンテナを自動起動する設定
sudo systemctl enable systemd-nspawn@stretch.service

# コンテナのネットワークの初期設定を行う
sudo machinectl shell stretch /bin/systemctl enable systemd-networkd
sudo machinectl shell stretch /bin/systemctl start systemd-networkd

# コンテナのrootシェルを開く
sudo machinectl shell stretch /bin/bash

NAT(インターネット -> コンテナ)の設定

コンテナの中で動かしているサービスを外部に公開するには、ポートのマッピングが必要。
宛先NAT(DNAT, Destination NAT)というらしい。
systemd-nspawnコマンドでコンテナを起動する場合は--portオプションでできるが、systemd-nspawn@.serviceでコンテナを自動起動する場合は、systemd.nspawnで設定するのがよい模様。

例: ゲストのTCP:80をホストのTCP:8080で公開する

/run/systemd/nspawn/stretch.nspawn
[Network]
Port=8080:80

ハマったポイントとか

  • 最初Ubuntuでやろとしていたが、パケットフィルタリングの初期設定(FORWARDチェインがデフォルトでDROP)のせいでハマった
  • ネットワークが疎通しない場合は sudo iptables -F; sudo iptables -F -t nat でいちどルールを初期化してみるとよいかも
  • systemd-nspawn自体は、IPMasqueradeを自動的に設定するような設定ファイルがデフォルトではいっているので、ホストとコンテナでsystemd-networkdが起動していて、かつ余計なフィルタさえなければ、ネットワーク周りは特になにも設定しなくても外部と通信できるようになっている

既知の問題

  • /var/lib/machinesからシンボリックリンクを張ったらデプロイ時のダウンタイム短くしたりフォールバックが簡単にできるんじゃね?と思ってやってみたらコンテナの起動に失敗した。チケットによると、v233で修正されているようだが、Stretchのsystemdはv232だった、おしい
realglobe
「世界のすべてをWebAPI化する」ことを目指す技術ベンチャーです。
https://realglobe.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away