호스트 외부 (동일한 네트워크)에서 도커 컨테이너에 연결하는 방법 [Windows]


87

첫 번째 도커 컨테이너를 만들었는데 Go를 사용하여 서버를 실행하고 있지만 호스트 컴퓨터 외부에서 액세스 할 수 없습니다. 방금 도커로 시작했기 때문에 여기서 조금 길을 잃었습니다.

그래서 서버를 시작하는 매우 간단한 Go 코드가 있고 Go를 설치하고 Linux 기본 이미지에서 코드를 빌드하는 도커 이미지를 빌드했습니다. 포트 8080에서 서버를 실행 중이므로 다음과 같이 컨테이너를 실행하는 호스트에 해당 포트를 노출합니다.

docker run -p 8080:8080 dockertest

작동하고 도커의 컴퓨터 IP ( 시작될 때 Docker 빠른 시작 터미널 에 표시되는 IP)를 통해 서버에 액세스 할 수 있습니다 . 문제는 호스트 외부에서 호스팅하는 웹 사이트에 액세스 할 수 없다는 것이므로 시도하면 내 휴대 전화에서 동일한 IP 주소를 열면 오류 메시지가 표시됩니다.이 웹 페이지를 사용할 수 없습니다 (ERR_CONNECTION_TIMED_OUT).

또한 다음과 같이 IP를 지정해 보았습니다.

docker run -p 192.168.0.157:8080:8080 dockertest

하지만 그렇게하면 도커 머신의 IP 나 위의 명령 줄에 지정된 IP를 통해 웹 사이트에 액세스 할 수 없습니다. 또한 내 컴퓨터의 IP를 사용한 명령에 어떤 IP를 써야할지 모르겠습니다. 127.0.0.1 (localhost)도 시도했지만 동일한 결과를 얻었습니다. IP는 무엇이든.

나는이 문제를 검색하고 많은 StackOverflow 질문을 찾았지만 내 문제를 해결하는 데 도움이되지 않았습니다. 대부분이 Linux 또는 Mac을 지향했기 때문에 솔루션이 내 상황에 적용되지 않았습니다.

또한 내 컴퓨터에서 Go 코드를 실행하고 내 컴퓨터의 IP를 통해 동일한 네트워크에있는 다른 장치에서 웹 사이트에 액세스 할 수 있습니다. 도커 머신에서 실행할 때 액세스 할 수없는 이유를 이해하지 못합니다. IP 전달과 관련이있을 수 있지만 네트워킹에서는 완전히 멍청한 사람입니다. 대부분 웹 개발자이며 네이티브 경험이 거의 없습니다.


-p 옵션과 함께 Dockerfile에서 EXPOSE 8080을 사용 했습니까? 또한 컨테이너가 실행중인 상자의 포트 8080이 보안 규칙에 의해 차단되지 않는지 확인하십시오.
keda

@keda 예, Dockerfile에는 EXPOSE 8080이 포함되어 있습니다. Docker의 빠른 시작 터미널을 통해 내 컴퓨터에서 컨테이너를 로컬로 실행하고 있습니다. Windows 방화벽도 비활성화 해 보았지만 둘 다 작동하지 않았습니다. 일부 설정이 있는지 모르겠습니다. 실종
redsalt

답변:


90

TL; DR VirtualBox 호스트의 네트워크 모드를 확인합니다 bridged. 로컬 네트워크에서 가상 머신 (및 호스팅중인 Docker 컨테이너)에 액세스 할 수 있도록하려면 그래야 합니다.


HTTP를 통해 애플리케이션에 액세스하기 위해 연결할 호스트에 혼란이있는 것 같습니다. 구성이 무엇인지 실제로 설명하지 않았습니다. 태그에 "Windows"와 "VirtualBox"가 있다는 사실을 기반으로 몇 가지 추측을 할 것입니다.

Windows 호스트의 VirtualBox에서 실행되는 Linux의 일부 버전에서 Docker를 실행하고 있다고 생각합니다. 다음과 같이 IP 주소에 레이블을 지정하겠습니다.

D = Docker 컨테이너의 IP 주소

L = VirtualBox에서 실행중인 Linux 호스트의 IP 주소

W = Windows 호스트의 IP 주소

