매핑된 권한 있는 포트를 사용하여 루트 없는 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
- 웹 서버 테스트
$ 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 토론으로 이동되었습니다.