Podmanでコンテナを動かす

しばらく前にアップグレードした Fedora 31 で Docker を動かそうとしたところ、エラーでコンテナを起動できない...

```sh
$ docker run node/test
docker: Error response from daemon: cgroups: cgroup mountpoint does not exist: unknown.
ERRO[0000] error waiting for container: context canceled 
```

Fedoraの最新版では Cgroup V1 から Cgroup V2 への移行が行われたが、Docker ではまだ Cgroup V2 をサポートしていないことが原因らしい。

https://fedoraproject.org/wiki/Changes/CGroupsV2

そもそもFedoraではDockerパッケージは提供されていない。Cgroup V1に戻すことで使うこともできるが、おすすめは `podman` らしい。

https://fedoraproject.org/wiki/Common_F31_bugs#Other_software_issues

> The Docker package has been removed from Fedora 31. It has been replaced by the upstream package moby-engine, which includes the Docker CLI as well as the Docker Engine.
> However, we recommend instead that you use Package-x-generic-16.pngpodman, which is a Cgroups v2-compatible container engine whose CLI is compatible with Docker's.

# Podman

Redhatが開発したコンテナ管理パッケージ。
オープンソースで、コンテナとイメージは[OCI](https://www.opencontainers.org/)互換、CLIはDockerと互換性がある。
コンテナの管理はsystemdに統合されているらしい。(デーモンレス）

https://podman.io/getting-started/
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html/building_running_and_managing_containers/using-systemd-with-containers_building-running-and-managing-containers

# インストール

docker-ceは削除

```sh
$ sudo dnf remove -y docker-ce*
```

podmanをインストール

```sh
$ sudo dnf install -y podman podman-compose podman-docker
```

* `podman` コンテナの管理ツール。Docker互換のCLIを含む。
* `podman-compose` docker-compose.ymlをpodmanをバックエンドにして動かすためのツール。
* `podman-docker` dockerコマンドでpodmanを呼ぶシェルスクリプトを提供する。いらないけど一応入れてみた。

インストールを確認

```sh
$ podman -v
podman version 1.9.2
```

# Podmanでコンテナイメージを起動する

Podman でも docker.io で配布されているイメージを利用することが出来る。
リポジトリの設定は `/etc/containers/registries.conf` にある。

```ini:registries.conf
[registries.search]
registries = ['registry.fedoraproject.org', 'registry.access.redhat.com', 'registry.centos.org', 'docker.io']
```

左から定義されている順にイメージの検索が行われる。既定で `docker.io` も利用できるようになっている。

動作確認に簡単な Dockerfile を用意した。nodeのイメージをベースにしてシェルを起動するだけのイメージ。

```Dockerfile
FROM node:lts-alpine
ENTRYPOINT /bin/sh
```

ビルドする。

```sh
$ podman build ./ -t node/test
STEP 1: FROM node:lts-alpine
STEP 2: ENTRYPOINT /bin/sh
STEP 3: COMMIT node/test
--> 3d522a27844
3d522a278442b3e028c8fdc3d0634d4e348ea54a403875d03734450c5f99b178
```

イメージの確認

```sh
$ podman image ls
REPOSITORY               TAG          IMAGE ID       CREATED          SIZE
localhost/node/test      latest       3d522a278442   13 minutes ago   93.1 MB
<none>                   <none>       7bf7394c1846   14 minutes ago   93.1 MB
docker.io/library/node   lts-alpine   7a48db49edbf   3 weeks ago      93.1 MB
```

コンテナの起動

```sh
$ podman run -it --rm node/test
/ # npm -v
6.14.4
```

# podman-compose でイメージを起動する

簡単な docker-compose.yml ファイルを作成。

```docker-compose.yml 
version: '2'
services:
  node:
    build: .
```

イメージを実行する

```sh
$ podman-compose run --rm node
podman pod create --name=environment --share net
b740e843a42a7c85fe68dc1d72b27ee78e3b79c5806dfdcc0b45caea31501eeb
0
Namespace(T=False, cnt_command=[], command='run', detach=False, dry_run=False, e=None, entrypoint=None, file=['docker-compose.yml'], label=None, name=None, no_ansi=False, no_cleanup=False, no_deps=False, podman_path='podman', project_name=None, publish=None, rm=True, service='node', service_ports=False, transform_policy='1podfw', user=None, volume=None, workdir=None)
podman run --rm -i --name=environment_node_tmp1612 --pod=environment --label io.podman.compose.config-hash=123 --label io.podman.compose.project=environment --label io.podman.compose.version=0.0.1 --label com.docker.compose.container-number=1 --label com.docker.compose.service=node --add-host node:127.0.0.1 --add-host environment_node_1:127.0.0.1 --tty environment_node
/ # node -v
v12.16.3
```

# 気になったところあれこれ

* `podman-compose up`でサービス毎に起動出来ない。（最新版とかではひょっとすると実装されているかも）

```sh
$ podman-compose up -d node
services ['node']
Traceback (most recent call last):
  File "/usr/bin/podman-compose", line 11, in <module>
    load_entry_point('podman-compose==0.1.6.dev0', 'console_scripts', 'podman-compose')()
  File "/usr/lib/python3.7/site-packages/podman_compose.py", line 1267, in main
    podman_compose.run()
  File "/usr/lib/python3.7/site-packages/podman_compose.py", line 755, in run
    cmd(self, args)
  File "/usr/lib/python3.7/site-packages/podman_compose.py", line 939, in wrapped
    return func(*args, **kw)
  File "/usr/lib/python3.7/site-packages/podman_compose.py", line 1038, in compose_up
    return up_specific(compose, args)
  File "/usr/lib/python3.7/site-packages/podman_compose.py", line 1033, in up_specific
    raise NotImplementedError("starting specific services is not yet implemented")
NotImplementedError: starting specific services is not yet implemented
```

* `podman-compose` に `exec` コマンドがない。

```
$ podman-compose exec node /bin/sh
usage: podman-compose [-h] [-f file] [-p PROJECT_NAME]
                      [--podman-path PODMAN_PATH] [--no-ansi] [--no-cleanup]
                      [--dry-run]
                      [-t {1pod,1podfw,hostnet,cntnet,publishall,identity}]
                      {help,version,pull,push,build,up,down,ps,run,start,stop,restart}
                      ...
podman-compose: error: argument command: invalid choice: 'exec' (choose from 'help', 'version', 'pull', 'push', 'build', 'up', 'down', 'ps', 'run', 'start', 'stop', 'restart')
```

他にもいろいろありそうなので、お仕事に使うにはまだ早そう。
個人で使う分には何とか出来そうなので、使ってみることにします。