linux 開発インフラ

podmanをdockerとして使う

投稿日:2021年12月4日 更新日:

docker代替としてRHEL系OSにデフォルト搭載されたpodmanは当初、dockerを期待している他周辺ソフトウェア(docker-componseやgitlab-runnerなど)と素直に通信してくれませんでした。

しかしpodmanがバージョン3を超え、これら周辺ソフトウェアへの歩み寄りをしてくれたことで、現在では簡単な設定でほぼdockerとして動いてくれるようになりました。

前回Node.jsコンテナを動かしたpodman環境でこれらの設定を行なってみようと思います。

検証環境

  • AlmaLinux 8.5
  • podman 3.3.1

課題と対策

dockerコンテナを使って何かをするソフトウェアの多くはdockerのUNIXドメインソケット経由で通信します。

しかしRHEL8系OSでデフォルトインストールされたpodmanのイメージは以下のような感じなので、サードパーティソフトウェアはpodmanをコンテナとして使えません。

なので、以下のように追加設定することでpodmanをdockerとして使えるようにします。

インストール、設定

RedHat公式ドキュメントを見ながら、必要そうな部分をかいつまんで行なっていきます。

podman-dockerのインストール

このパッケージをインストールすることで/usr/bin/dockerコマンド、/var/run/docker.sockが入ります。

# dnf install podman-docker

  (中略)

インストール済み:
  podman-docker-3.3.1-9.module_el8.5.0+2586+018f24d7.noarch

完了しました!

インストールされた/usr/bin/docker。中身はシェルで、podmanコマンドを呼び出しているだけです。

#!/bin/sh
[ -f /etc/containers/nodocker ] || \
echo "Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg." >&2
exec /usr/bin/podman "$@"

execしているのでこのシェルの実行プロセスは呼び出したpodmanコマンドで置換されます。要するに、/usr/bin/docker == /usr/bin/podmanですね。

これからはdockerと打ってもpodmanが起動してくれます。

# docker version
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
Version:      3.3.1
API Version:  3.3.1
Go Version:   go1.16.7
Built:        Tue Nov  9 21:25:58 2021
OS/Arch:      linux/amd64

一方、肝心の/var/run/docker.sockファイルもできましたが、シンボリックリンク元のpodman側UNIXドメインソケットファイル(/run/podman/podman.sock)はまだ無い状態です。

# file /var/run/docker.sock
/var/run/docker.sock: broken symbolic link to /run/podman/podman.sock

