索引(名前順)

PodmanでDocker Composeを使う

最終更新日:2023/09/18

これがないと始まらない

インストール方法

Using Podman and Docker Compose | Enable Sysadmin
https://www.redhat.com/sysadmin/podman-docker-compose

要約するとDockerコマンドを通してPodmanが使えるようになるから、Dockerコマンドを使うDocker Composeをそのまま使えるよってこと。
(多分)

(1):必須パッケージインストール

まずは「podman-docker」と「podman-plugins」パッケージをインストールする。
「podman-docker」はDockerコマンドをエミュレートするもの、「podman-plugins」はコンテナ間通信でコンテナ名でアクセスするのに必要。

dnf install -y podman-docker podman-plugins

次にDocker Composeをインストールする。

curl -SL https://github.com/docker/compose/releases/download/v2.21.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose

インストールしたら実行権限も付与すること!

chmod +x /usr/local/bin/docker-compose

上記のコマンドは編集時のバージョン(2.21.0)のため、最新のバージョンがないか公式サイトで確認すること。

Docker Compose のインストール — Docker-docs-ja 24.0 ドキュメント
https://docs.docker.jp/compose/install.html

(2):サービス起動

動作に必要なPodmanのソケットサービスを起動させる。

sudo systemctl start podman.socket

自動起動させる場合はこっちも。

sudo systemctl enable podman.socket

(3):動作確認

バージョン確認コマンドを実行してバージョン情報が表示されればOK。

コマンド

docker-compose version

結果

Docker Compose version v2.21.0

Dockerコマンドも使用可能。
Podmanでエミュレートしてるよメッセージが表示される。

コマンド

docker -v

結果

Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
podman version 4.4.1

Podman Composeについて

解説

Docker ComposeのPodmanバージョン、有志の方々が作成している。

先程のDocker Composeとの違いとして、Podman Composeの場合はDockerfileでのコンテナ作成時にPodが作成され、その中にコンテナやネットワークが作成される。
Docker Composeの場合はPodは作成されず、コンテナとネットワークがそのまま作成される。

公式でDocker Composeが使えるようになったため、もう必要なさそうだが残しておく。

インストール

containers/podman-compose: a script to run docker-compose.yml using podman
https://github.com/containers/podman-compose

Podman Composeでほぼ同じコマンドが使用できる。
PyPI(pip3)でもインストールできるが、ボリューム周りで不具合があるバージョンの可能性があるため、GitHubから開発版をインストールするのがおすすめ。
(インスコのやり方はリンク先で)

注意点

コンテナ名がサービス名と同じだといけないらしい。
必ず「container_name」で別名を付けること。

redmine:
  container_name: 'redmine_container'

使い方

podman-compose up -d

メインページに戻る


Podman

最終更新日:2023/09/18

CentOS付属のDocker

コマンドなど

コマンド逆引き
よく使うコマンドのまとめ。

Docker Compose

PodmanでDocker Composeを使う
Docker Composeを使うための手順。

その他

トラブルシューティング
エラーの解決方法のメモ

リンク

Podman
https://podman.io/


コンテンツ一覧へ戻る


コマンド逆引き

最終更新日:2023/09/18

起動したプロセスを確認する

コマンド

podman ps

結果

CONTAINER ID  IMAGE                         COMMAND               CREATED        STATUS            PORTS                                        NAMES
93edff9fc6f8  docker.io/gitea/gitea:1.14.3  /bin/s6-svscan /e...  4 minutes ago  Up 4 minutes ago  0.0.0.0:222->22/tcp, 0.0.0.0:3000->3000/tcp  gitea

「STATUS」には起動してからの時間が表示される。
エラーの場合はここに「Exited (X) 4 minutes ago」と表示される。

ログを表示する

コマンド

podman logs (コンテナ名)

コマンド例(コンテナ名がgiteaの場合)

podman logs gitea

結果(Giteaの場合)

