最終更新日:2023/09/18
これがないと始まらない
Using Podman and Docker Compose | Enable Sysadmin
https://www.redhat.com/sysadmin/podman-docker-compose
要約するとDockerコマンドを通してPodmanが使えるようになるから、Dockerコマンドを使うDocker Composeをそのまま使えるよってこと。
(多分)
まずは「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
動作に必要なPodmanのソケットサービスを起動させる。
sudo systemctl start podman.socket
自動起動させる場合はこっちも。
sudo systemctl enable podman.socket
バージョン確認コマンドを実行してバージョン情報が表示されれば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
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
最終更新日:2023/09/18
CentOS付属のDocker
◆コマンド逆引き
よく使うコマンドのまとめ。
◆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
・詳細
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
・詳細
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/
・詳細
「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