マッピングされた特権ポートを使用してルートレスPodmanコンテナを起動する方法はありますか(コンテナサービスはホストのポート1023以下を介して公開されます)。
走る
$ podman run --rm -it -p 80:80 nginx:stable-alpine
Error: rootlessport cannot expose privileged port 80, you can add 'net.ipv4.ip_unprivileged_port_start=80' to /etc/sysctl.conf (currently 1024), or choose a larger port number (>= 1024): listen tcp 0.0.0.0:80: bind: permission denied
当然、権限が不足して失敗します。
$ sudo capsh --caps=CAP_NET_BIND_SERVICE+eip -- -c 'podman run --rm -it -p 80:80 nginx:stable-alpine'
root
ユーザーとしてPodmanを実行する
$ sudo capsh --caps=CAP_NET_BIND_SERVICE+eip --user=$USER -- -c 'podman run --rm -it -p 80:80 nginx:stable-alpine'
Unable to set group list for user: Operation not permitted
権限のため失敗しましたsu
。
これまで、私はすべてのプロセスが数秒間特権ポートをバインドできるように一時的に許可する次善策ソリューションを見つけました。
sudo sysctl net.ipv4.ip_unprivileged_port_start=80 ;\
( sleep 5 ; sudo sysctl net.ipv4.ip_unprivileged_port_start=1024 ) &\
podman run --rm -it -p 80:80 nginx:stable-alpine
ベストアンサー1
systemd サービスの Rootless Podman は、User=
次のコマンドを使用して nginx コンテナを起動できます。ソケットの有効化特権ポートを使用してください。
- ユーザーの作成テストまだ存在しない場合。
$ sudo useradd test
- ユーザーのUIDの確認テスト
$ id -u test 1000
- ファイルの作成/etc/systemd/system/example3.service内容がある
(ファイルをシステムに合わせて調整するには、[Unit] Wants=network-online.target After=network-online.target [email protected] [email protected] RequiresMountsFor=/run/user/1000/containers [Service] User=test Environment=PODMAN_SYSTEMD_UNIT=%n KillMode=mixed ExecStop=/usr/bin/podman rm -f -i --cidfile=/run/user/1000/%N.cid ExecStopPost=-/usr/bin/podman rm -f -i --cidfile=/run/user/1000/%N.cid Delegate=yes Type=notify NotifyAccess=all SyslogIdentifier=%N ExecStart=/usr/bin/podman run \ --cidfile=/run/user/1000/%N.cid \ --cgroups=split \ --rm \ --env "NGINX=3;" \ -d \ --replace \ --name systemd-%N \ --sdnotify=conmon \ docker.io/library/nginx
1000
手順2で見つけたUIDに置き換えます) - セキュリティを強化するためのオプションの手順:ファイルの編集/etc/systemd/system/example3.serviceコマンド
--network none
にオプションを追加します。podman run
詳しくはセクションをご覧ください。コンテナのネットワーキング可能性の制限 - ファイルの作成/etc/systemd/system/example3.socket内容がある
[Unit] Description=Example 3 socket [Socket] ListenStream=0.0.0.0:80 [Install] WantedBy=sockets.target
- システム構成の再ロード
$ sudo systemctl daemon-reload
- ソケットの起動
$ sudo systemctl start example3.socket
- Webサーバーのテスト
$ curl localhost:80 | head -4 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title>
この例で使用されている方法を使用するには、コンテナイメージがサポートする必要があります。ソケットの有効化。例えばdocker.io/library/mariadbそしてdocker.io/library/nginxサポートするソケットの有効化しかし、他の多くのコンテナイメージはサポートされていません。ソケットの有効化。
上記のステップは、私が書いたデモから得たものです。 https://github.com/eriksjolund/podman-nginx-socket-activation/tree/main/examples/example3
これを試してみたので、このソリューションがどれほどうまく機能しているかを把握する必要があります。
一つあるPodman 機能リクエストUser=
systemdシステムサービスのPodmanサポートを追加するために使用されます。この機能リクエストはGitHubディスカッションに移行されました。