내 컴퓨터의 Docker에서 응용 프로그램 서버 소켓을 열 수 없습니다.

내 컴퓨터의 Docker에서 응용 프로그램 서버 소켓을 열 수 없습니다.

소개하다

  • libevent저는 위젯을 사용하여 libevhtphttp 통신용 서버 소켓을 만드는 독점 애플리케이션을 개발 중입니다 .
  • 나는 Dockerfile이 애플리케이션을 도커 이미지에 배치하는 프로그램을 작성했습니다.

결과 Docker 이미지는 기본적으로 애플리케이션을 실행하고, 이미지를 실행하면 제가 테스트한 다른 머신(ubuntu 20.04/22.04)에서 제대로 작동합니다.
docker run --rm -p 8080:8080 -t mytag

  • 동일한 네트워크 내에서 이 컴퓨터의 포트 8080에 연결할 수 있습니다.
  • docker exec -ti runningcontainer bash실행 중인 컨테이너를 보고 netstat -pntl애플리케이션이 포트 8080에서 수신 대기하고 있음을 확인할 수 있습니다 .

질문

내 노트북에서는 그렇지 않습니다. 나는 내가 시도한 다른 서버처럼 Ubuntu를 실행하지 않습니다. 나는 Manjaro에 있습니다. 그러나 이것이 어떻게 중요한지 모르겠습니다.

  • 내 노트북에서 실행 중인 도커 컨테이너 내부와 실행 중인 애플리케이션 내에서 netstat -pntl청취 소켓이 표시되지 않습니다.
  • 따라서 애플리케이션의 포트 8080에 연결할 수 없습니다. - curl localhost:8080반환Connection Refused
  • 내 컴퓨터(Docker가 아님)에서 기본적으로 애플리케이션을 실행하면 예상대로 작동하며 포트 8080에 액세스할 수 있습니다.
  • nc -l 0.0.0.0 9999내 노트북에서 실행 중인 Docker 컨테이너에서 실행하면 소켓이 열리고 netstat수신 중이라고 보고됩니다.
  • nc 127.0.0.1 9999컨테이너 내부에서 열린 소켓으로의 연결은 예상대로 작동합니다.
  • --privileged동일한 결과로 컨테이너를 실행해 보았지만 작동하지 않습니다.
  • 모든 도커 이미지, 컨테이너, 네트워크를 다듬고 내 컴퓨터에서 모든 도커 흔적을 제거 및 제거한 다음 다시 설치했지만 동작에는 변화가 없습니다.

결론적으로

어떤 이유로든 애플리케이션이 Docker 컨테이너 내에서 실행될 때 청취 소켓을 열지 않는 것 같습니다. 구현 로그에는 오류가 표시되지 않습니다. 참고: 오류가 있는지 또는 무시되는 일부 오류 코드가 있는지 확인하기 위해 구현을 확인하지 않았습니다.

가장 효율적인 방법으로 이를 시도하고 디버깅하는 방법을 찾는 데 도움이 필요합니다.

내 다음 단계는

  • test.html 파일을 제공하기 위해 libevhtp를 사용하여 작은 바이너리를 생성하고 docker에서 실행해 보십시오. 제대로 작동한다면
  • 범인을 찾을 때까지 오작동하는 응용 프로그램의 일부를 조금씩 비활성화하십시오.

두 번째 단계는 많은 작업이 소요될 예정이므로 누군가 비슷한 문제를 겪고 있거나 이 작업을 수행하기 전에 시도해 볼 수 있는 몇 가지 사항을 알려줄 수 있도록 여기에 링크하겠습니다.

답변1

발견하다

다른 모듈을 활성화하면 초기화가 항상 실패하여 사용 가능한 파일 설명자가 모두 소진되었습니다. 소켓이 바인딩될 때까지는 아무 것도 없습니다. docker에서 사용 하려고 하다가 lsof막혀서 작동하지 않을 가능성이 너무 많아서 일찍 포기했습니다. (바라보다Docker에서 lsof를 교체하는 방법(LXC 기반이 아닌 기본))

파일 설명자 제한에 대한 마지막 인터넷 검색:

# uname -r
5.15.106-1-MANJARO
# ulimit -n
1024

유용한 답변은 다음과 같습니다.https://stackoverflow.com/questions/24318543/나를 위해이 문제를 해결했습니다.

해결책:

--ulimit매개변수를 사용하여 Docker 실행
docker run --rm -p 8080:8080 --ulimit nofile=262144:262144 -ti mytag:latest bash

고쳐 쓰다:

이 스레드에 따르면:https://github.com/moby/moby/issues/44547
반영구적인 해결책은 LimitNOFILE파일의 값을 에서 로 변경하는 것 같습니다 infinity. 시스템이 업그레이드된 후 이 작업을 반복해야 할 수도 있습니다. 이 스레드에는 또 다른 솔루션이 설명되어 있습니다.1048576/usr/lib/systemd/system/containerd.service
https://bbs.archlinux.org/viewtopic.php?id=285058/etc/docker/daemon.json아래와 같이 docker의 기본 ulimit를 설정하기 위해 docker 설정 파일을 생성하는 것이 좋습니다 .

{ 
    "default-ulimits": {
        "nofile": {
            "Hard": 1048576,
            "Name": "nofile",
            "Soft": 1048576
        }
    }
}

그런 다음 실행 systemctl reload docker하여 변경 사항을 적용합니다.

관련 정보