Docker 컨테이너에 매핑된 포트를 찾아보려 할 때 'ERR_CONNECTION_REFUSED' 발생

Docker 컨테이너에 매핑된 포트를 찾아보려 할 때 'ERR_CONNECTION_REFUSED' 발생

Docker 이미지를 가져왔습니다.

$ docker pull ghost

그리고 이미지에서 컨테이너를 실행합니다.

$ docker run --name test-ghost -p 8080:2368 -d ghost
7d984e974f6a75fe18b3d397b5c8f0a428928a2be9df83f0d61a679aa5f537fc

제가 이해한 바에 따르면 -p스위치는 호스트의 포트(8080)를 Docker 내부의 포트(2368)에 매핑하므로 Docker 외부, 즉 내 호스트에서 Docker 내에서 실행 중인 웹 서버에 접속할 수 있습니다.

그러나 내 호스트에서 Chrome의 다음 주소 중 하나를 탐색하려고 하면 다음과 같습니다.

http://localhost:8080/
http://0.0.0.0:8080/
http://127.0.0.1:8080/

다음 오류가 발생합니다.

This webpage is not available

ERR_CONNECTION_REFUSED

이는 컨테이너 내부의 문제가 아니라 연결 문제인 것 같습니다. 컨테이너 내부에서 실행 중인 프로세스를 검사하면 NodeJS가 실행 중인 것으로 보입니다.

$ docker top test-ghost
UID          PID           PPID      ...  CMD
docker       4290          1028      ...  npm
docker       4324          4290      ...  sh -c node index
docker       4325          4324      ...  node index

하지만 포트 8080에서는 아무것도 수신 대기하지 않는 것 같습니다.

$ sudo lsof -n -i4TCP:8080 | grep LISTEN
$

또한 확인해 보니 MacOS 방화벽이 꺼져 있습니다.


내가 제공한 정보가 최소한이라는 것을 알고 있기 때문에 여기서 완전한 해결책을 기대하지는 않습니다.

제가 궁금한 점은 이러한 문제를 해결하려면 어떻게 해야 합니까?

Docker 포트에 접근할 수 없는 것 같습니다.

포트 매핑이 작동하지 않는 이유를 알아낼 수 있는 방법이 있습니까? 아니면 어떤 포트인가요?~이다Docker에 의해 노출되나요? 아마도 잘못된 내부 포트를 매핑하고 있는 것일까요?

아니면 내가 여기서 뭘 잘못하고 있는지에 대한 다른 일반적인 제안이 있습니까?

답변1

마침내 이 작업을 수행하는 방법을 알아냈습니다!

저는 MacOS에서 Docker를 실행하고 있으며 'Docker QuickStart Terminal'을 사용하고 있습니다.

Docker가 자체 호스트를 설정하는 것처럼 보이기 때문에 'localhost', '127.0.0.1' 등으로 이동하는 것이 잘못된 것으로 나타났습니다.

                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/


docker is configured to use the default machine with IP 192.168.99.100
For help getting started, check out the docs at https://docs.docker.com

위에 주어진 를 사용하면 192.168.99.100모든 것이 잘 작동합니다.

답변2

실행 중인 컨테이너의 IP 주소를 찾으려면 다음을 사용할 수 있습니다.

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' myContainerID

답변3

docker-machine다음 명령을 사용하여 docker를 실행하면 IP 주소를 얻을 수 있습니다( default귀하의 이름이라고 가정).

docker-machine ip default

보다:https://docs.docker.com/machine/reference/ip/

답변4

docker를 사용하기 시작했는데 이것이 제가 처음으로 접한 문제/문제입니다.

호스트, 브리지(기본값)와 같은 다른 모드에서 포트를 사용하는지 여부를 docker에서 지정할 수 있는 것 같습니다.

브릿지 모드 docker에서는 ghost를 배포하면 메시지가 표시됩니다. 이제 귀하의 블로그를 다음에서 사용할 수 있습니다.http://localhost:2368/하지만 이 URL을 방문하면 연결이 거부된 것으로 표시됩니다.

이 문제를 해결하려면 kitematic의 인스턴스 설정을 방문해야 합니다(콘솔을 사용하는 것보다 더 쉽습니다). 호스트 이름/포트 탭으로 이동합니다. docker 포트에서 호스트 포트 및 bingo로 이미지에 표시된 대로 매핑을 만듭니다. 이제 URL을 다시 방문하면 모든 것이 예상대로 작동합니다.

Kitematic 인스턴스 설정 포트

관련 정보