Generating /data/ssh/ssh_host_ed25519_key...
Generating /data/ssh/ssh_host_rsa_key...
Generating /data/ssh/ssh_host_dsa_key...
Generating /data/ssh/ssh_host_ecdsa_key...
Server listening on :: port 22.
Server listening on 0.0.0.0 port 22.
(長いので省略)

エラーで起動しない場合など、コンテナのログを見たい時に使用する。
ここでエラーログなどがわかったら、そのコンテナに使用しているイメージのGithubやフォーラムを検索してみると原因と対策が見つかりやすい。

コンテナ内でコマンドを実行する

コマンド

podman exec (コンテナ名)

コマンド例(コンテナ名がgiteaのシェルを実行する場合)

podman exec -it gitea /bin/bash

結果(Giteaの場合)

bash-5.1#

「-it」オプションは現在のターミナルと標準入力を対象のコマンドに割り当てる。
コンテナ内のシェルを実行するのによく使う。

ダウンロードしたイメージの一覧を表示する

コマンド

podman images

結果

REPOSITORY             TAG     IMAGE ID      CREATED      SIZE
docker.io/gitea/gitea  1.14.3  c5418be8cef7  2 weeks ago  160 MB

「IMAGE ID」は一意の文字列となり、イメージ名の代わりになる。

ダウンロードしたイメージを削除する

コマンド

podman image rm (イメージ名もしくはイメージID)

コマンド例(Giteaのイメージを削除)

podman image rm docker.io/gitea/gitea

「-f」オプションを付けると強制削除になる。
またイメージIDで削除する場合、先頭3桁ぐらいの指定でも削除可能。
仮にイメージIDが「c5418be8cef7」だった場合、「c54」を指定するだけでOK。

作成したボリュームの一覧を表示する

コマンド

podman volume ls

結果

DRIVER      VOLUME NAME
local       442698b5949e0b88d1da915cb8393374fa2288e3be9d575459948855a2e29529

作成したボリュームの情報を表示する

コマンド

podman volume inspect (ボリューム名)

コマンド例

podman image inspect 442698b5949e0b88d1da915cb8393374fa2288e3be9d575459948855a2e29529

結果

[
    {
        "Name": "442698b5949e0b88d1da915cb8393374fa2288e3be9d575459948855a2e29529",
        "Driver": "local",
        "Mountpoint": "/var/lib/containers/storage/volumes/442698b5949e0b88d1da915cb8393374fa2288e3be9d575459948855a2e29529/_data",
        "CreatedAt": "2021-07-05T22:44:34.485789416+09:00",
        "Labels": {},
        "Scope": "local",
        "Options": {},
        "Anonymous": true
    }
]

作成されたボリュームがどこに保存されているかなど、ボリュームの情報を調べる時に使用する。
同じく先頭3桁ぐらいの指定でもOK。

作成したボリュームを削除する

コマンド

podman volume rm (ボリューム名)

コマンド例

podman image rm 442698b5949e0b88d1da915cb8393374fa2288e3be9d575459948855a2e29529

「-f」オプションを付けると強制削除になる。
同じく先頭3桁ぐらいの指定でもOK。

使われていないボリュームをすべて削除する

コマンド

podman volume prune

結果

WARNING! This will remove all volumes not used by at least one container. The following volumes will be removed:
442698b5949e0b88d1da915cb8393374fa2288e3be9d575459948855a2e29529
Are you sure you want to continue? [y/N]  

コンテナに付属していないボリュームをすべて削除する。
削除前に警告が表示され、「y」を入力するとすべて削除される。
削除する前にちゃんと確認しておこう、ヨシ!


メインページに戻る


トラブルシューティング

最終更新日:2024/12/08

ビルドでエラー その1

・詳細
rootユーザーで「podman build」すると、なんかエラーが出る。

・エラー内容

sd-bus call: Transport endpoint is not connected: Transport endpoint is not connected