Windows 호스트에서 Go 애플리케이션을 실행하면 http://W:8080/로컬 네트워크의 어디에서나 Go 애플리케이션에 연결할 수 있습니다 . 이것은 Go 응용 프로그램이 Windows 시스템의 포트 8080을 바인딩하고 IP 주소에서 포트 8080에 액세스하려는 모든 사람이 연결되기 때문에 작동합니다 W.

그리고 여기가 더 복잡해집니다.

VirtualBox는 VM (가상 머신)을 설정할 때 여러 다른 모드 중 하나로 네트워크를 구성 할 수 있습니다. 모든 다른 옵션이 무엇인지 기억이 나지 않지만 원하는 옵션은입니다 bridged. 이 모드에서 VirtualBox는 네트워크에 연결된 다른 시스템과 마찬가지로 네트워크의 독립 실행 형 시스템 인 것처럼 가상 시스템을 로컬 네트워크에 연결합니다. 에서 bridged모드, 가상 컴퓨터가 다른 컴퓨터와 같은 네트워크에 나타납니다. 다른 모드에서는 설정이 다르게 설정되며 네트워크에서 기기가 표시되지 않습니다.

따라서 Linux 호스트 ( bridged)에 대해 네트워킹을 올바르게 설정했다고 가정하면 Linux 호스트는 로컬 네트워크에 IP 주소 (예 : 192.168.0.x)를 갖게되며에서 Docker 컨테이너에 액세스 할 수 있습니다 http://L:8080/.

리눅스 호스트가 아닌 다른 모드로 설정되어있는 경우 bridged, 당신은 할 수 Windows 호스트에서 액세스 할 수 있지만, 그것은에 정확히 어떤 모드에 의존하는 것입니다.

편집 -아래 설명에 따르면 위에서 설명한 상황이 옳은 것처럼 들립니다.

잠시 백업 해 보겠습니다. 여기 내 컴퓨터 (Ubuntu Linux)에서 Docker가 작동하는 방식이 있습니다.

내가 가지고있는 것과 동일한 명령을 실행한다고 상상해보십시오 docker run -p 8080:8080 dockertest.. 이것이하는 일은 dockertest이미지를 기반으로 새 컨테이너를 시작 하고 Linux 호스트 (내 PC)의 포트 8080을 컨테이너의 포트 8080으로 전달 (연결)하는 것입니다. Docker는 Docker 데몬이 통신하고 컨테이너가 서로 통신 할 수 있도록 자체 내부 네트워킹 (자체 IP 주소 집합 포함)을 설정합니다. 그래서 기본적으로 당신이하는 일은 -p 8080:8080Docker의 내부 네트워킹을 "외부"네트워크와 연결 하는 것 입니다. 호스트의 네트워크 어댑터-특정 포트.

지금까지 나와? 이제 한 걸음 물러서서 시스템을 살펴 보겠습니다. 컴퓨터가 Windows를 실행 중입니다. Docker는 (현재) Windows에서 실행되지 않으므로 사용중인 도구가 VirtualBox 가상 컴퓨터에 Linux 호스트를 설정했습니다. docker run환경에서 작업을 수행하면 똑같은 일이 발생합니다. Linux 호스트의 포트 8080이 컨테이너의 포트 8080에 연결됩니다. 여기서 큰 차이점은 Windows 호스트가 컨테이너가 실행되는 Linux 호스트가 아니므로 여기에 다른 계층이 있으며 문제가 발생하는이 계층을 가로 질러 통신한다는 것입니다.

필요한 것은 다음 두 가지 중 하나입니다.

  1. Docker 컨테이너를 호스트 포트에 연결하는 것처럼 VirtualBox VM의 포트 8080을 Windows 호스트의 포트 8080에 연결합니다.

  2. bridged위에서 설명한 네트워크 모드 를 사용하여 VirtualBox VM을 로컬 네트워크에 직접 연결합니다 .

첫 번째 옵션에 갈 경우에 컨테이너에 액세스 할 수 있습니다 http://W:8080경우 WWindows 호스트의 IP 주소 나 호스트 이름입니다. 두 번째를 선택하는 경우에 컨테이너에 액세스 할 수 있습니다 http://L:8080L리눅스 VM의 IP 주소 또는 호스트 이름입니다.

이것이 모두 상위 수준의 설명입니다. 이제 VirtualBox VM의 구성을 변경하는 방법을 알아 내야합니다. 그리고 여기에서 제가 정말로 당신을 도울 수없는 부분이 있습니다. Windows 컴퓨터에서이 모든 작업을 수행하는 데 어떤 도구를 사용하는지 모르겠고 Windows에서 Docker를 사용하는 데 전혀 익숙하지 않습니다.

