🐙

Podman4でDocker Composeを使う方法: ポッドマンが倒せない(8)

2023/05/08に公開

Docker Desktop 重くね?

関連記事:
Podman Desktopを試す: ポッドマンが倒せない(4)
Distrodを使ってWSLでsystemdを動かす

ポッドマンが倒せないシリーズ過去記事

Podmanについてまぁまぁ記事化しているが、
個人的にはもうDockerを使っていない。
マイクらですらPodmanで動作させているぐらい。

とはいえ、仕事ではまだまだDockerが主流なので、
仕方がなく使ってはいるのだが。。。

( ゚Д゚) Docker Desktop 重くね?

Docker Desktopの有償化について語ることが多いが、
そもそも重すぎないかと。
起動してからコンテナを起動するわけで、
できるだけ軽いほうがいい。

じゃあバックエンドをPodmanにすればその分軽くなるのではなかろうかと。
Docker DesktopではなくWSL上にDockerを載せる方法もあるけど、
Docker自体が重いのでそこも変えたい。

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

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

準備

今回はUbuntu22.04(jammy)を使用。
Systemdを使うのが前提なのでWindows11で説明しているが、
Windows10でもできるらしい。

https://r-o-head.tk/post/wsl2-systemd-on-windows10-with-kb5020030/#kb5020030-693mb

クライアント側を用意

以下を参照のこと

https://zenn.dev/dozo/articles/a633794f6d7575

Podmanを設置

Ubuntu側にPodmanをインストール。
Podman4を使うためにリポジトリの登録から。

bash
curl -fsSL https://download.opensuse.org/repositories/devel:kubic:libcontainers:unstable/xUbuntu_$(lsb_release -rs)/Release.key | gpg --dearmor | sudo tee /etc/apt/keyrings/devel_kubic_libcontainers_unstable.gpg > /dev/null

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/devel_kubic_libcontainers_unstable.gpg] https://download.opensuse.org/repositories/devel:kubic:libcontainers:unstable/xUbuntu_$(lsb_release -rs)/ /" | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:unstable.list > /dev/null

続いてPodmanのインストール

bash
sudo apt update
sudo apt install -y podman
podman --version
 podman version 4.5.0
sudo chmod u+s $(which newuidmap)
sudo chmod u+s $(which newgidmap) 

Docker Composeをインストールする

Docker Composeをインストールする。
docker-composeはPythonスクリプトだと思うが、
パッケージとしてインストールするとdocker自体もインストールされてしまう。
なので、今回はバイナリファイルをそのまま利用する。
インストールパスを $HOME/.local/bin とすると

bash
mkdir -p ~/.local/bin
curl -SL https://github.com/docker/compose/releases/download/v2.17.3/docker-compose-linux-x86_64 -o ~/.local/bin/docker-compose
chmod +x ~/.local/bin/docker-compose
sudo cp ~/.local/bin/docker-compose /usr/local/bin/docker-compose
docker-compose --version
  Docker Compose version v2.17.3

SystemdにPodmanを登録する

bash
systemctl --user enable --now podman.socket
systemctl --user status podman.socket
  ● podman.socket - Podman API Socket
     Loaded: loaded (/usr/lib/systemd/user/podman.socket; enabled; vendor preset: enabled)
     Active: active (listening) since Thu 2023-05-04 15:34:28 JST; 45min ago
curl -s --unix-socket /run/user/1000/podman/podman.sock http://d/v4.0.0/libpod/info
   {"host":{"arch":"amd64","buildahVersion":"1.30.0","cgroupManager":"cgroupfs"・・・

DOCKER_HOSTを設定

docker-composeはDOCKER_HOST経由でアクセスするので、
DOCKER_HOSTにPodmanのパスを設定する
まずはパスを確認する

bash
podman info --format '{{.Host.RemoteSocket.Path}}'
  /run/user/1000/podman/podman.sock

上記値をDOCKER_HOST値を設定する。
いったんコマンドで設定するが、
.profileなどに登録しておく

bash
export DOCKER_HOST=unix:///run/user/1000/podman/podman.sock

https://podman-desktop.io/docs/migrating-from-docker/using-the-docker_host-environment-variable

docker-compose upしてみる

ではbitnamiのサンプルを使って実行してみる。
適当なディレクトリにdocker-compose.ymlを配置して実行する。

bash
mkdir ~/work
mkdir ~/work/bitnami
cd ~/work/bitnami
curl -LO https://github.com/bitnami/containers/raw/main/bitnami/wordpress/docker-compose.yml
docker-compose up

ttp://localhost へアクセス


WordPressの画面

(^_-)-☆ やったね

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

Docker ComposeをPod化するのが理想ではあるが、
ただ、仕事でdocker-compose.ymlを作成する機会はほぼないので、
郷に入っては郷に従えということで。

トラブルシューティング

rootlessport cannot expose privileged port 80

docker-compose up時にport権限のエラー

docker-compose up -d
Error response from daemon: rootlessport cannot expose privileged port 80, you can add 'net.ipv4.ip_unprivileged_port_start=80' to /etc/sysctl.conf (currently 1024), or choose a larger port number (>= 1024): listen tcp 0.0.0.0:80: bind: permission denied

1024以下のportをルートレスで使うことは許可が必要的な

直し方はよくわかってないが/etc/sysctl.confに書き込めばいいとのこと

/etc/sysctl.conf
+ net.ipv4.ip_unprivileged_port_start=80

sysctlを実行

bash
sudo sysctl -p

https://qiita.com/intrajp/items/3655eedb6cfc14e23fd6

cgroupディレクトリにファイルがないと言われる

Docker up中に以下のようなエラーが出る

bash
docker-compose up -d nginx
  Error response from daemon: crun: creating cgroup directory `/sys/fs/cgroup/systemd/docker/buildx/libpod-4cf0a633858b01798d639dd57dbadfadbe37a40824e4100eb330f06d916c3416`: No such file or directory: OCI runtime attempted to invoke a command that was not found

正直原因はわからないが、
rootlessモードからrootfulモードに変えたらすんなり通った。

bash
sudo systemctl enable --now podman.socket
export DOCKER_HOST=unix:///run/podman/podman.sock
sudo -E /path/to/docker-compose up -d nginx

dockerコマンドを一度実行すると二度とレスポンスがない

docker composeを一回実行(upなど)し、
次の実行(downなど)をしようとするとなんの動きもなくなる場合がある

いまだに原因不明なので対応のしようがない状態。
podman-composeならば発生しない模様。
また、rootfull運用であれば稼働するので、
どちらかを選ぶことになりそう。

リモートpodmanに接続する方法

ちょっと面白い方法を見つけたので追記。
別の記事にするかも。

bash
ssh -fnNT -L/tmp/podman.sock:/run/user/1000/podman/podman.sock ssh://user@172.21.
235.249:50503

https://zenn.dev/odan/scraps/aee91d5aa32c52#comment-63ef1b954928a1

Discussion