・原因
「DBUS_SESSION_BUS_ADDRESS」と「XDG_RUNTIME_DIR」が他のユーザーで使用されており、それが想定されてないため。
らしい

・解決方法
「DBUS_SESSION_BUS_ADDRESS」と「XDG_RUNTIME_DIR」を未設定状態にする。

unset DBUS_SESSION_BUS_ADDRESS
unset XDG_RUNTIME_DIR 

・参考URL
sd-bus call: Transport endpoint is not connected · Issue #3887 · containers/buildah
https://github.com/containers/buildah/issues/3887

ビルドでエラー その2

・詳細
rootユーザーで「podman build」すると、なんかエラーが出る。

・エラー内容

SHELL is not supported for OCI image format, [/bin/bash -o pipefail -c] will be ignored. Must use `docker` format

・原因
Dockerfileが「OCI image format」(Podmanのコンテナイメージフォーマット)でサポートされてないフォーマットだった。

・解決方法
「format」オプションで、Dockerのフォーマットを指定する。

podman build ./ -t redmine_custom:1.0.0 --format docker

・参考URL
podman-build — Podman documentation
https://docs.podman.io/en/latest/markdown/podman-build.1.html#format

外部ファイルにアクセスできない

・詳細
コンテナから外部ファイルにアクセスすると「Permission denied」とエラーが出る。

・エラー内容
下記はPythonを動かそうとしたときのエラー。
外部ファイルの「main.py」がパーミッション許可されていない。

python: can't open file '/app/main.py': [Errno 13] Permission denied

・原因
対象のファイルのSELinux(またコイツか・・・)のコンテキストが、コンテナ用にラベルされていない。

・解決方法
「chcon」コマンドでコンテナ用のラベル「container_file_t」を付与する。

chcon -h -t container_file_t main.py

SELinuxのコンテキストは、下記のコマンドなどで確認できる。

ls -lZ

・参考URL
https://ideal-reality.com/computer/server/podman-volume-selinux/

docker-composeが動かない

・詳細
PodmanでDocker_Composeを使う」で導入した「docker-compose」が、OSのパッケージ更新したら動かなくなった(実話)

・エラー内容

[root@localhost redmine]# docker-compose start
Cannot connect to the Docker daemon at unix:///run/user/1000/podman/podman.sock. Is the docker daemon running?

・原因
「podman-docker」などは「podman.socket」のソケットを使用してpodmanのコマンドを実行しているが、このソケットのパスが正しくないパスを指していた。

・解決方法
「podman-docker」が使用している「podman.socket」のソケットのパスを、正しいパスに修正する。

まずは「podman.socket」のソケットのパスを確認する。
「Listen」がソケットのパスになる。
(下記の場合は「/run/podman/podman.sock」)

[root@localhost redmine]# systemctl status podman.socket 
● podman.socket - Podman API Socket
     Loaded: loaded (/usr/lib/systemd/system/podman.socket; enabled; preset: disabled)
     Active: active (listening) since Sun 2024-12-08 13:51:48 JST; 3min 27s ago
      Until: Sun 2024-12-08 13:51:48 JST; 3min 27s ago
   Triggers: ● podman.service
       Docs: man:podman-system-service(1)
     Listen: /run/podman/podman.sock (Stream)
     CGroup: /system.slice/podman.socket

次に環境変数「$DOCKER_HOST」の値を、「podman.socket」のソケットのパスに修正する。
「$DOCKER_HOST」は「podman-docker」が使用している「podman.socket」のソケットのパス。
スラッシュの数に注意。
(「unix://」「/run/podman/podman.sock」となる)

[root@localhost redmine]# export DOCKER_HOST=unix:///run/podman/podman.sock
[root@localhost redmine]# echo $DOCKER_HOST
unix:///run/podman/podman.sock

最後に「docker-compose」が正常に動作することを確認する。

[root@localhost redmine]# docker-compose start

・参考URL
https://github.com/containers/podman/discussions/16338


メインページに戻る