Podman 4.3 on Artix Linux: インストール
Tags: podman, docker, kubernetes, virtualization
Published: 2023-01-27 09:34:12

## はじめに

[Podman](https://podman.io/) は仮想化環境を構築するためのコンテナ管理ツールです。[Red Hat 社](https://www.redhat.com/ja) によって開発され、[Apache ライセンス v2.0](https://www.apache.org/licenses/LICENSE-2.0.html) の下、オープンソースソフトウェア (OSS) として [公開](https://github.com/containers/podman) されています。[Go 言語](https://go.dev/) で実装されています。

[以前に書いた通り](https://scqr.net/ja/blog/2023/01/20/podman-43-on-windows-10-install/index.html)、クロスプラットフォームに対応しており、[Docker](https://www.docker.com/) と高い互換性を持つように意識して開発されています。

この記事では Podman を [Artix Linux](https://artixlinux.org/) にインストールする流れを示します。[Arch Linux](https://archlinux.org/) をベースにしていて、[systemd](https://www.freedesktop.org/wiki/Software/systemd/) を使っていない OS です。

### 環境

- OS: Artix Linux (Arch Linux ベース) - [init システム](https://ja.wikipedia.org/wiki/Init) は [OpenRC](https://wiki.gentoo.org/wiki/OpenRC) を選択
- 仮想化: Podman [4.3.1](https://github.com/containers/podman/releases/tag/v4.3.1)

## チュートリアル

\* `doas` ([OpenDoas](https://wiki.archlinux.org/title/Doas)) のところは代わりに `sudo` も使えます。

### Pacman でインストール

Arch Linux のパッケージ・マネジメント・システムのおかげで、[pacman](https://archlinux.org/pacman/) を使えばシンプルなコマンドで Podman を手に入れられます。

```console
$ doas pacman -Sy podman
```

以下のように出力されて、たずねられるでしょう。私はデフォルトを選びました:

```console
:: Synchronizing package databases...
 (...)
resolving dependencies...
:: There are 3 providers available for container-network-stack:
:: Repository galaxy
   1) cni-plugins
:: Repository community
   2) cni-plugins  3) netavark

Enter a number (default=1): 
```

この後は以下のように出力されました:

```console
looking for conflicting packages...

Packages (14) catatonit-0.1.7-2  cni-plugins-1.2.0-2  conmon-1:2.1.5-1  containers-common-1:0.50.1-2
              criu-3.17.1-1  crun-1.7.2-1  libslirp-4.7.0-1  nftables-1:1.0.6-1  protobuf-c-1.4.1-1
              python-protobuf-21.12-1  python-six-1.16.0-6  slirp4netns-1.2.0-1  yajl-2.1.0-5
              podman-4.3.1-2

Total Download Size:    30.62 MiB
Total Installed Size:  177.23 MiB

:: Proceed with installation? [Y/n] y
```

インストールが始まります。出力は以下の通りでした:

```console
:: Retrieving packages...
 podman-4.3.1-2-x86_64             16.2 MiB  2.51 MiB/s 00:06 [#################################] 100%
 (...)
 Total (14/14)                     30.6 MiB  1457 KiB/s 00:22 [#################################] 100%
(14/14) checking keys in keyring                              [#################################] 100%
(...)
(14/14) checking available disk space                         [#################################] 100%
:: Processing package changes...
( 1/14) installing catatonit                                  [#################################] 100%
(...)
(14/14) installing podman                                     [#################################] 100%
Optional dependencies for podman
    apparmor: for AppArmor support
    btrfs-progs: support btrfs backend devices [installed]
    cni-plugins: for an alternative container-network-stack implementation [installed]
    podman-compose: for docker-compose compatibility
    podman-docker: for Docker-compatible CLI
:: Running post-transaction hooks...
(1/1) Creating temporary files...
```

### Kernel パラメーターを確認

`kernel.unprivileged_userns_clone` が有効化されている必要があります。

`unprivileged_userns_clone` に 1 がセットされていることを確認しましょう。0 ではいけません:

```console
sysctl kernel.unprivileged_userns_clone
```

出力は以下の通りでした:

```console
kernel.unprivileged_userns_clone = 1
```

OK ですね。

### QEMU をインストール

Podman 仮想マシンを操作するためには、[QEMU](https://www.qemu.org/) が必要です。これは "オープンソースの汎用 マシン Emulator (エミュレーター) ならびに Virtualizer (ヴァーチュアライザー)" です。

こちらも Pacman で入手できます。インストールしましょう:

```console
$ doas pacman -Sy qemu-base
```

以下のように出力され、たずねられます。デフォルトを選択すれば OK です:

```
:: Synchronizing package databases...
 (...)
:: There are 2 providers available for libwolfssl.so=35-64:
:: Repository world
   1) wolfssl
:: Repository extra
   2) wolfssl

Enter a number (default=1): 
```

出力は以下の通りでした:

```console
looking for conflicting packages...

Packages (44) capstone-4.0.2-6  dtc-1.6.1-4  edk2-ovmf-202211-3  libcacard-2.7.0-2.1  libnfs-5.0.2-1
              liburing-2.3-1  multipath-tools-0.9.4-1  numactl-2.0.16-1  qemu-audio-spice-7.2.0-3
              qemu-block-curl-7.2.0-3  qemu-block-dmg-7.2.0-3  qemu-block-nfs-7.2.0-3
              qemu-block-ssh-7.2.0-3  qemu-chardev-spice-7.2.0-3  qemu-common-7.2.0-3
              qemu-hw-display-qxl-7.2.0-3  qemu-hw-display-virtio-gpu-7.2.0-3
              qemu-hw-display-virtio-gpu-gl-7.2.0-3  qemu-hw-display-virtio-gpu-pci-7.2.0-3
              qemu-hw-display-virtio-gpu-pci-gl-7.2.0-3  qemu-hw-display-virtio-vga-7.2.0-3
              qemu-hw-display-virtio-vga-gl-7.2.0-3  qemu-hw-s390x-virtio-gpu-ccw-7.2.0-3
              qemu-hw-usb-host-7.2.0-3  qemu-hw-usb-redirect-7.2.0-3  qemu-hw-usb-smartcard-7.2.0-3
              qemu-img-7.2.0-3  qemu-pr-helper-7.2.0-3  qemu-system-x86-7.2.0-3
              qemu-system-x86-firmware-7.2.0-3  qemu-tools-7.2.0-3  qemu-ui-curses-7.2.0-3
              qemu-ui-opengl-7.2.0-3  qemu-ui-spice-app-7.2.0-3  qemu-ui-spice-core-7.2.0-3
              qemu-virtiofsd-7.2.0-3  seabios-1.16.1-1  snappy-1.1.9-2  spice-0.15.1-1
              usbredir-0.13.0-1  vde2-2.3.3-3  virglrenderer-0.10.4-1  wolfssl-5.5.4-1
              qemu-base-7.2.0-3

Total Download Size:    30.00 MiB
Total Installed Size:  138.25 MiB

:: Proceed with installation? [Y/n] y
:: Retrieving packages...
 edk2-ovmf-202211-3-any            15.2 MiB  2.11 MiB/s 00:07 [#################################] 100%
 (...)
 Total (44/44)                     30.0 MiB   528 KiB/s 00:58 [#################################] 100%
(44/44) checking keys in keyring                              [#################################] 100%
(...)
(44/44) checking available disk space                         [#################################] 100%
:: Processing package changes...
( 1/44) installing numactl                                    [#################################] 100%
(...)
(44/44) installing qemu-base                                  [#################################] 100%
Optional dependencies for qemu-base
    qemu-audio-alsa: for ALSA audio driver
    (...)
    qemu-virtiofsd: for virtio-fs shared filesystem daemon [installed]
    samba: for SMB/CIFS server support
:: Running post-transaction hooks...
(1/5) Creating system user accounts...
Creating group 'qemu' with GID 973.
Creating user 'qemu' (QEMU user) with UID 973 and GID 973.
(2/5) Creating temporary files...
(3/5) Reloading device manager configuration...
(4/5) Updating icon theme caches...
(5/5) Updating the desktop file MIME type cache...
```

#### トラブルシューティング

QEMU base を上のようにインストールすることで、以下のエラーを回避できるはずです:

```console
$ podman machine init
Error: exec: "qemu-system-x86_64": executable file not found in $PATH
```

### 他の依存パッケージのインストール

[Arch Linux の Podman wiki](https://wiki.archlinux.org/title/Podman#Additional_dependencies) によると、[`fuse-overlayfs`](https://archlinux.org/packages/community/x86_64/fuse-overlayfs/) すなわち "FUSE 向け overlayfs 実装" と、[`slirp4netns`](https://archlinux.org/packages/community/x86_64/slirp4netns/) すなわち "特権の無いネットワーク名前空間用のユーザーモード・ネットワーキング" のインストールが必要です。

後者は Podman インストール時に入ります。しかし前者は違います。そのためここで前者をインストールしましょう:

```console
$ doas pacman -Sy fuse-overlayfs
```

出力は以下の通りでした:

```console
:: Synchronizing package databases...
(...)
resolving dependencies...
looking for conflicting packages...

Packages (1) fuse-overlayfs-1.10-1

Total Installed Size:  0.11 MiB

:: Proceed with installation? [Y/n] y
(...)
(1/1) installing fuse-overlayfs                                    [#####################################] 100%
```

### Podman の設定

#### `containers.conf`

Artix は systemd を使いません。そこで Podman のコンテナにそのことを伝える必要があります。設定ファイルを編集しましょう:

```console
$ # バックアップの作成
$ doas cp -p /etc/containers/containers.conf /etc/containers/containers.conf.org

$ # 編集
$ doas nvim /etc/containers/containers.conf
```

`[engine]` セクションに以下のように記述します:

```diff
  #cgroup_manager = "systemd"
+ cgroup_manager = "cgroupfs"
```

#### uid / gid

Podman はデフォルトで rootless (ルートレス) モードで動きます。そのための ユーザー / グループ を用意しておきましょう。

`/etc/subuid` と `/etc/subgid` がそのための設定ファイルです。ログインユーザーの定義を以下のような感じで追加します:

```diff
+ {your-user}:100000:65536
```

### Podman システムのマイグレーション

以下を実行します:

```console
$ podman system migrate
```

出力は以下の通りでした:

```console
WARN[0000] "/" is not a shared mount, this could cause issues or missing mounts with rootless containers
```

ワーニングが出ています。これは [Containers](https://github.com/containers) の [`buildah`](https://buildah.io/) が無いためです。事前にインストールしておくことで回避できます。

### 仮想マシンの初期設定

さあ、podman で最初の仮想マシンを作成できるようになりました !! 以下を実行しましょう:

```console
$ podman machine init
```

出力は以下の通りでした:

```console
Downloading VM image: fedora-coreos-37.20230110.2.0-qemu.x86_64.qcow2.xz: done  
Extracting compressed file
Image resized.
Error: exec: "timedatectl": executable file not found in $PATH
```

上のエラーは、OpenRC には systemd の `timedatectl` という [Timezone をカスタマイズする (英語)](https://wiki.gentoo.org/wiki/Handbook:AMD64/Installation/Base#Timezone) ためのものが無いためです。 😅

現状はどんな感じなのでしょうか ?
仮想マシンはつくられましたが、仮想マシンが使うイグニッション・ファイルは上で出たエラーのためにつくられていません。
常にというではありませんが、致命的なものになることもあります。修正した方が良いです。別の記事でその方法を書く予定です。

### コンテナ・イメージの操作

さてここまでで、コンテナ・イメージをホスティング・サービスから pull できるようになっています。例として [Alpine Linux](https://www.alpinelinux.org/) を Docker Hub から pull してみましょう。最も人気のあるイメージの一つですね:

```console
$ podman pull docker.io/alpine
```

得られましたか 😉 ? 私が実行した時の出力は以下の通りでした:

```console
Trying to pull docker.io/library/alpine:latest...
Getting image source signatures
Copying blob (...)
Copying config (...)
Writing manifest to image destination
Storing signatures
(...)
```

#### もう少し便利にすることも

余談ですが `docker.io/` 部分を省きたければ、`registries.conf` を編集すれば良いです:

```console
$ # バックアップの作成
$ doas cp -p /etc/containers/registries.conf /etc/containers/registries.conf.org

$ # 編集
$ doas nvim /etc/containers/registries.conf
```

末尾に以下の行を追加します:

```diff
+ [registries.search]
+ registries = ['docker.io']
```

### テスト用の Web サーバーを実行

修正した方が良い問題をいくつか残しつつも、Podman を使う準備が完了しました。コンテナを実行して遊んでみましょう。

Alpine で動く [Apache httpd](https://httpd.apache.org/) サーバーを pull しましょう:

```console
$ podman pull docker.io/httpd:alpine
```

取得できたら以下を実行します:

```console
$ podman run -p 8080:80 httpd:alpine
```

ブラウザで `http://127.0.0.1:8080` にアクセスしてみましょう。
こんなふうに表示されるのでは無いでしょうか... 😄

![podman コンテナ: httpd が動作しています](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jhgj0y7ok039yt2goltq.png)

## おわりに

Podman にはセキュリティや安定性の観点からの配慮が施されています。まず Podman はデーモンを使用しません。そのため仮想マシン上のあるコンテナが他のコンテナに悪影響を及ぼすことが、起こりにくくなっています。またルート権限を必要としないコンテナがデフォルトになっています。そのためコンテナの実行がより安全に行えるようになっています。

Podman で再利用性と独立性の高い環境を築いて、開発生産性の向上や運用環境の改善につなげられると良いですね。