저는 Debian 11에서 Docker를 실행하고 있습니다. Nginx 컨테이너를 배포했지만 다른 프로세스에서 포트 80을 사용하지 않는 경우에도 포트 80에 바인딩할 수 없습니다. Docker를 루트로 실행해 보기도 했습니다.
이것은 명령입니다:docker run -d -p 80:80 nginx:alpine
컨테이너 로그는 다음과 같습니다.
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2022/08/03 11:06:15 [emerg] 1#1: socket() 0.0.0.0:80 failed (13: Permission denied)
nginx: [emerg] socket() 0.0.0.0:80 failed (13: Permission denied)
나는 의심한다의류가 네트워크 액세스를 차단하고 있습니다.. Apparmor를 제거하면 모든 것이 잘 작동합니다. 그러나 Apparmor를 설치한 후에는특권Docker 컨테이너는 인터넷에 연결할 수 있습니다.
이 문제를 디버깅하는 데 도움이 되는 추가 정보가 필요하면 알려주시기 바랍니다.
답변1
이 경우 "문제"는 시스템이 요청한 작업을 수행할 수 없다는 것이 아니라 시스템이 실제로 수행해서는 안 되는 작업을 수행하도록 요청하고 있다는 것입니다.
1024 이하의 포트는 다음과 같이 분류됩니다.특권-- 루트나 특정 권한이 있는 사람만 이 포트에서 소켓을 열 수 있습니다.
Docker가 루트로 실행되지 않거나 적어도 실행되지 않습니다.해서는 안 된다, 따라서 포트 80에서 소켓을 열 수 없습니다. 이는 올바른 동작입니다.
높은 포트와 로컬 호스트에서만 수신 대기하도록 Docker를 설정한 다음 Apache 또는 nginx를 프록시로 사용하는 것이 좋습니다.