😽

WSL2にDocker代替のPodmanを入れてみる: ポッドマンが倒せない(1)

2021/12/27に公開

ルートレスの御利用は計画的に

ご承知のようにDocker Desktopのライセンス体形が変わり、
令和4年1月末にて一部有償となる。
Personalライセンス利用の条件は

Docker Desktop remains free for small businesses (fewer than 250 employees AND less than $10 million in annual revenue), personal use, education, and non-commercial open source projects.

スモールビジネス、個人利用、教育機関または非商用のオープンソースプロジェクトなので、
スモールじゃないビジネスでは有償ライセンスとなる。
個人のぶんはまぁいいとしても、
社用PCはそうはいかない。

ということで代替手段を模索することになるわけだが、
先駆者の方々がいろいろやられたようで大体構成はできあがっている。
なのでスムーズに終わる

・・・はずだった (-_-;)

ヾ(・ω<)ノ" 三三三● ⅱⅲ コロコロ♪

------------------- ↓ 本題はここから ↓-------------------

事前準備

何はなくともWSLを用意。
今回はUbuntuを使用。
他のOSでもやることは一緒だが、
別途インストールが必要なものがある(後述)

wsl --install ubuntu

ユーザー作成しaptの最新化を済ませておく

sudo apt update && sudo apt upgrade -y

自身の環境をチェックしておく

id
 uid=1000(dozo) gid=1000(dozo) ・・・
grep $(whoami): /etc/subuid
 dozo:100000:65536
grep $(whoami): /etc/subgid
 dozo:100000:65536 

podmanのインストール

podmanとはDockerだ。(雑)
コンテナランタイムでDockerの次ぐらいに有名なんだとか。

インストール手順はこちらに書いてあるが、
パッケージの状態が変わったのか全部はやらなくていいっぽい。

source /etc/os-release
echo deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/x${NAME}_${VERSION_ID}/ / | sudo tee -a /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
wget -nv https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable/x${NAME}_${VERSION_ID}/Release.key -O Release.key
sudo apt-key add - < Release.key
sudo apt update && sudo apt -y install podman

dockerイメージを触ってみる

podmanコマンドはdockerと互換性があるらしい。
適当にコマンド打ってみよう

podman pull busybox
 Resolved "busybox" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf)
 Trying to pull docker.io/library/busybox:latest...
 ・・・
podman images
 REPOSITORY                 TAG         IMAGE ID      CREATED      SIZE
 docker.io/library/busybox  latest      ffe9d497c324  2 weeks ago  1.46 MB 
podman run -it --rm alpine sh
/ #

(^_-)-☆ やったぜ

特に違和感ないな。
さて、あとはWSLをまたいだ時にどうするかだが・・・
nerdctlってのがあるのか、
それもちょっとやってみよう。

------------------- ↓ 後書きはここから ↓-------------------

他のOSの場合

Ubuntuだとスムーズにいくのだが、
他のOSだとちょっと躓く。

register.confを調整

pullしたときに以下のエラーが発生

podman pull alpine
 Error: short-name "alpine" did not resolve to an alias and no unqualified-search registries are defined in "/etc/containers/registries.conf"

イメージのpull元が登録されていないこともあるようだ。

/etc/containers/register.conf
- # unqualified-search-registries = ["example.com"]
+ unqualified-search-registries = ['docker.io', 'quay.io']

container.confを調整

ログの書き込みとかLinuxで使う前提になっているので、
WSL用に調整する。

/etc/containers/container.conf
- #cgroup_manager = "systemd"
+ cgroup_manager = "cgroupfs"
- #events_logger = "journald"
+ events_logger = "file"

shadowのインストール

newuidmapというコマンドがない場合はこれを入れる必要がある。
パッケージ名はuidmapとかshadow-xxxとかそんな感じ。
パッケージ名はこちらを参照
あと実行権限も調整が必要らしい(理由は知らん)

sudo apt install uidmap
sudo chmod u+s $(which newuidmap)
sudo chmod u+s $(which newgidmap)

/etc/subuid, /etc/subgidの設置

自身のLinux IDとは別にサブIDを作成し、
これをpodmanコンテナの実行ユーザーにする・・・ってことかな?

sudo touch /etc/subuid /etc/subgid
sudo usermod --add-subuids 100000-165535 --add-subgids 100000-165535 $(whoami)

podmanに反映

podman system migrateにて
上記権限設定をpodmanに反映させる。

未反映
podman unshare cat /proc/self/uid_map
         0       1000          1
podman info
 ・・・
  idMappings:
    gidmap:
    - container_id: 0
      host_id: 1000
      size: 1
    uidmap:
    - container_id: 0
      host_id: 1000
      size: 1

podman system migrateを実行すると

反映済み
podman system migrate
podman unshare cat /proc/self/uid_map
         0       1000          1
         1     100000      65536
podman info
 ・・・
  idMappings:
    gidmap:
    - container_id: 0
      host_id: 1000
      size: 1
    - container_id: 1
      host_id: 100000
      size: 65536
    uidmap:
    - container_id: 0
      host_id: 1000
      size: 1
    - container_id: 1
      host_id: 100000
      size: 65536

トラブルシューティング

newuidmap問題
podman info
 WARN[0000] "/" is not a shared mount, this could cause issues or missing mounts with rootless containers
 Error: cannot setup namespace using newuidmap: exit status 1

よくわからんが、
newuidmapのパーミッションの問題らしい
newuidmapとnewgidmapに+sを加える

sudo apt install uidmap
sudo chmod u+s $(which newuidmap)
sudo chmod u+s $(which newgidmap)
subuid問題
podman run -it busybox
✔ docker.io/library/busybox:latest
Trying to pull docker.io/library/busybox:latest...
Getting image source signatures
Copying blob 3cb635b06aa2 done
Error: writing blob: adding layer with blob "sha256:3cb635b06aa273034d7080e0242e4b6628c59347d6ddefff019bfd82f45aa7d5": Error processing tar file(exit status 1): potentially insufficient UIDs or GIDs available in user namespace (requested 65534:65534 for /home): Check /etc/subuid and /etc/subgid: lchown /home: invalid argument

何が何だかわからんが、
/etc/subuidと/etc/subgidを設定しろという感じらしい。

とにかく以下を実行

sudo touch /etc/subuid /etc/subgid
sudo usermod --add-subuids 100000-165535 --add-subgids 100000-165535 $(whoami)
sudo chmod u+s $(which newuidmap)
sudo chmod u+s $(which newgidmap)
podman system migrate
podman info
 ・・・

その他

podman info
WARN[0000] "/" is not a shared mount, this could cause issues or missing mounts with rootless containers
cannot clone: Operation not permitted
Error: cannot re-exec process

権限周りなのは想像できるが、
どこがどう詰まってるのかはさっぱりわからん。

Discussion