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
iptables
Docker 컨테이너의 연결을 허용하기 위해 호스트 의 규칙 을 수정해야 할 수도 있습니다 . 이와 같은 것이 트릭을 수행합니다.
# 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
그런 다음 네트워크 대신 소켓을 사용하도록 데이터베이스 연결을 설정했습니다. 말 그대로 그 쉬운.