# file /run/podman/podman.sock
/run/podman/podman.sock: cannot open `/run/podman/podman.sock' (No such file or directory)

podman-remoteのインストール

/run/podman/podman.sockを作る為にインストールします。

# dnf install podman-remote

  (中略)

インストール済み:
  podman-remote-3.3.1-9.module_el8.5.0+2586+018f24d7.x86_64

完了しました!

podman-socketをデーモン起動

systemdでUNIXドメインソケットを起動できるようにサービス定義ファイルが作られています。そのままでいいですが、変更する場合はsystemctl daemon-reloadで設定ファイルを読み直しておきます。

# cat /usr/lib/systemd/system/podman.socket
[Unit]
Description=Podman API Socket
Documentation=man:podman-system-service(1)

[Socket]
ListenStream=%t/podman/podman.sock
SocketMode=0660

[Install]
WantedBy=sockets.target

有効化と起動。

# systemctl enable --now podman.socket
Created symlink /etc/systemd/system/sockets.target.wants/podman.socket → /usr/lib/systemd/system/podman.socket.

確認。

# systemctl status podman.socket
● podman.socket - Podman API Socket
   Loaded: loaded (/usr/lib/systemd/system/podman.socket; enabled; vendor preset: disabled)
   Active: active (listening) since Sun 2021-11-28 00:35:36 JST; 44s ago
     Docs: man:podman-system-service(1)
   Listen: /run/podman/podman.sock (Stream)
    Tasks: 0 (limit: 48471)
   Memory: 0B
   CGroup: /system.slice/podman.socket

11月 28 00:35:36 kepler systemd[1]: Listening on Podman API Socket.

/run/podman/podman.sockファイルが作成され、/var/run/docker.sockとの疎通が確認できました。

# ls -l /var/run/docker.sock
lrwxrwxrwx. 1 root root 23 11月 28 00:15 /var/run/docker.sock -> /run/podman/podman.sock

# file /var/run/docker.sock
/var/run/docker.sock: symbolic link to /run/podman/podman.sock

# file /run/podman/podman.sock
/run/podman/podman.sock: socket

動作確認

試しにdocker.sock経由でREST APIを叩いてみます。まずはDocker API。

# curl --unix-socket /var/run/docker.sock http:/v1.41/info | jq
{
  "ID": "0920805e-d127-4ac8-9836-d3fe5ced9065",
  "Containers": 2,
  "ContainersRunning": 2,

    (中略)

続いてPodman API。

# curl --unix-socket /var/run/docker.sock http://d/v3.0.0/libpod/info | jq
{
  "host": {
    "arch": "amd64",
    "buildahVersion": "1.22.3",
    "cgroupManager": "systemd",
    "cgroupVersion": "v1",

    (中略)

応答が有ればdockerを期待する周辺ソフトウェアから擬似的なdocker資源経由でpodmanが使えるようになっています。

まとめ

CentOS8が出てpodmanに置き換わった当初、CentOS7にインストールしたgitlab-runnnerでdockerコンテナを立ち上げるCIをしていて、どうやってCentOS8に移行するかかなり悩んでいました。これだけdockerと互換性があるのでハックすれば動くだろうけど公式の方法が欲しかったんですよね。

そんな折にpodmanサイドはdocker-composeには対応しない声明を出していたりで「えーマジか・・・」とゲンナリしたもんですが、バージョンが上がって歩み寄ってくれたお陰で、今では上記のCI環境はCentOS8から移行したAlmaLinuxで元気に動作中です。めでたし。

次回はこのpodman環境でdocker-composeを動かしたり、GitLab CIからコンテナ起動してみたいと思います。

-linux, 開発インフラ
-,

執筆者:

関連記事

Termuxで動作が確認できたターミナルゲーム4つ

Android端末をroot化せずにLinux環境を独自構築する神アプリ「Termux」。 play.google.comhttps://play.google.com/store/apps/deta …

ngrokで手軽にHTTPS検証環境を構築

目次1 はじめに2 手順2.1 ngrokのアカウントを作成2.2 zipファイルをダウンロードして解凍2.3 認証トークンをPCに登録する2.4 HTTPサーバを起動する2.5 起動した8080ポー …

開発中のWebシステム上でApple Pay決済を有効化する為のApple Developer Program設定 

WebシステムでApple Pay決済を有効にするにはApple側にその旨を認証して貰う必要が有ります。 前回、Web上でApple Payテスト課金をする為のサンドボックステスターを作成しました。 …

Linuxコマンドラインで英語を日本語翻訳、cowsayは日本語を話せる

サバサバしがちなIT開発現場、一服の潤いが必要ですね。以前、Linuxログインした時に牛に格言を喋らせる伝統芸能を試しました。 One IT ThingLinuxのシェルログイン時、牛に格言を喋らせる …

GitLabのIPを変更したらMattermostにログイン出来なくなった話「the redirect uri included is not valid. 」

目次1 発端2 環境3 GitLabのIP変更設定を開始4 そしてハマる5 解決6 結局どこに設定が保存されていたか7 まとめ 発端 先日オフィスの引っ越しが有りネットワークセグメントが変わる為、Gi …

 

shingo.nakanishi
 

東京在勤、職歴2n年中年ITエンジニアです。まだ開発現場で頑張っています。

19歳(1996年)から書き始めたアウトプット用プライベートWeb日記数が5,000日を超え、残りの人生は発信をして行きたいと思い、令和元日からこのサイトを開始しました。勉強と試行錯誤をしながら、自分が経験したIT関連情報を投稿しています。

私と同じく、今後IT業界で生計を立てて行きたいと考えている方や、技術共有したいけど仲間が居なくて孤独、といった方と一緒に成長、知識共有して行けたら楽しいな、と思っています。