[docker] 도커 컨테이너에서 호스트 포트에 액세스하는 방법

jenkins를 실행하는 도커 컨테이너가 있습니다. 빌드 프로세스의 일부로 호스트 시스템에서 로컬로 실행되는 웹 서버에 액세스해야합니다. 호스트 웹 서버 (포트에서 실행되도록 구성 할 수있는)가 jenkins 컨테이너에 노출 될 수있는 방법이 있습니까?

편집 : Linux 시스템에서 기본적으로 docker를 실행하고 있습니다.

최신 정보:

아래 @larsks 응답 외에도 호스트 컴퓨터에서 호스트 IP의 IP 주소를 얻으려면 다음을 수행하십시오.

ip addr show docker0 | grep -Po 'inet \K[\d.]+'



답변

Linux에서 Docker를 기본적으로 실행하는 경우 docker0인터페이스 의 IP 주소를 사용하여 호스트 서비스에 액세스 할 수 있습니다 . 컨테이너 내부에서 기본 경로가됩니다.

예를 들어, 내 시스템에서 :

$ ip addr show docker0
7: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::f4d2:49ff:fedd:28a0/64 scope link
       valid_lft forever preferred_lft forever

그리고 컨테이너 내부 :

# ip route show
default via 172.17.0.1 dev eth0
172.17.0.0/16 dev eth0  src 172.17.0.4

간단한 쉘 스크립트를 사용하여이 IP 주소를 추출하는 것은 매우 쉽습니다.

#!/bin/sh

hostip=$(ip route show | awk '/default/ {print $3}')
echo $hostip

iptablesDocker 컨테이너의 연결을 허용하기 위해 호스트 의 규칙 을 수정해야 할 수도 있습니다 . 이와 같은 것이 트릭을 수행합니다.

# iptables -A INPUT -i docker0 -j ACCEPT

이렇게하면 Docker 컨테이너에서 호스트의 모든 포트에 액세스 할 수 있습니다. 참고 :

  • iptables 규칙이 순서화되어 있으며이 규칙은 다른 규칙이 무엇인지에 따라 올바른 작업을 수행하거나 수행하지 않을 수 있습니다.

  • (a) 청취 중 INADDR_ANY(일명 0.0.0.0)이거나 명시 적으로 docker0인터페이스에서 청취중인 호스트 서비스에만 액세스 할 수 있습니다.


답변

macOS 및 Windows의 경우

Docker v 18.03 이상 (2018 년 3 월 21 일부터)

host.docker.internal내부 IP 주소를 사용하거나 호스트가 사용하는 내부 IP 주소로 해석되는 특수 DNS 이름에 연결 하십시오.

Linux 지원 보류 https://github.com/docker/for-linux/issues/264

이전 버전의 Docker가있는 MacOS

Mac 용 Docker v 17.12 ~ v 18.02

위와 동일하지만 docker.for.mac.host.internal대신 사용하십시오.

Mac 용 Docker v 17.06 ~ v 17.11

위와 동일하지만 docker.for.mac.localhost대신 사용하십시오.

Mac 17.05 이하용 Docker

도커 컨테이너에서 호스트 시스템에 액세스하려면 IP 별칭을 네트워크 인터페이스에 연결해야합니다. 원하는 IP를 바인딩 할 수 있으며 다른 IP에는 사용하지 않아야합니다.

sudo ifconfig lo0 alias 123.123.123.123/24

그런 다음 서버가 위에서 언급 한 IP 또는를 듣고 있는지 확인하십시오 0.0.0.0. 로컬 호스트에서 수신 대기 중이 127.0.0.1면 연결을 수락하지 않습니다.

그런 다음 도커 컨테이너를이 IP로 지정하면 호스트 시스템에 액세스 할 수 있습니다!

테스트하기 curl -X GET 123.123.123.123:3000위해 컨테이너 내부 와 같은 것을 실행할 수 있습니다 .

별칭은 재부팅 할 때마다 재설정되므로 필요한 경우 시작 스크립트를 작성하십시오.

솔루션 및 추가 문서 : https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds


답변

사용 --net="host"당신의 docker run다음 명령 localhost하여 고정 표시기 호스트를 가리 킵니다 당신의 고정 표시기 컨테이너에.


답변

docker-compose가있는 솔루션 : 호스트 기반 서비스에 액세스하려면 https://docs.docker.com/compose/compose-file/#network_modenetwork_mode 매개 변수
를 사용할 수 있습니다

version: '3'
services:
  jenkins:
    network_mode: host

편집 2020-04-27 : 로컬 개발 환경에서만 사용하는 것이 좋습니다.


답변

현재 Mac 및 Windows에서이 작업을 수행하는 가장 쉬운 방법은 host.docker.internal호스트 컴퓨터를 사용하는 호스트 를 사용하는 것입니다. 불행히도 아직 리눅스에서는 작동하지 않습니다 (2018 년 4 월 현재).


답변

https://github.com/qoomon/docker-host를 정확하게 수행하기위한 도커 컨테이너를 만들었습니다.

그런 다음 컨테이너 이름 dns를 사용하여 호스트 시스템에 액세스 할 수 있습니다.
curl http://dockerhost:9200


답변

이 모든 네트워킹 정크에 대한 더 간단한 해결책은 서비스에 도메인 소켓을 사용하는 것입니다. 어쨌든 호스트에 연결하려는 경우 소켓을 볼륨으로 마운트하기 만하면됩니다. postgresql의 경우 다음과 같이 간단했습니다.

docker run -v /var/run/postgresql:/var/run/postgresql

그런 다음 네트워크 대신 소켓을 사용하도록 데이터베이스 연결을 설정했습니다. 말 그대로 그 쉬운.