ArchLinuxのpodmanで非特権コンテナを使ってみる


注意

  • 調べながら書いた記録なので間違った内容があるかもしれません。間違いを指摘してもらえると嬉しいです…
  • ネットワークに関しては調べられていません

podman


https://github.com/containers/libpod

podmanはRedHatが開発しているコンテナランタイムで、2019/1/17に1.0がリリースされ話題になりましたね。RHELやFedoraには既に搭載されているようですが、今回はArchLinuxで試してみます。
podmanはDockerと異なりデーモンを常駐させる必要がなく、またDocker相当の機能が3つのプロジェクトに分かれているようです

  • Buildah(コンテナの構築)
  • Podman(コンテナの実行)
  • Skopeo(コンテナの共有/発見)

podmanの目標として掲げられているのは以下の機能です

  • 既存のDocker/OCIのイメージに対応
  • 認証や検証を含む様々なダウンロード方法への対応
  • コンテナイメージの管理(ファイルシステムのoverlayやイメージの階層の管理)
  • コンテナライフサイクルの完全なサポート
  • Pod(コンテナのグループ)のサポート
  • コンテナ、Pod間のリソースの分離
  • CRI-Oインターフェースの提供

コンテナ実行環境はrunC等のOCI互換なランタイムに、イメージの構築はBulidahに、コンテナの配布はSkopeoにそれぞれ任せているようです。

参考リンク

Install

ArchLinuxではAURに以前からパッケージが存在していましたが、2019/1/26にcommunityリポジトリに追加されました。同時にDocker互換CLI(podman-docker)も提供されています。

pacman -Sy podman podman-docker

非特権コンテナ

Dockerの問題点として権限の問題があります。Dockerの動作にはRoot権限のデーモンを必要とし、またコンテナ内のRootプロセスはホスト側でもRootプロセスとして振る舞ってしまいます。
実際に複数人数で共有するサーバーでDockerを使おうと思うと、ユーザーをdockerグループに追加する必要があり、これはほとんど無制限のsudo権限をあげるようなものです。

そこで必要になるのがコンテナ内でのユーザーIDをホスト側のユーザーIDと別のIDに割り当てる方法です。コンテナ内のRootがホスト側の起動したユーザーのUIDになればホスト側でユーザーが可能な動作しか出来なくなりますね。
この機能はユーザーが別のUIDでプロセスを起動出きることを意味するのでArchLinuxではデフォルトで無効になっています。有効化するには

sysctl -w kernel.unprivileged_userns_clone=1

を実行します。これで現在のセッションに対して有効になるので、必用に応じてsysctl.dで永続化します。

sub{uid,gid}

さてこれでUIDがマップ出きるようになりましたが、このままだと自分のUIDにしかマップできません。このままだとコンテナ内で新しくユーザーを作ることが出来なくて不便ですね。それを解決するためにLinuxでは自分が使うことが出来るサブのUID/GIDをそれぞれ/etc/subuid/etc/subgidで設定する事が出来ます。というかこれを設定しないとpodmanが動いてくれません。

/etc/subuid
root:100000:65536
/etc/subgid
root:100000:65536

これでそれぞれrootユーザーに100000番から65536個のUID/GIDをサブIDとして使えるようにします。自分のユーザーでpodmanを起動するには自分のユーザー名で登録する必要があります。良く分かりませんが一つも自分のユーザーのエントリが無いとpodmanを起動できません。

これでpodmanが起動出来るはずです。

podman ps

podmanのコマンドはalias docker=podmanとして動くようになっているので後は使い慣れたdockerと同じように使えます。

参考リンク