Ubuntu Weekly Recipe

第491回 いまから「あえて」systemdのコンテナ機能を使ってみる

この記事を読むのに必要な時間:およそ 4 分

DNSサーバーの設定

ここで,ネットワーク情報を確認します。

artful$ ip addr show

ホストで利用できるすべてのIPアドレスがコンテナでも利用できることを確認できるはずです。systemd-nspawnはオプションを指定しない場合,NICとIPアドレスをホストと共有します。

ただし,このままでは満足にインターネットを利用できません。というのも,ホスト側で利用しているDNSサーバーの情報はコンテナ側には伝わらず,名前解決ができないからです。

17.04以降のUbuntuではsystemd-resolvedがDNSリゾルバーに採用されており,名前解決の設定ファイル/etc/resolv.confは自動で管理されています。今回,コンテナで動かしている17.10も同様です。

そのため,/etc/systemd/resolved.confにDNSサーバーの情報を記入します。

まずはホスト側で利用しているDNSサーバーの情報を確認します。GUIの接続情報画面を開いて確認もできますが,次のコマンドでも表示できます。

host$ systemd-resolve --status|grep "DNS Servers: " # Ubuntu 17.04以降
host$ nmcli con show (接続名) |grep "IP4.DNS"        # Ubuntu 16.04 LTS Desktop版の場合
host$ grep nameserver /etc/resolv.conf              # Ubuntu 16.04 LTS Server版のように,/etc/resolv.confでDNSサーバーを指定している場合

そして,取得した情報をもとに/etc/systemd/resolved.confの一部をコメントアウトを外し,以下のように編集します。

[Resolve]
DNS=(ホストで利用しているDNSサーバーのIPアドレス)

その後,systemd-resolvedを再起動します。

artful$ sudo systemctl restart systemd-resolved

これで,名前解決が利用できるようになったので,パッケージをインストールしてみます。

artful$ sudo apt install -y vim bash-completion

ブートありの場合のコンテナを終了・再起動は,通常のOSのシャットダウンと同じです。しかし,Ubuntuのコンテナはあとで使いますので,起動したままにしておきます。

artful$ sudo poweroff # 終了
artful$ sudo reboot   # 再起動

Fedoraのコンテナを立ち上げる

Fedoraのコンテナも作ってみましょう。

別の端末を起動します。 Fedoraのルートファイルシステムを作るのに必要なyumをインストールします※5)⁠

※5
時代はDNFなのですが,Ubuntuのレポジトリにはyumしか入ってないので,しかたないです。
host$ sudo apt install yum

Fedora 26のレポジトリのパッケージをダウンロードして展開し,レポジトリ情報とGPG鍵を配置します。

host$ wget http://ftp.riken.jp/Linux/fedora/releases/26/Everything/x86_64/os/Packages/f/fedora-repos-26-1.noarch.rpm
host$ rpm2cpio fedora-repos-26-1.noarch.rpm | cpio -id
host$ sudo cp etc/yum.repos.d/* /etc/yum/repos.d/
host$ sudo cp -R etc/pki/ /etc/

Fedoraのルートファイルシステムを,ホームディレクトリにfedora-26というディレクトリに作成します。

host$ sudo yum -y --releasever=26 --installroot=$HOME/fedora-26 install systemd passwd dnf vim iproute sudo

あとのユーザー作成とDNS設定の手順はほぼ同じですが,管理者権限を持つユーザーを作成する部分は次のようにしてください。

fedora-26# useradd admin -G wheel -m         # sudoグループではなくwheelグループを指定する
fedora-26# passwd admin

気をつけなければならない点としては,UbuntuでFedoraのルートファイルシステムを作成する場合,インストールしたパッケージ情報がrpmdbに書き込まれない点です。 ルートファイルシステムを作った時に入れたはずのパッケージも入ってないことになっています。 これでは不便なので,あまりスマートではありませんが,コンテナをブートさせたあとにインストールし直すのが良いでしょう。

fedora-26$ sudo dnf -y --releasever=26 install systemd passwd dnf vim iproute sudo fedora-release

fedora-releaseもインストールしているので,以後,--releaseverオプションなしでもdnfが使えます※6)⁠

※6
dnfはfedora_releaseのパッケージ情報からインストールされているFedoraのリリースバージョンを取得しています。そのため,このパッケージがインストールされて(いると認識されて)いないと毎回,リリースバージョンの指定が必要となってしまいます。

コンテナの中のsystemdを操作する

ここまでで,UbuntuとFedoraと2つのディストリビューションのコンテナが起動している状態になりました。 最後に,ホスト側からsystemd関連のコマンドを利用して,これらのコンテナを簡単に操作してみます。

さらに別の端末を立ち上げます。 machinectlコマンドを利用すると,起動しているコンテナの情報を確認できます。

host$ machinectl
MACHINE   CLASS     SERVICE        OS     VERSION ADDRESSES
artful    container systemd-nspawn ubuntu 17.10   -
fedora-26 container systemd-nspawn fedora 26      -

2 machines listed.

systemd関連コマンドで末尾がctlで終わるコマンドの中には-Mオプションを利用できるものがあります。-Mオプションを使うと,systemd-nspawnで起動したコンテナを操作対象にできます。

次の例では,コンテナのsystemdのジャーナル,システム・サービスの状態表示させています※7)⁠

※7
systemctlはパッケージが足りないのか,設定が不十分なのか,Fedoraのコンテナではうまく機能しませんでした。
host$ sudo journalctl -M artful
host$ sudo systemctl status -M artful

-Mで指定しているコンテナの名前は,今回の場合,ルートファイルシステムを入れたディレクトリ名となっています。systemd-nspawnコマンドも-Mオプションを取ることができ,ここでコンテナの名前を指定できます。

このあたりがsystemd-nspawnあえてコンテナを動かしていておもしろい部分です※8)⁠

※8
使用感には個人差があります。

systemd採用のディストリビューションなら(たぶん)何でも動かせる

今回はUbuntuとFedoraのコンテナ動かす例を取り上げましたが,systemd-nspawnではルートファイルシステムが用意できれば,systemdを採用のどのディストリビューションでも(たぶん)動かすことができます。

Ubuntuと同じやり方でDebianを動かしてみたり,Fedoraと同じやり方でCentOSを動かしてみたり,zypper※9を使ってopenSUSEを動かしてみたり,いろいろ試してみると面白いのではないでしょうか。

※9
yumと同じくaptでインストールできます。

著者プロフィール

たなかあきら

Ubuntu Japanese Team Member。ちょっとお高い電子辞書を買ったので,楽しく翻訳をしていたところ,気づいたらメンバーになっていました。

コメント

コメントの記入