VirtualBox 구성 창에 액세스 할 수 있으면 아래에 설명 된대로 변경할 수 있습니다. VM을 수정하는 명령 줄 클라이언트도 있지만 익숙하지 않습니다.

들어 bridged모드 (이 정말 간단한 선택), 당신의 VM을 종료 상단에있는 "설정"버튼을 클릭의 네트워크 모드를 변경 bridged한 후 VM을 다시 시작하고 넌 좋은 이동합니다. VM은 DHCP를 통해 로컬 네트워크에서 IP 주소를 선택해야하며 해당 IP 주소에서 네트워크의 다른 컴퓨터에 표시되어야합니다.


1
퀵 스타트 터미널 (192.168.99.100)을 열 때 Docker에 표시되는 IP와 내 컴퓨터에있는 IP (192.168.0.157) 만 2 개의 IP 만 찾을 docker run -p 8080:8080 dockertest수 있습니다. 사용하여 내 웹 사이트에 액세스 할 수 있습니다 http://192.168.99.100:8080. 호스트) 내 전화가 아닙니다. 내가 사용하면 docker run -p 192.168.0.157:8080:8080 dockertest어디서든 어떤 IP로도 웹 사이트에 액세스 할 수 없습니다. 네트워킹을 설정하는 방법을 잘 모르겠습니다. 사용해 --net=bridge보았지만 둘 다 작동하지 않았습니다. VirtualBox를 열겠습니까? Docker의 터미널을 사용하여 할 수 없습니까?
redsalt 2015

문제는 Docker가 아니므로 Docker가 도움을 줄 수 없습니다. 제가 생각하는 일을 설명하기 위해 몇 가지 수정 사항을 추가하겠습니다.
Kryten 2015

네, 감사합니다! 이제 나는 전체 Linux 가상 머신 부분에 대해 혼란스러워하고 있음을 이해합니다. 나는 Docker가 내가 만질 것이라고 생각하지 않은 내부 물건에 Virtual Box를 사용하고 있다는 인상을 받았습니다. 실제로는 매우 쉬웠 bridged습니다. Virtual Box에서 로 변경해야 했는데 이제는 놀라웠습니다. 감사합니다.
redsalt 2015

포트 포워딩없이 컨테이너에 직접 액세스 할 수 있도록 동일한 네트워크에 창과 도커 컨테이너를 둘 수있는 방법이 없습니까?
Vituel

Docker에서 실행중인 Jupyter 서버를 검색하고 LAN을 통해 액세스를 시도 할 때 이것을 우연히 발견했습니다. 어쨌든 모드를 브리지로 전환 한 후 L이 무엇인지 알 수 있습니까?
PaulDong

121
  1. Oracle VM VirtualBox Manager를 엽니 다.
  2. Docker에서 사용하는 VM 선택
  3. 설정-> 네트워크를 클릭하십시오.
  4. 어댑터 1은 (기본값?) "Attached to : NAT"여야합니다.
  5. 고급-> 포트 전달을 클릭하십시오.
  6. 규칙 추가 : 프로토콜 TCP, 호스트 포트 8080, 게스트 포트 8080 (호스트 IP 및 게스트 IP는 비워 두십시오)
  7. 게스트는 도커 컨테이너이고 호스트는 컴퓨터입니다.

이제 localhost : 8080 및 your-internal-ip : 8080을 통해 컨테이너를 탐색 할 수 있습니다.


10
확인되고 훌륭하고 쉽습니다.
Dirk

2
가장 좋은 대답, 선택과 같은 더 큰 설명
아미르 카염 칸

2
방랑하는 사용자를 위해 vagrantfile이 추가 : config.vm.network를 "forwarded_port"게스트 : 8080, 호스트 : 8080, 프로토콜 : "TCP"
빈스 베르 호벤

3
에야디야! 이것은 매력처럼 작동했습니다! 감사!!!! 나는 이것을 알아 내기 위해 시간을 보낸다.
Joseph Freeman

2
이것은 VBox를 통해 Docker를 실행하는 모든 사람에게 환상적인 솔루션입니다!
Mirodinho 2017 년

7

몇 가지를 시도한 후 이것은 나를 위해 일했습니다.

  • --publish = 0.0.0.0 : 8080 : 8080 도커 플래그 사용
  • Virtualbox 네트워크 모드를 NAT로 설정하고 포트 전달을 사용하지 않습니다.

0.0.0.0내가 아닌 다른 주소로 는 성공하지 못했습니다.


4

TLDR : Windows 방화벽이 활성화 된 경우 개인 네트워크에 "vpnkit"에 대한 예외가 있는지 확인하십시오.

필자의 경우에는 로컬 네트워크의 다른 컴퓨터에서 내 컨테이너의 게시 된 포트를 방문하려고 할 때 Windows 방화벽이 내 연결을 차단한다는 것을 발견했습니다. 비활성화하면 모든 것이 작동하기 때문입니다.

그러나 컨테이너의 서비스에 액세스 할 수 있도록 방화벽을 완전히 비활성화하고 싶지는 않았습니다. 이것은 어떤 "앱"이 내 컨테이너의 서비스를 대신하여 듣고 있는지에 대한 질문을 던졌습니다. 내 컴퓨터의 리스닝 소켓 뒤에있는 앱을 검색하는 데 사용하는 방법 을 알려주는 또 다른 SO 스레드 를 찾은 후 netstat -a -b, vpnkit.exeWindows 방화벽 설정에 이미 항목이있는 이라는 것을 알게되었습니다 . 그러나 "사설 네트워크"가 비활성화되었으며 일단 활성화하면 방화벽을 완전히 비활성화하지 않고도 다른 컴퓨터에서 내 컨테이너 서비스를 방문 할 수있었습니다.


시간과 시간의 좌절에서 절 구해 주셨습니다. 감사.
Behdad

2

이것은 Docker 컨테이너를 실행할 때 Windows 사용자가 직면하는 가장 일반적인 문제입니다. IMO 이것은 "Docker에 대한 백만 달러 질문"입니다. @ "Rocco Smit"은 "내 호스트 컴퓨터의 방화벽에서 기본적으로 비활성화 된 인바운드 트래픽"을 올바르게 지적했습니다. 제 경우에는 McAfee Anti Virus 소프트웨어입니다. McAfee의 방화벽 설정에서 동일한 Wifi LAN에있는 다른 컴퓨터의 인바운드 트래픽을 허용하기 위해 추가 포트를 추가했습니다. 마술이었다. 인터넷, SO, Docker 문서, Docker 네트워킹과 관련된 자습서 후 자습서 및 "macvlan", "ipvlan", "user"에 대한 "Windows에서 지원되지 않음"의 많은 그림을 검색하는 데 일주일 이상 고생했습니다. 정의 된 브리지 "와이 동일한 SO 스레드도 두 번. 심지어 "프로덕션에서 Docker를 사용하는 사람이 있습니까?"(예 : Linux가 Windows 서버에 비해 Prod 워크로드에 더 많이 사용된다는 것을 알고 있습니다)로 Google 검색을 시작했습니다. 동일한 홈 Wi-Fi의 모바일에서 nginx에 액세스 할 수 없었기 때문입니다. Windows의 Docker 컨테이너에 배포 된 앱. 결국 동일한 LAN에있는 다른 컴퓨터 / 장치에서 애플리케이션 (Docker 컨테이너에 배포 됨)에 액세스 할 수 없다면 얼마나 좋은 일입니까? 궁극적으로 필자의 경우 문제는 인바운드 트래픽을 차단하는 방화벽뿐이었습니다. 최소한 동일한 LAN에있는 다른 컴퓨터 / 장치에서 애플리케이션 (Docker 컨테이너에 배포 됨)에 액세스 할 수없는 경우 궁극적으로 필자의 경우 문제는 인바운드 트래픽을 차단하는 방화벽뿐이었습니다. 최소한 동일한 LAN에있는 다른 컴퓨터 / 장치에서 애플리케이션 (Docker 컨테이너에 배포 됨)에 액세스 할 수없는 경우 궁극적으로 필자의 경우 문제는 인바운드 트래픽을 차단하는 방화벽뿐이었습니다.


0

Windows 용 Docker는 -p 포트 값을 설정하는 것과 함께 vpnkit을 사용하고 인바운드 트래픽이 내 호스트 컴퓨터의 방화벽에서 기본적으로 비활성화되어 있음을 발견했습니다. vpnkit에 대한 인바운드 TCP 규칙을 활성화 한 후 로컬 네트워크의 다른 컴퓨터에서 내 컨테이너에 액세스 할 수있었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.