Moby: 컨테이너에서 Docker 호스트에 연결하는 방법 문서화

에 만든 2013년 07월 05일  ·  263코멘트  ·  출처: moby/moby

컨테이너에서 도커 호스트를 연결하는 방법을 파악하는 데 문제가 있었습니다. 문서를 찾을 수 없지만 작동하는 172.16.42.1 사용에 대해 말하는 irc 로그를 찾았습니다.

이 동작과 docker0 와 관련된 방법이 문서화되어 있으면 좋을 것입니다.

가장 유용한 댓글

문제 제목에서 요구 사항이 명확하다고 생각합니다. 컨테이너에서 호스트와 통신하는 쉽고 잘 문서화된 방법이 필요하지만 구현되었습니다.

모든 263 댓글

network.go 내부를 보면 라우팅되지 않은 내부 네트워크에 대한 docker 프로브를 찾을 수 있습니다.

첫 번째 172.16.42.1은 브리지 주소로 추측되고 나머지는 브리지 주소로 추측됩니다.

따라서 이것을 문서화하는 것은 많은 도움이 되지 않습니다. 신뢰할 수 없는 동적 구성표입니다.

나는 당신이 필요로하는 것이 브리지 및 클라이언트에 사용되는 주소를 정의하는 더 많은 방법이라고 생각합니다.
그럴 수 있니?

문제 제목에서 요구 사항이 명확하다고 생각합니다. 컨테이너에서 호스트와 통신하는 쉽고 잘 문서화된 방법이 필요하지만 구현되었습니다.

+1 호스트 시스템에 연결하는 좋은 방법이 있으면 정말 좋을 것입니다.

+1, 1.0 분기는 각 컨테이너가 범위가 지정되고 제어된 방식으로 호스트와 상호 작용할 수 있도록 자체 검사 API를 정의합니다.
</s></s> 수있는
이것은 현재 0.8로 계획되어 있습니다.


@solomonstre
@getdocker

2013년 8월 8일 목요일 오후 1시 10분, EJ Bensing [email protected]
썼다:

+1 호스트 시스템에 연결하는 좋은 방법이 있으면 정말 좋을 것입니다.

이 이메일에 직접 답장하거나 GitHub에서 확인하세요.
https://github.com/dotcloud/docker/issues/1143#issuecomment -22351792

그렇다면 컨테이너 내에서 어떻게 도커 호스트에 연결할 수 있습니까? 컨테이너의 사설 IP가 아닌 호스트 포트를 통해 도커 컨테이너에 연결하려고 합니다.

@gerhard : 인트로스펙션 API는 0.8로 예정되어 있습니다. 한편, 컨테이너에서 Docker API에 액세스하려는 경우 Docker 브리지의 IP 주소에서 수신 대기하도록 Docker를 설정할 수 있습니다.

그렇게 하려면 다음을 수행합니다.

  • 다리를 만들다

ip link add docker0 type bridge

  • 그것에 IP 주소를 할당

ip link set docker0 up
ip addr add 172.17.0.1/16 dev docker0

  • 도커를 시작하고 API를 브리지에 바인딩

docker -d -H 172.17.0.1:4242

이제 컨테이너에서 Docker API에 액세스할 수 있습니다.

현재(버전 0.7) docker는 컨테이너 중 하나에 대한 자체 제어 소켓에 대한 무제한 액세스 권한 부여를 안정적으로 지원하지 않습니다. 이 스레드에서 설명하는 해결 방법은 작동이 보장되지 않는 해킹이며, 작동이 중단되면 언제든지 중단될 수 있습니다. 프로덕션에서 사용하거나 지원을 기대하지 마십시오. 문서화할 공식 기능이 없으므로 이 문서 문제를 수정할 수 없습니다.

누락된 기능에 대한 해킹 및 해결 방법을 논의하려면 _docker-user_ 메일링 리스트 또는 Freenode의 _#docker_ irc 채널을 추천합니다.

해피 해킹

@shykes 이 경우 그러한 기능의 생성을 추적하는 또 다른 문제가 있습니까?

그건 그렇고, 그러한 기능에 대한 동기를 부여하기 위해: 이것은 서버(과거에 vagrant를 사용했을 것입니다)를 로컬에서 테스트할 때 유용하고 컨테이너의 서버를 데이터베이스 또는 실행 중인 다른 서버에 연결하고 싶습니다. 내 개발 머신(도커 호스트).

나는 이미 이 기능의 가치에 매진했습니다 :)

2013년 12월 2일 월요일 오전 9시 9분, Caleb Spare [email protected]
썼다:

그건 그렇고, 그러한 기능에 대한 동기를 부여하기 위해: 이것은 서버(과거에 vagrant를 사용했을 것입니다)를 로컬에서 테스트할 때 유용하고 컨테이너의 서버를 데이터베이스 또는 실행 중인 다른 서버에 연결하고 싶습니다. 내 개발 머신(도커 호스트).

이 이메일에 직접 답장하거나 GitHub에서 확인하세요.
https://github.com/dotcloud/docker/issues/1143#issuecomment -29636528

저는 Docker 0.7.2가 설치된 Fedora 20에서 Docker UI 를 설정하고 있습니다. 방화벽이 차단하지 않도록 도커 데몬이 수신 대기하는 포트를 열어야 했습니다.

  • 방화벽 cmd --permanent --zone=신뢰할 수 있는 --add-interface=docker0
  • 방화벽 cmd --permanent --zone=trusted --add-port=4243/tcp

그 후 _docker-ui_는 도커 데몬 제어 소켓에 연결할 수 있었습니다.

HTH
이것은 그러한 기능에 대한 명확하고 합법적인 필요입니다.

실례지만, 만약 내가 다이 하드 스레드를 계속 유지하고 있다면.

이 문제의 제목은 "도커 컨테이너에서 호스트에 연결하는 방법"입니다.
이것이 docker inspect 기능과 어떤 관련이 있는지 모르겠습니다. 내가 틀리지 않은 경우 검사 기능은 호스트 측에서 컨테이너의 IP를 찾는 데 사용됩니다.

bkad의 문제는 컨테이너 내에서 호스트 IP를 찾는 것입니다. 나는 네트워킹 마법사가 아니지만 (컨테이너 내부에서) ip 게이트웨이가 호스트에 매핑된다고 가정하는 것은 상당히 안전하지 않습니다.
(브릿지 설정 등을 구성하지 않는다고 가정).

netstat -nr 0.0.0.0 에 대한 게이트웨이 사용 내 호스트 컴퓨터에서 실행 중인 서버에 도달하는 데 문제가 없었습니다. 게이트웨이 IP가 정적이라고 생각합니다(도커가 시작되면). 아무도 확인할 수 있습니까?

대안은 환경 변수를 사용하여 내 호스트 공용 IP를 컨테이너에 전달하는 것이지만 공용 IP는 고정되지 않을 수 있습니다. 호스트 이름은 프로덕션에서 더 잘 작동할 수 있지만 로컬에서는 사용하기 어렵습니다.

나는 여전히 루프백을 통해 도커 컨테이너에서 호스트로 호출하고 호스트에서 127.0.0.1 로 표시하는 방법을 선호합니다. 또는 보안이 우려되는 경우 항상 동일한 IP를 갖는 다른 루프백 장치입니다.
아니면 내가 찾은 것이 내 의사 소통을 대중에게 노출시키지 않습니까? 말했듯이 나는 네트워크 마법사가 아닙니다 :)
ip-gateway를 사용하여 docker 호스트를 호출하는 것이 "올바른 방법"인 경우 문서화할 수 없습니까?

/proc/net/route 컨테이너에서 게이트웨이 IP를 찾으려는 사람들에게는 아마도 그것을 읽을 수 있는 올바른 장소일 것입니다.

이 기능에 대한 동기 부여 에는 다양한 메타 데이터 서비스가 포함됩니다. ec2 메타 데이터 서비스에서 무언가를 노출하는 것이 좋을 것입니다. 환경 변수에 맞지 않는 자격 증명 및 보다 복잡한 구조화된 데이터 배포.

@jonasfj : Docker가 호스트에서 컨테이너로 파일을 바인드 마운트하는 것을 지원하므로 실제로 더 쉬운 방법이 있습니다. Docker 제어 소켓을 바인딩 마운트할 수 있습니다. 예: docker run -v /var/run/docker.sock:/var/run/docker.sock … ; 이것은 네트워킹 규칙을 만지작거리는 것보다 쉽습니다.

도커 소켓이 어떻게 도움이 되는지 잘 모르겠습니다. 여전히 문제를 다시 열어야 한다고 생각하지만 다음 시나리오에 대한 문서는 없습니다.

1) '호스트'에서 서비스는 포트 8080(예: 'etcd')에서 실행됩니다.
2) 해당 호스트에서 도커 컨테이너가 시작됩니다.
3) 도커 컨테이너에서 호스트의 포트 8080에 있는 서비스에 어떻게 도달할 수 있습니까? URL/IP는 무엇입니까?

@jpetazzo 위의 문제를 해결하기 위해 docker.sock을 설정하는 방법은 무엇입니까?

@vrvolle , docker.sock 노출은 @bkad에서 설명한 원래 문제를 해결하지 못합니다.
그러나 호스트와 도커 컨테이너 간의 통신을 위해 다른 유닉스 도메인 소켓을 노출합니다.

예를 들어 호스트에서 mysql을 노출하려면 mysql 소켓을 노출합니다. /tmp/mysql.sock .

또는 컨테이너가 호스트에 다양한 유용한 정보를 쿼리할 수 있는 메타데이터 API가 있는 경우 고유한 유닉스 도메인 소켓을 만들어 컨테이너에 노출합니다. 유닉스 도메인 소켓을 통한 HTTP는 매우 잘 작동합니다. 또한 모든 네트워크 구성 문제와 보안 문제가 있는 것은 아닙니다.

'유닉스 도메인 소켓'을 읽어야 했습니다.
하지만:

http://stackoverflow.com/questions/14771172/http-over-af-unix-http-connection-to-unix-socket

URL이 없다고 주장하므로 일반 클라이언트는 즉시 해당 메커니즘을 사용할 수 없습니다.

반면에:

http://stackoverflow.com/questions/14771172/http-over-af-unix-http-connection-to-unix-socket

어떻게 든 그러한 소켓을 사용할 수 있음을 보여줍니다.

그러나 여전히 나는 도커 내부의 프로그램이 간단히 사용할 수 있는 IP 주소와 포트를 가질 수 있기를 원합니다. 나는 -- 지금은 -- 사용할 것이다

 netstat -nr | grep '^0\.0\.0\.0' | awk '{print $2}'

새 문제를 만들어야 합니까 아니면 누군가가 이 문제를 다시 열 수 있습니까?

@vrvolle
나는 네트워킹 사람이 아니지만 유닉스 소켓을 통해 localhost를 컨테이너로 프록시하고 컨테이너 프록시 유닉스 소켓 내부에서 컨테이너 localhost(루프백 장치)로 프록시하는 몇 가지 트릭이 있다고 상상 합니다.

그 방법을 문서화하는 것이 좋을 것입니다. 하지만 도커가 적극적으로 지원해야 하는 기능은 아닌 것 같습니다.

정확히 달성하고자 하는 바에 따라 이를 해결하는 여러 가지 방법이 있습니다.

호스트에서 실행되는 서비스(예: 호스트에서 직접 실행되는 API 또는 데이터베이스와 같은 모든 종류의 서비스)에 연결하려면 호스트의 IP 주소를 알아야 합니다.

한 가지 방법은 컨테이너의 기본 게이트웨이가 되는 Docker 브리지의 주소를 통해 Docker 호스트에 연결할 수 있다는 사실에 의존하는 것입니다. 즉, ip route ls | grep ^default 의 영리한 구문 분석이 이 경우에 필요한 전부일 수 있습니다. 물론 향후 변경될 수 있는 구현 세부 정보(기본 게이트웨이는 Docker 호스트의 IP 주소임)에 의존합니다.

또 다른 방법은 Docker API를 사용하여 해당 정보를 검색하는 것입니다. 그런 다음 문제는 "컨테이너에서 Docker API에 어떻게 연결합니까?"가 되고, 잠재적인 솔루션(많은 컨테이너가 사용합니다!)은 호스트에서 /var/run/docker.sock 를 바인딩 마운트하는 것입니다. 컨테이너. 이것은 큰 단점이 있습니다. API는 컨테이너에서 완전히 사용할 수 있게 되어 좋지 않은 일을 할 수 있습니다.

장기적으로 Docker는 컨테이너에 너무 많은 권한을 부여하지 않고 해당 정보에 액세스할 수 있도록 하여 더 나은 내부 검사 API를 제공합니다.

TL,DR: 단기적으로 컨테이너의 기본 경로를 확인합니다. 장기적으로 멋진 인트로스펙션 API가 있을 것입니다.

나는 또한 upstart로 인해 문제가 있습니다. /var/run/docker.sock에서 아무것도 찾을 수 없습니다. "-v /etc/run/docker.sock:/etc/run/docker.sock" 명령을 사용했지만 아무 일도 일어나지 않았습니다.
커널 기능에 대한 몇 가지 새로운 업데이트로 인한 문제라고 생각합니다. 이 문제에 대해 간략히 알려주세요. 이 문제를 해결하기 위한 전체 명령. 감사 해요

사용 -v /var/run/docker.sock - /etc가 아닙니다(일반적으로 conf 파일용으로 예약됨).

새로운 1.0.0 릴리스에서 이에 대한 업데이트가 있습니까?

nsenter가 있지만 권장되는 방법은 sshd를 실행하는 것입니다.
단계.

2014년 6월 13일 금요일에 Camilo Aguilar [email protected] 은 다음과 같이 썼습니다.

새로운 1.0.0 릴리스에서 이에 대한 소식이 있습니까?


이 이메일에 직접 답장하거나 GitHub에서 확인하세요.
https://github.com/dotcloud/docker/issues/1143#issuecomment -45958769.

마이클 D 닐
홈: www.michaelneale.net
블로그: michaelneale.blogspot.com

vrvolle, 감사합니다. 우리 같은 많은 사람들이 이와 같은 작은 정보를 찾고 있습니다.

netstat -nr | grep '^0\.0\.0\.0' | awk '{print $2}'

Docker는 호스트 IP(예: 172.17.42.1 )가 있는 모든 컨테이너에서 /etc/hosts 를 자동 업데이트하고 이를 dockerhost #$와 같이 호출하면 편리한 수정이 될 것입니다.
지금은 netstat -nr | grep '^0\.0\.0\.0' | awk '{print $2}' 에 갇혀 있는 것 같습니다.

/etc/hosts dockerhost 에 대해 +1

/etc/hosts의 dockerhost에 대한 +1, 좋은 생각처럼 들립니다.

특별히 인수나 플래그를 지정하지 않는 한 이미지의 파일을 편집하면 안 됩니다. 또한 이미지의 100%가 LSB를 따를 필요는 없으므로 /etc 디렉토리가 없을 수도 있습니다. 호스트 IP를 포함하는 데 사용할 파일 이름도 명령 인수로 지정해야 합니다.

docker --host /etc/hosts

/etc/hosts의 dockerhost에 대해 +1

/ec/hosts 항목의 경우 +1

@Sepero docker는 이미 연결된 컨테이너로 /etc/hosts를 채우고 있으므로 인수가 실제로 유지되지 않습니다.

@matleh 그건 사실이지만 올바른 방법은 /etc/hosts를 직접 채우지 않거나 최소한 위치가 없을 경우에 대비하여 위치를 지정하도록 남겨두는 것이 아니라고 생각합니다.

어쨌든 호스트의 dockerhost 항목.

또한 /etc/hosts 에 도커 호스트 IP를 갖고 싶습니다.

/etc/hosts의 도커 호스트 IP에서 +1

호스트의 네트워크 서비스에 대한 액세스를 용이하게 하는 더 좋은 방법은 포트를 역방향으로, 즉 컨테이너에서 호스트로 전달하는 iptables 항목을 쉽게 설정할 수 있도록 하는 것입니다. -p 또는 --publish 옵션은 반대 효과가 있는 -s 또는 --subscribe 옵션으로 멋지게 보완될 것이라고 생각합니다. 나는 그것들을 --forward 및 --reverse라고 불렀을 것이라고 생각합니다. 당신이 그것을 무엇이라고 부르든 이것은 여기의 다른 제안보다 훨씬 더 일관된 접근 방식인 것 같습니다.

이것은 명백할 수 있지만 현재 작동하고 구현에 덜 의존하는 간단한 방법은 컨테이너를 시작하기 전에 호스트의 IP 주소를 결정하고 컨테이너에 환경 변수를 적절하게 설정하는 것입니다. 다음 라인을 따라:

#!/bin/bash
HOSTNAME=$(hostname)
HOST_IP=$(ip route | awk '/docker/ { print $NF }')
docker run -e HOST=$HOSTNAME -e HOST_PORT=tcp://$HOST_IP:8000 mycontainer

이것은 본질적으로 --link 작동 방식과 유사합니다. 여전히 /docker/ 와 일치하는 이름을 가진 브리지에 의존하고 그러한 브리지가 하나만 있지만 브리지는 도커 데몬이 시작될 때 설정됩니다. docker info 가 사용 중인 브리지 이름 및/또는 호스트 IP 주소를 제공하면 좋을 것입니다. 또 다른 생각은 --link-host PORT 옵션을 docker run 에 추가하는 것입니다. 이는 본질적으로 위의 작업을 수행합니다.

IMO 이것이 최선의 선택입니다. --link-host 를 사용하면 컨테이너는 액세스하는 서비스가 호스트에 있는지 아니면 다른 컨테이너에 있는지 알 필요가 없습니다.

다른 사람들이 컨테이너를 어떻게 호출하는지 잘 모르겠지만 --net=host 로 컨테이너를 실행하면 내 도커 호스트와 동일한 네트워킹 설정을 볼 수 있습니다. 이 스위치가 없으면 docker-run 매뉴얼 페이지에 설명된 대로 독립 실행형 네트워크 스택을 얻게 됩니다.

$ docker run -i --net=host fedora ip route ls
default via 10.0.2.2 dev eth0  metric 1
10.0.2.0/24 dev eth0  proto kernel  scope link  src 10.0.2.15
127.0.0.1 dev lo  scope link
172.17.0.0/16 dev docker0  proto kernel  scope link  src 172.17.42.1
192.168.59.0/24 dev eth1  proto kernel  scope link  src 192.168.59.103

스위치 없이 실행하면 다음이 생성됩니다.

$ docker run -i fedora ip route ls
default via 172.17.42.1 dev eth0
172.17.0.0/16 dev eth0  proto kernel  scope link  src 172.17.0.4

우리가 찾고 있는 것은 10.0.2.15(내 docker 호스트의 eth0 i/f의 IP) 또는 172.17.42.1(내 docker의 docker0 브리지 i/f의 IP)의 IP 주소를 얻는 방법입니다.

내 컨테이너 /etc/hosts 파일에 일부 호스트를 추가하는 접근 방식은 특별히 신경 쓰지 않습니다. 이 정보를 내부적으로 노출하여 필요할 때 가져올 수 있도록 하는 것이 여기로 가는 더 신중한 방법인 것 같습니다.

--link-host 또는 기타 직관적인 방법으로 +1

/etc/hosts 항목의 경우 +1
꽤 편리해 보이며 현재의 통신 규칙을 따릅니다.

내 이전 의견을 명확히 하자면 --link <container>:<alias> 의 장점은 _alias_를 통해 _service_를 노출한다는 것입니다. 마찬가지로 호스트를 컨테이너에 노출하는 메커니즘은 IP 주소뿐만 아니라 특정 서비스에 대한 액세스를 제공해야 합니다. 컨테이너는 별칭을 통해 해당 서비스에 액세스합니다. 서비스가 실제로 어디에 있는지 알 필요가 없습니다. 옵션은 -p 의 반대 의미를 가져야 하고 --link 처럼 작동해야 합니다. 즉, --link-host <ip address>:<port>:<alias> 는 환경 변수와 /etc/hosts 항목을 설정하고 필요에 따라 iptables 항목을 설정합니다. 즉, 호스트의 서비스가 액세스할 수 없는 IP 주소에서 수신 대기하는 경우 컨테이너에.

@altaurog 이런 건 어때요?

docker run --name someservice -d host-exposing-image --expose 8000

someservice--link 로 지정할 수 있는 모든 이름이고 host-exposing-image 는 노출된 포트의 호스트 포트를 전달하는 특수 이미지입니다. 아마도 호스트의 /var/run/docker.sock 를 이미지와 공유하여 아이디어를 구현할 수 있을 것입니다.

아마도 이와 같은 것이 이미 존재합니다.

편집하다:

docker run --name someservice -d --expose 8000 host-exposing-image

위의 사항을 잊어버리고 여기의 모든 주석을 읽지 않았습니다(아직 읽지 않았습니다). 이것은 docker-osx에서 작동하는 것입니다(대신 메일링 리스트에 게시하지 않아 죄송합니다).

docker run --rm -ti -e HOST_IP="$(docker-osx ssh -c 'route -n' 2> /dev/null |
  awk '/^0.0/ { print $2 }')" debian:jessie

+1. --link-host/etc/hostsdockerhost 항목이 있는 것 뿐만 아니라 좋은 생각입니다.

이 문제가 종료되었지만(해결되지는 않음) 새 문제를 만들었습니다. #8395

dockerhost 또는 기타 편리한 방법에 대해 +1합니다.

편리한 방법으로 +1

dockerhost 접근 방식이 여기에서 약간의 표를 얻었으므로 이러한 호스트 항목을 갖는 가장 쉬운 방법은 --add-host=dockerhost:$(ip route | awk '/docker0/ { print $NF }') 인수를 추가하는 것입니다. 이미지를 실행할 때, 예:

run --add-host=dockerhost:$(ip route | awk '/docker0/ { print $NF }')  ubuntu ping -c2 dockerhost

이것은 필수 /etc/hosts 항목을 추가하지만 dockerhost 이 기본적으로 거기에 없다는 것은 여전히 ​​부끄러운 일입니다. 이미지를 배포할 때 다음 중 하나를 선택할 수 있습니다.

  • 사용자에게 위의 매개변수를 추가하도록 지시합니다.
  • 라우팅 테이블을 기반으로 구성 파일을 조정하는 일부 스크립트를 컨테이너에서 실행하도록 만듭니다.

개인적으로 dockerhost 가 기본적으로 존재하지 않는 이유를 개인적으로 이해하지 못합니다. 일반적으로 호스트(XServer, CUPS, Puleaudio)의 서비스에 액세스하는 이미지의 생성 및 배포를 훨씬 더 편리하게 만들 것입니다.

도커 호스트의 경우 +1. 나는 실제로 이것을 env var, /etc/hosts 항목 및 cli 플래그로 모두 노출할 것입니다. 여러모로 쓰일 수밖에 없습니다.

:+1: 도커호스트용

컨테이너 내부:

cat << EOF > /etc/profile.d/dockerhost.sh
 grep dockerhost /etc/hosts || echo $(ip r ls | grep ^default | cut -d" " -f3) dockerhost >> /etc/hosts
EOF

로그인할 때마다 나를 위해 작동합니다(루트 계정 사용).

도커 호스트의 경우 +1

도커 호스트의 경우 +1

도커 호스트의 경우 +1

도커 호스트의 경우 +1

dockerhost에 대해 +1:yum:

도커 호스트의 경우 +1

도커호스트의 경우 +1:+1:

이 스크립트를 작성하고 나면 누군가 유용하다고 생각할 수 있습니다.

#!/bin/bash

SED="$(which sed)"
NETSTAT="$(which netstat)"
GREP="$(which grep)"
AWK="$(which awk)"
CAT="$(which cat)"


$SED '/dockerhost$/d' /etc/hosts > /etc/hosts.tmp
DOCKERHOST="$($NETSTAT -nr | $GREP '^0\.0\.0\.0' | $AWK '{print $2}')"

echo "$DOCKERHOST dockerhost" >> /etc/hosts.tmp

$CAT /etc/hosts.tmp > /etc/hosts

rm -rf /etc/hosts.tmp

+1 도커 호스트

이 주제에 상당한 관심이 있기 때문에 비공개 티켓을 논의하는 대신 새 기능 요청을 여는 것이 합리적이라고 생각합니다.

나는 얼마 전에 https://github.com/docker/docker/issues/8395 를 열었습니다 -- 역시 닫혔습니다. 여전히 문서화된 솔루션 없음

좋아, 해결 방법이 있지만 주된 이유는 아마도 호스트에 액세스하는 것이 부분적으로 격리된 사용 사례이기 때문일 것입니다.

도커 링크 기능이 있으므로 호스트에 대한 링크를 제공할 수 있는 것이 합리적입니다.

아마도 https://github.com/docker/docker/pull/10902 가 그것을 해결할 것입니다.

여보세요!

참고로 이것은 이제 문서화 되었습니다.

참고: 때때로 Docker 호스트에 연결해야 합니다. 즉, 호스트의 IP 주소를 가져와야 합니다. 다음 셸 명령을 사용하여 이 프로세스를 단순화할 수 있습니다.

$ alias hostip="ip route show 0.0.0.0/0 | grep -Eo 'via \S+' | awk '{ print \$2 }'"
$ docker run --add-host=docker:$(hostip) --rm -it debian

@icecrime 감사합니다.

사람들이 업데이트를 중지하도록 도커 사용자가 이 문제를 잠글 수 있습니까?

도커 호스트의 경우 +1

dockerhost의 경우 +1 - 로컬 명령 별칭 hostip을 실행해야 하는 것은 docker-compose, docker-swarm 등과 호환되지 않습니다.

도커 호스트의 경우 +1

@icecrime 내 우분투의 호스트 IP가 아닌 호스트 게이트웨이를 제공합니다. 아래 명령어만 있으면 되는거 아닌가요?

$ ip address show

+1, 명령을 실행하지 않고도 사용할 수 있는 것이 이상적입니다.

이것이 어떻게 아직 해결되지 않았습니까? 컨테이너에서 호스트 네트워킹 기능을 만들기 위해 명령을 실행하는 것은 완전히 허용되지 않습니다.

간단한 것 +1
BTW ip 를 사용한 해결 방법은 Ubuntu에서 작동하지만 OS X에서는 작동하지 않습니까?

+1 이것은 2년 된 문제이며 유용한 기능입니다. 컨테이너 내부에서 도커 원격 API에 연결하는 쉬운 방법을 원합니다.

@ianchildress 데몬이 소켓 연결을 허용하도록 구성되어 있으면 소켓을 컨테이너에 바인딩하기만 하면 됩니다(예: docker run -d -v /var/run/docker.sock:/var/run/docker.sock myimage ).

도커 호스트의 경우 +1
사용 사례에 대한 솔루션을 탐색할 때 이 문제 발견: xdebug.remote_host=dockerhost

도커 호스트의 경우 +1

@thaJeztah 및 거기에서 호스트 이름 또는 IP 주소를 얻으려면 어떻게 해야 합니까?

@mbonaci 나는 컨테이너 내부의 Docker API에 연결하려는 @ianchildress 에 응답했습니다(소켓 연결을 사용하는 것이 일반적인 접근 방식임)

혼란스러워요. 위의 @icecrime 은 이것이 이제 문서화되었지만 그가 준 링크는 죽었다고 위에서 말했습니다. 문서에서 인용된 부분을 빨리 찾을 수 없습니다. apt-cache-ng 예제는 dockerhost를 사용하지만 그것이 무엇인지 정의하지는 않습니다(#11556). 내가 쉽게 찾을 수 있는 유일한 참조는 이 스레드였습니다. docker의 소스와 문서를 모두 검색했는데 이 컨텍스트에서 언급되지 않은 것 같습니다 .

@pwaller 3월부터 그 방대한 문서를 별도의 참조로 분할했습니다. 이 자료의 새 위치는 다음과 같습니다.

http://docs.docker.com/reference/commandline/run/#adding -entries-to-a-container-hosts-file

도커 호스트의 경우 +1

@moxiegirl --add-host param이 만족스럽다고 생각합니다. 감사 해요

그리고 도커 컨테이너에서 호스트에 연결하는 방법은 무엇입니까? 예를 들어 git pull을 만들기 위해? 볼륨 없이 사용?

@a93ushakov @moxiegirl 이 제공한 링크에 모두 설명되어 있습니다.
docker run 를 수행할 때 --add-host=dockerhost:replace_with_docker_host_ip 매개변수를 추가하면 컨테이너의 /etc/hosts 파일에 항목이 생성됩니다.
물론 dockerhost 라는 이름을 사용하여 해당 컨테이너 내에서 도커 호스트를 참조할 수 있음을 의미합니다.

@mbonaci > 물론 dockerhost라는 이름을 사용하여 해당 컨테이너 내에서 도커 호스트를 참조할 수 있음을 의미합니다.

SSH를 통해?

@thaJeztah > 소켓 연결을 허용하도록 구성된 데몬이 있는 경우 ...
이 작업을 수행하는 방법?

@a93ushakov SSH: 호스트에 설치 및 실행 중이고 해당 포트가 차단되지 않은 경우 예.

@a93ushakov @thaJeztah 는 Unix 소켓 연결을 나타냅니다. 나는 그것이 기본값이라고 생각합니다 - 호스트에 /var/run/docker.sock 파일이 있는지 확인하십시오.

도커 호스트의 경우 +1

도커 호스트의 경우 +1

도커 호스트의 경우 +1

도커 호스트의 경우 +1
추가 단계 없이 이 호스트 이름을 얻는 것이 좋습니다.

도커호스트용 1개

dockerhost 에 대해 +1

컨테이너 내부에서 도커 호스트에 연결할 수 없는 것 같습니다. 내가 뭘 잘못하고 있는지 아이디어가 있습니까?

$ hostip=$(ip route show 0.0.0.0/0 | grep -Eo 'via \S+' | awk '{ print $2 }')
$ nc -l -p 1234 &
[1] 17361
$ docker run --add-host=docker:$(hostip) --rm -it hiromasaono/curl curl docker:1234
curl: (7) Failed to connect to docker port 1234: Connection refused

도커 호스트의 경우 +1

Docker 브리지의 IP를 추가하면 작동합니다.

먼저 netcat으로 포트 1234에서 수신 대기

$ nc -l -p 1234

브리지의 IP 가져오기

$ ifconfig docker0 | grep 'inet addr'
          inet addr:172.17.42.1  Bcast:0.0.0.0  Mask:255.255.0.0

그런 다음 연결

$ docker run --add-host=docker:172.17.42.1 --rm -it hiromasaono/curl curl 172.17.42.1:1234

그럼 반응이 보이네요

GET / HTTP/1.1
User-Agent: curl/7.35.0
Host: 172.17.42.1:1234
Accept: */*

도커 호스트의 경우 +1
젠장, 언제?

Mac에서도 작동하는 dockerhost의 경우 +1, 즉 VM을 투명하게 처리

컨테이너 내부에서 Docker API를 어떻게 호출하는지 알려주실 수 있나요? 나는 리눅스 사람이 아닙니다. 이미 -v /var/run/docker.sock:/var/run/docker.sock 으로 컨테이너를 시작했습니다.
모두가 마운트하는 방법에 대해 이야기하고 있지만 아무도 내부에서 api를 호출하는 방법에 대해 언급하지 않았습니다.

curl을 사용하여 전화를 시도했지만 작동하지 않았습니다. 예를 들어 호스트 IP를 사용했습니다.

컬 -XGET http://hostip :2375/images/json

이것이 내가 데몬을 시작한 방법입니다. 즉 도커 -H unix:///var/run/docker.sock -H tcp://0.0.0.0 :2375

도움을 주시면 대단히 감사하겠습니다.

@jprogn github 문제 추적기는 일반적인 지원 질문을 위한 것이 아닙니다. #docker IRC 채널, Google의 docker-users 그룹 또는 forums.docker.com에서 이러한 질문을 하는 것이 좋습니다.

이 질문은 완전히 답변되지 않은 원래 주제와 관련이 있습니다. 위의 제목을 봐주세요

컨테이너에서 내부에 docker api를 호출하는 방법에 대해 답변해 주시겠습니까????????????????

@jprogn 위의 내 의견을 따르십시오. 이것은 버그 및 기능 요청을 추적하는 데 사용되는 문제 추적기입니다. docker 사용에 대한 지원 포럼이 아닙니다. 위에서 언급 한 다른 방법을 사용하십시오. https://github.com/docker/docker/issues/1143#issuecomment -146924892

도커 호스트의 경우 +1

내 CentOS7 도커 호스트에서 컨테이너에서 호스트로의 경로를 얻을 수 없습니다.

[root@docker-host-fkb slehmann]# ifconfig docker0 | grep 'inet'

inet 172.17.42.1  netmask 255.255.0.0  broadcast 0.0.0.0
inet6 fe80::42:a7ff:fe4d:4cb2  prefixlen 64  scopeid 0x20<link>


[root@docker-host-fkb slehmann]# docker run --add-host=docker:172.17.42.1 --rm -it hiromasaono/curl curl 172.17.42.1:1234

curl: (7) Failed to connect to 172.17.42.1 port 1234: No route to host

어떤 아이디어?

+1, 이를 위한 환경 변수가 있을 수 있습니다.

나는 그 반대의 경우를 원한다. 내 호스트 컴퓨터에서 이름으로 도커 컨테이너로의 링크

dockerhost 환경 변수의 경우 +1

172.17.42.1을 하드 코딩하지 않고 호스트에 액세스하는 맞춤형 dns 항목을 결합하는 것은 정말 까다롭습니다. 예

extra_hosts:
     - "docker:172.17.42.1"

dockerhost의 경우 +1(ENV의 /etc/host)

+1 이것은 여전히 ​​필요합니다!

모든 프로젝트에 ip route list dev eth0 | grep -Eo 'via \S+' | awk '{ print \$2 }' 를 추가하기 때문에 내 +1도 마찬가지입니다(dev에서는 모든 프로젝트가 동일한 호스트에 있고 서로를 호출할 수 있어야 함).

Docker Swarm과 같은 클러스터에서 이 문제를 어떻게 해결합니까? 실행할 때 컨테이너가 할당될 시스템을 알 수 없습니다. docker0 게이트웨이 IP는 Swarm 클러스터 내에서 호스트마다 다를 수 있으므로 한 호스트에서 ip route 명령을 실행한 다음 모든 호스트에서 IP가 동일하다고 가정할 수 없습니다.

또한 docker0 브리지의 IP가 무엇인지 알 필요 없이 컨테이너 포트를 docker0 브리지의 포트에 매핑하는 기능을 원합니다. 이 같은:

eval $(docker-machine env --swarm swarm-master-node)
docker run -d -p "$HOST_GATEWAY_IP:80:80" my-image

$HOST_GATEWAY_IP 는 컨테이너가 궁극적으로 클러스터에 배포되는 호스트에서 ip route 명령을 실행하여 얻을 수 있는 것과 동일한 IP로 대체됩니다.

이는 IP를 포함하는 다른 모든 명령(예: docker run--dns 옵션)에 대해 지원되어야 합니다.

이 명령이 더 쉽다는 것을 알았습니다.

ip ro | grep docker | sed 's|.* \(\([0-9]\+\(.[0-9]\+\)\{3\}\)\)\s*|\1|'

/etc/hosts의 dockerhost에 대해 +1

+1 도커 호스트

/etc/hosts에 dockerhost가 있는 경우 +1

도커호스트의 경우 +1000

+1 도커 호스트

+1

+1 이상.

컨테이너에서 웹 서버를 실행 중이며 호스트에서 실행 중인 mysql에 연결해야 합니다.
호스트의 ip는 dhcp로 변경되므로 동적 인 것이 필수입니다.

@wederbrand 다른 접근 방식(아마도 더 나은 성능)은 예를 들어 mysql 소켓에 연결하는 것입니다.

docker run -v /var/lib/mysql/mysql.sock:/mysql.sock mywebapp

그러면 컨테이너 내에서 MySQL 소켓을 /mysql.sock 로 사용할 수 있습니다.

@thaJeztah 그것은 옵션이 될 수 있습니다. 그러나 내가 사용하는 도커 이미지는 mysql 서버가 원격 서버에 있고 이미지에 데이터베이스에 대한 host:port 구성이 있는 다른 환경에서도 사용됩니다.

내 컨테이너가 프로덕션 환경에 최대한 가깝게 작동하기를 원하므로 호스트와 포트를 설정하는 것 외에는 연결 속성을 수정하지 마십시오.

+1

+1

+1

+1

@peterbollen @radek1st @BradRuderman @aldarund @wederbrand @pataiadam @jllado @geniousphp @coreylenertz @dgtlmoon @xlight (2015년 12월에만 +1)
_this_ 문제는 #8395 뿐만 아니라 종료되었습니다.
나는 오래된 문제에 +1을 추가하는 것이 도움이 될 것이라고 생각하지 않습니다. 새 것을 생성하거나(#8395로 수행) 이 문제를 해결하기 위해 다른 경로를 시도하십시오.

고마워!

+1

+1 도커 호스트

도커 호스트의 경우 +1

도커 호스트의 경우 +1

dockerhost에 대해 +1, 자...

도커 호스트의 경우 +1

docker-compose를 사용하고 무리에서 n-ary 컨테이너를 확장하는 것은 자연스럽게 모든 시스템에서 즉시 노드 IP 주소 조회를 수행하는 수단을 제공하지 않습니다.

이것은 위에서 언급하고 게이트웨이로 수정된 것처럼 옵션이 아닙니다.

extra_hosts:
     - "docker:172.18.0.1"

👍 도커호스트도...

도커 호스트의 경우 +1

+1

+1

+1

+1 도커 호스트

+1 도커 호스트

+1 도커 호스트

도커 호스트의 경우 +1

도커 호스트의 경우 +1

도커 호스트의 경우 +1.
이 문제가 종료되었으므로 새 티켓을 여는 중입니다.

+1

+1

docker-machine 설정에서 호스트를 가져오려면 다음 명령을 사용할 수 있습니다.

docker-machine ssh "${DOCKER_MACHINE_NAME}" 'echo ${SSH_CONNECTION%% *}'

ssh 를 통해 연결하는 시스템을 보고하므로 도중에 NAT가 없는 한 로컬 시스템과 원격 시스템 모두에서 합리적으로 잘 작동해야 합니다. 기술적으로 가능하다면 docker-machine inspect 에서도 이 값을 어딘가에 보고하는 것이 좋을 것입니다.

+1

+1 dockerhost . 구현하려는 노력이 거의 필요 없는 귀중한 기능처럼 들립니다.

지금은 제어하는 ​​이미지에서 만든 컨테이너 내에서 dockerhost에 액세스해야 하는 경우 이 요점을 이미지의 entrypoint.sh 스크립트에 추가할 수 있습니다. https://gist.github.com/dimitrovs/493678fd86c7cdf0c88312d9ddb4906b

또는 이미지가 진입점으로 셸 스크립트를 사용하지 않는 경우 /etc/rc.local에 추가할 수 있습니다. 이 요지는 /etc/hosts에서 dockerhost 를 확인하고 없는 경우 추가하는 것입니다. 컨테이너가 시작될 때마다 발생해야 합니다.

/proc/net/route에서 게이트웨이 IP를 가져옵니다.

export ipaddr=$(printf "%d." $(
  echo $(awk '$2 == "00000000" {print $3}' /proc/net/route) | sed 's/../0x& /g' | tr ' ' '\n' | tac
  ) | sed 's/\.$/\n/')

@dimitrovs 예제 구성을 보여줄 수 있습니까? 나는 그 주위를 땜질했고 올바른 결과를 얻을 수 없었습니다.

@amcdnl 은 어떤 결과를 얻었습니까? 내가 링크한 요점을 entrypoint.sh 파일에 넣어 컨테이너가 시작될 때마다 실행되도록 하거나 컨테이너 내부의 /etc/rc.local에서 실행할 수 있습니다. 이미지를 빌드할 때 이 작업을 수행해야 하지만 스크립트 자체는 컨테이너가 시작될 때 실행됩니다.

도커 호스트의 경우 +1

@dimitrovs 결국 런타임에 작성을 생성하는 스크립트를 작성하게 되었습니다.

StartDocker.sh

#!/bin/bash
built_docker_file="docker-compose.dev.built.yml"

rm -rf docker-compose.dev.built.yml
localhost_ip="$(ifconfig en0 inet | grep "inet " | awk -F'[: ]+' '{ print $2 }')"
sed -e "s/\${localhost}/$localhost_ip/" docker-compose.dev.template.yml > $built_docker_file

docker-compose -f $built_docker_file build
docker-compose -f $built_docker_file up

docker-compose.dev.template.yml

version: '2'

services:
  nginx:
    container_name: sw_nginx
    image: nginx:latest
    ports:
      - 80:80
    links:
     - search
    volumes:
      - ./Web/wwwroot:/var/www/public
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
    extra_hosts:
      - "dockerhost:${localhost}"

@amcdnl 좋은 해결 방법입니다. docker-compose 는 (환경) 변수 대체 를 지원합니다.

예를 들어 (배쉬):

$ export localhost=$(...)
$ docker-compose (...)

@sebastiannm 내 제안은 도커 이미지 내부에서 실행되기 때문에 호스트와 독립적이어야 하지만 VirtualBox의 Mac에서 실행하는 경우 얻을 IP는 Mac IP가 아니라 VirtualBox VM의 IP입니다. 이것이 우리가 논의하는 요구 사항이라고 생각합니다. 도커 인스턴스 내부에서 Mac IP를 알고 싶다면 다른 접근 방식이 필요합니다.

도커 호스트의 경우 +1.

그러나 지금은 위에 게시된 것과 유사한 해킹을 수행하여 Linux와 OSX에서 모두 작동 하는 간단한 스크립트로 호스트 IP 주소를 동적으로 얻을 수 있습니다. http://stackoverflow.com/questions/24319662/from-inside -of-a-docker-container-how-do-i-connect-to-the-localhost-of-the-mach#38753971

도커 호스트의 경우 +1.

도커 호스트의 경우 +1

+1+1 도커호스트

도커 호스트의 경우 +1

도커 호스트의 경우 +1

도커 호스트의 경우 +1

이 문제에서 논의된 다양한 기술을 통해 --net=bridge (기본값)일 때 도커 컨테이너 내에서 기본 호스트 netcat 서버에 연결할 수 없습니다.

@frankscholten 성공적인 netcat 테스트를 재현할 수 없습니다

정확한 문제를 설명하는 stackoverflow 문제를 만들었습니다. http://stackoverflow.com/questions/38936738/communicate-to-docker-host-from-docker-container
미래에 누군가를 도울 경우를 대비하여 여기에 게시하고 싶었습니다.

이 모든 것이 브리지 모드에서 docker0 ip를 사용하여 컨테이너에서 호스트로 통신하는 것에 대해 이야기하는 동안 컨테이너가 호스트의 공용 IP(예: 원래 eth0 ip)와도 통신할 수 있는지 알고 싶습니다. 답장을 보내 주셔서 감사합니다. 나는 이것에 성공하지 못했다.

@sburnwal 왜 호스트의 eth0 IP와 통신할 수 없는지 모르겠습니다. 컨테이너는 기본 게이트웨이(docker0)로 요청을 보내고 호스트는 IP가 있다는 것을 알고 있기 때문에 더 이상 전달하지 않고 응답해야 합니다. 컨테이너에서 eth0 IP에 대한 핑이 시간 초과되었거나 호스트에 대한 경로가 없거나 무슨 일이 일어나고 있습니까? 컨테이너를 인터넷에 연결할 수 있습니까?

불행히도 이것은 나를 위해 작동하지 않습니다. 호스트에서 컨테이너 IP를 ping할 수 있지만 컨테이너에서 호스트(호스트의 LAN/eth0) IP를 ping할 수 없습니다. 도커 1.9.1을 사용하고 있습니다. 호스트의 eth0 IP에서만 수신 대기하는 웹 서버와 통신하기 위해 컨테이너가 필요하기 때문에 여기에 갇혔습니다.

다음 옵션을 사용하여 docker0을 사용자 정의했습니다.
/bin/docker 데몬 --bip=169.254.0.254/24 --fixed-cidr=169.254.0.0/24

그래서 내 호스트에 다음 인터페이스가 있습니다(여기에 veth* 인터페이스를 나열하지 않음).

[root@pxgrid-106 irf]# ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtg 1500
        inet 169.254.0.254  netmask 255.255.255.0  broadcast 0.0.0.0
        inet6 fe80::42:84ff:fe87:d510  prefixlen 64  scopeid 0x20<link>
        ether 02:42:84:87:d5:10  txqueuelen 0  (Ethernet)
        RX packets 512  bytes 150727 (147.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 653  bytes 281686 (275.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtg 1500
        inet 172.23.166.176  netmask 255.255.255.128  broadcast 172.23.166.255
        inet6 fe80::20c:29ff:fecc:7d0f  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:cc:7d:0f  txqueuelen 1000  (Ethernet)
        RX packets 58462  bytes 12056152 (11.4 MiB)
        RX errors 0  dropped 69  overruns 0  frame 0
        TX packets 30877  bytes 18335042 (17.4 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

내 컨테이너의 IP는 169.254.0.2이고 호스트에서 이 컨테이너 IP를 ping할 수 있습니다. 물론 컨테이너에서 게이트웨이 169.254.0.254(docker0 ip)로 ping할 수 있지만 호스트 eth0 ip 172.23.166.176에 대해서는 ping할 수 없습니다.

방화벽을 완전히 중지하고 이러한 명시적인 규칙을 INPUT 체인의 방화벽에도 추가했지만 아직 운이 없습니다. 누가 이 일을 도와줄 수 있습니까? 아니면 버그인가요?

ACCEPT     all  --  172.23.166.176       169.254.0.0/24      
ACCEPT     all  --  169.254.0.0/24       172.23.166.176   

또한 내 호스트에 'ip route' 출력도 제공하겠습니다.

[root@pxgrid-106 bin]# ip route
default via 172.23.166.129 dev eth0 
169.254.0.0/24 dev docker0  proto kernel  scope link  src 169.254.0.254 
172.23.166.128/25 dev eth0  proto kernel  scope link  src 172.23.166.176 

@tn-osimis 제안에 감사드립니다. 업데이트하고 잘 작동합니다. 다른 사용자를 위한 코드는 다음과 같습니다.

docker-compose.yml

version: '2'

services:
  nginx:
    image: nginx:latest
    ports:
      - 80:80
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
    extra_hosts:
      - "dockerhost:${localhost_ip}"

StartDocker.sh

#!/bin/bash
dev_docker_file="docker-compose.yml"

export localhost_ip="$(ifconfig en0 inet | grep "inet " | awk -F'[: ]+' '{ print $2 }')"

docker-compose -f $dev_docker_file build
docker-compose -f $dev_docker_file up

도커 호스트의 경우 +1

도커 호스트의 경우 +1

도커 호스트의 경우 +1

@magicalbob솔루션 은 정말 마법과도 같습니다 🎉

도커 호스트의 경우 +1

+1 그런데 이게 왜 닫혀있지? 문제/기능 요청이 아직 해결되지 않았습니다.

이에 대한 업데이트가 있습니까? 올바른 방법은 무엇입니까?

+1

컨테이너에서 호스트(예: docker0 인터페이스 ip가 아닌 eth0 ip와 같은 호스트의 공용 IP)에 연결하는 방법에 대한 업데이트가 있는 사람이 있습니까?

@sburnwal docker run --add-host=publicip:$(hostname --ip) ubuntu ping -c2 publicip

@retog답변 을 참조하십시오.

도커 호스트의 경우 +1

도커 호스트의 경우 +1

도커 호스트의 경우 +1

아마도 당신 중 일부에게 도움이 될 것이므로 여기에 남겨 두십시오.

기본 네트워크 인터페이스가 항상 docker0 일 필요는 없으며 docker0 IP를 얻는 것이 Linux 이외의 시스템에서는 작동하지 않는다는 말을 들었습니다. Mac을 사용하는 개발자

따라서 매직 스크립트를 사용하여 네트워크 연결에서 호스트 IP를 가져오는 대신 프로그래밍 방식으로 찾으려고 하는 대신 컨테이너의 네트워크 설정을 강제 실행하는 것이 좋습니다.

다음과 같이 docker-compose 파일에서 docker 네트워크 설정을 구성했습니다.

``` 네트워크:
기본:
드라이버: 브리지
아이팜:
구성:
- 서브넷: 10.10.0.0/24
게이트웨이: 10.10.0.1

if you are only running one container, you could first create a network (`docker network create`) and connect to it with `docker run --network=<network-name>|<network-id> <image name>`

BUT if you don't want to do this (i.e. force the docker network) and really want to get the default gateway IP, you could get it more cleanly than using `docker0` network interface, for example by parsing the `docker network inspect <network name>`, which outputs the gateway IP (among other things):

...
"IPAM": {
"드라이버": "기본값",
"구성": [
{
"서브넷": "172.17.0.1/16",
"게이트웨이": "172.17.0.1"
}
]
}
...

you could also use the `--format` option of `docker network inspect` to get only the fields that are of interest, like this:

$ docker network inspect bridge --format='{{range .IPAM.Config}}{{.Gateway}}{{end}}'
$ 172.17.0.1
```

참고: .IPAM.Config 항목이 더 있으면 출력에 모두 표시되므로 올바른 항목을 선택하는 추가 논리가 필요합니다.

도커 호스트의 경우 +1

이것은 컨테이너에서 IDE를 실행할 수 없기 때문에 디버깅을 위해 IDE에 연결하기 위해 php-fpm 컨테이너 내에서 xdebug를 사용하려는 경우에 매우 유용합니다.

도커 호스트의 경우 +1

위의 해킹 방법에 대한 내 요약:

docker-compose.yml :

nginx:
  restart: always
  build: ./nginx/
  ports:
    - "80:80"
  extra_hosts:
    # requires `export DOCKERHOST="$(ifconfig en0 inet | grep "inet " | awk -F'[: ]+' '{ print $2 }')"` in ~/.bash_profile
    - "dockerhost:$DOCKERHOST"

~/.bash_profile :

# see https://github.com/docker/docker/issues/1143
export DOCKERHOST="$(ifconfig en0 inet | grep "inet " | awk -F'[: ]+' '{ print $2 }')"

nginx-conf :

location / {
        proxy_pass http://dockerhost:3000;
        proxy_set_header host $host;
        proxy_set_header x-real-ip $remote_addr;
        proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
}

나는 이 문제를 해결하기 위해 svendowideit/ambassador docker 이미지를 사용하는 경향이 있습니다.

예를 들어 Docker 호스트에서 실행되는 Elasticsearch 노드에 바인딩하려는 경우:

docker run --restart always -d --name elasticsearch --expose 9200 -e ELASTICSEARCH_PORT_9200_TCP=tcp://<host>:9200 svendowideit/ambassador

이제 다른 도커 컨테이너는 --link elasticsearch를 사용하여 Elasticsearch를 찾을 수 있으며, Elasticsearch가 도커 컨테이너에서 실행 중인지, 호스트에서 실행 중인지 또는 다른 곳에서 실행되고 있는지에 대해 불가지론을 유지합니다.

도커 호스트의 경우 +1

... 지금은 다음과 같이 할 수 있습니다.

$ docker build --build-arg HTTP_PROXY=172.16.42.1 .

... 또는 비슷한 경우 docker-compose - 나는 이것을 한다:

client:
        build: ./client
        extra_hosts:
            - "foobar:${HTTP_PROXY}"

빌드 시 호스트를 설정합니다.

export HTTP_PROXY=172.16.42.1 && docker-compose build

Mac에서 @rattrayalex , 나는 이것이 직접 IP를 출력하는 것을 발견했습니다: ipconfig getifaddr en0

도커 호스트의 경우 +1

dockerhost에 대해 +1만 하고 같은 성격의 기존 댓글에 좋아요(반응)를 추가할 수 있나요? +1 댓글은 이 문제 스레드를 불필요하게 확장/채웁니다. 이미 너무 많아서 더 추가할 필요가 없지만 항상 엄지손가락을 사용할 수 있습니다! 👍

댓글 작성자는 해결 방법이 알려진 일반적인 사용 사례임을 강조하기 위해 광범위한 +1을 작성하고 있으며 docker 팀에서 코딩하는 데 몇 시간으로 추정할 수 있는 시간이 필요하다고 생각합니다.
그래도 오픈 3년차 👍

그래서, 그것은 더 "우리는 아직 여기"인가? 대신 이모티콘만

https://github.com/docker/docker/issues/1143#issuecomment -233152700의 @magicalbob 솔루션은 지금까지 시도한 모든 컨테이너 설정 및 브리지에서 완벽하게 작동합니다!

https://github.com/docker/docker/issues/1143#issuecomment -70052272의 솔루션이 docker compose extra_hosts 를 사용할 때 작동하지 않습니다.

도커 호스트의 경우 +1

아직도 도커호스트가 없으신가요?

도커 호스트의 경우 +1

도커 호스트의 경우 +1

그것은 일어나지 않을 것이고 3년 전에 문을 닫았고 그들은 이것을 구현할 계획이 없습니다. docker.sock이 보안을 위한 발판인 것과 같은 이유로 dockerhost도 마찬가지입니다. 애플리케이션 내부에서 확인 가능한 도메인 이름을 갖는 것은 IMHO의 주요 보안 문제입니다. 필요한 경우 IP로 호스트 서비스에 액세스하는 것이 공격 표면이 증가하지 않는 경우에만 선택적으로 해결 방법을 사용하십시오.

일어나지 않는 것에 대해 동의하지 마십시오. 그러나 많은 쉬운 해결 방법도 종료하지 않는 한 dockerhost가 보안 위험이 되는 방법을 알 수 없습니다....

BlueMail에서 보낸

2016년 12월 16일 17시 58분 17시 58분에 Paulo Cesar [email protected] 은 다음과 같이 썼습니다.

3년 전에 문을 닫았고 앞으로도 그럴 계획이 없습니다.
이것을 구현합니다. docker.sock이 보안을 위한 발판인 것과 같은 이유입니다.
dockerhost도 마찬가지입니다. 귀하의 내부에서 확인 가능한 도메인 이름을 갖는
응용 프로그램은 IMHO의 주요 보안 문제입니다. 당신이해야한다면, 그냥 사용
IP로 호스트 서비스에 액세스하지 않는 경우에만 선택적으로 해결 방법
증가된 공격 표면이 됩니다.

--
당신이 언급되었기 때문에 이것을 받는 것입니다.
이 이메일에 직접 답장하거나 GitHub에서 확인하세요.
https://github.com/docker/docker/issues/1143#issuecomment -267655915

도커 호스트의 경우 +1

도커 호스트의 경우 +1

호스트 시스템의 IP는 192.168.0.208 입니다.

docker-compose 파일은 다음과 같습니다.

version: '2'
 services:
   zl-tigervnc:
     image: zl/dl-tigervnc:1.5
     container_name: zl_dl_tigervnc
     restart: always
     tty: true
     ports:
       - "8001:8888"
       - "6001:6006"
       - "8901:5900"
       - "10001:22"
     devices:
       - /dev/nvidia0
     volumes:
       - ~/data:/root/data
       - /var/run/docker.sock:/var/run/docker.sock
     extra_hosts:
       - "dockerhost:192.168.0.208"

이 스크립트에 의해 컨테이너가 시작되었습니다. 컨테이너는 호스트 시스템의 8080 포트에 액세스하려고 합니다(예: 192.168.0.208:8080 ). 하지만 작동하지 않습니다.

그러나 포트 포워딩을 사용하여 호스트 시스템의 $#$ 8080 8080 에 매핑합니다. 라우터의 IP는 63.25.20.83 입니다. 컨테이너는 포트 포워딩을 통해 호스트 시스템의 8080 에 액세스할 수 있습니다(예: 63.25.20.83:8080 ).

이 페이지에서 많은 솔루션을 시도했지만 여전히 작동하지 않습니다.

이것은 단순히 php-fpm 컨테이너 내부에서 xdebug를 사용하여 다음을 수행하려는 경우에 매우 유용합니다.
분명히 컨테이너에서 IDE를 실행할 수 없기 때문에 디버깅을 위해 IDE에 연결하십시오.

바로 @colinmollenhour 입니다! 추가 문제가 있다는 것을 제외하고. 호스트를 ping할 수 있지만 실제로 호스트의 포트에 연결할 수는 없습니다(예: 9000에서 실행되는 원격 디버거).

그물에 오래된 및/또는 정확하지 않은 항목이 많이 있습니다. 많은 사람들이 별칭 IP를 설정하고 이를 lo 인터페이스에 연결하는 것이 작동해야 한다고 생각하지만 작동하지 않습니다.

(호스트에서 netcat으로 테스트하고 docker 컨테이너에서 telnet으로 테스트하므로 잘 정리했습니다).

@bitwombat 포트 9000 규칙에 대해 호스트의 방화벽을 확인하십시오.

@gregmartyn 바로 그것이었다. 감사 해요! 더 간단한 설정에서 가장 먼저 확인했을 것입니다! 모든 속임수는 내가 더 이상한 것을 확인하게 했습니다.

2013년 7월 ~ 2017년. 거의 4년차인데, 이게 왜 아직 기능이 아니지? 이것은 분명히 고립된 사용 사례가 아닙니다.

다중 호스트 배포 관리 솔루션이 되는 Docker의 전략과 일치하지 않기 때문에 기능이 아닙니다.

나는 여전히 유효한 사용 사례가 많이 있으며 기능을 추가해도 Docker의 전략에 해를 끼치지 않을 것이라고 믿습니다. 어쨌든 다음은 꽤 보편적으로 작동해야 한다고 생각하는 컨테이너 내에서 도커 호스트 주소를 해결하는 다소 간단한 솔루션입니다.

ip route | awk '/^default via /{print $3}'

dockerhost 에 대해 +1

매우 필요합니다. dockerhost 에 대해 +1

dockerhost 에 대해 +1

도커 호스트의 경우 +1

도커 호스트의 경우 +1

해키 해결 방법이 아닌 모든 솔루션에 대해 +1입니다. 아무 것도 작동하지 않습니다.

동의. 솔루션에 대해 +1. docker를 사용하는 프로젝트에서 개발 및 테스트 작업을 수행하는 데 필요합니다.

도커 호스트의 경우 +1

도커 호스트의 경우 +1

도커 호스트의 경우 +1

와우.. 4년이 지나고 강해집니다. 도커호스트에 +1?

+1 도커 호스트!!

+1 도커 호스트!!!

이것은 아마도 음소거 상태일 것입니다. 우리는 이것을 참조하여 새로운 문제를 만들어야 할 것입니다.

:+1: dockerhost용... 지금은 env로 설정하고 있습니다.

export DOCKERHOST=$(ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | head -n1)

일이 복잡해집니다.

ssh 터널링된 개인 레지스트리가 있는 컨테이너에서 docker-compose를 사용하는 것과 같은 간단한 작업도 Docker가 dockerhost를 원하지 않는 상태로 설정되어 있기 때문에 작동하지 않습니다.

참고: 이 문제는 종료되었으므로 더 이상 설명을 추가할 필요가 없습니다 :-)

이 기능이 필요한 경우 --add-host 및 이에 상응하는 옵션을 사용하여 $ dockerhost DNS 별칭을 쉽게 추가할 수 있습니다.

기본적으로 사용할 수 없는 이유는 무엇입니까? 사소한 경우에만 작동하기 때문입니다. 즉:

  • 네트워크 액세스 권한이 _없는_ 컨테이너는 어떻습니까?
  • _multiple_ 네트워크가 있는 컨테이너는 어떻습니까?
  • Swarm 클러스터에서 실행되는 컨테이너는 어떻습니까?

위의 질문에 대한 확실한 답변뿐만 아니라 좋은 사용 사례(예: "XXX를 하고 싶습니다. 그렇게 하려면 dockerhost ..."를 갖고 싶습니다. 발생할 수 있는 다른 코너 케이스), 이 문제를 참조하는 새 문제를 자유롭게 엽니다!

감사합니다.

문제는 호스트 IP가 동적이고 어떤 네트워크에 있는지에 따라 달라질 수 있다는 것입니다. 개발 중인 경우 디버깅을 위해 호스트에 연결하는 것은 필수입니다. 모두가 dockerhost를 원하는 이유는 거기에 없는 옵션이 편리하거나 유용하기 때문이 아닙니다.
Docker에는 모두와 관련이 없는 수많은 옵션이 있습니다. 이것이 무엇이 다른가요? 필요한 경우 dockerhost를 활성화하는 옵션이 docker에 없는 이유는 99%가 될 것입니다.

@jpetazzo

네트워크 액세스 권한이 없는 컨테이너는 어떻습니까?

그러면 dockerhost가 작동하지 않습니다.

여러 네트워크가 있는 컨테이너는 어떻습니까?

그러면 dockerhost가 작동하지 않습니다.

Swarm 클러스터에서 실행되는 컨테이너는 어떻습니까?

무슨 상관이야?

도커 에코시스템 외부의 구성 요소와 관련된 일부 소프트웨어(예: 호스트의 Windows VM 내에서 실행되는 일부 소프트웨어)를 개발하는 경우 이를 도커에 연결하는 것이 어렵습니다. 왜 고통을 받아야만 합니까?

귀하가 나열한 모든 사례는 이 스레드의 226개 댓글이 말하는 것이 아니라 기본적인 사례에 대한 것입니다.

수정: 죄송합니다. 내 댓글의 일부를 삭제했습니다. 욕할 생각은 아니었어요. 약간 실망스럽습니다. 이것은 일부 docker 사용자에게 매우 필요한 기능이며, 이를 필요로 하는 소프트웨어를 개발하는 경우 겉보기에 아무 이유 없이 이를 해킹해야 하는 것이 훨씬 더 실망스럽습니다.

@jpetazzo 때로는 "사소한" 사례가 사용 사례의 80%입니다. Dockerhost는 개발 또는 스테이징 환경에서 Docker를 사용하는 사람들에게 매우 유용할 것입니다. 다음은 Dockerhost를 사용하려는 몇 가지 예입니다.

1) 개인 레지스트리가 있는 Windows 의 Docker-Compose . 자체 호스팅 개인 Docker 레지스트리가 있습니다. 개발자는 포트 포워딩(예: localhost:5000)이 있는 SSH 터널을 통해 레지스트리에 액세스할 수 있습니다. 그러나 Docker-Compose가 자체 Docker 컨테이너에서 실행 중일 때 개인 레지스트리 호스트를 지정할 방법이 없습니다. dockerhost 가 있는 경우 docker-compose.yml 파일에서 d ockerhost:5000 을 사용하여 호스트의 전달된 포트에 액세스할 수 있습니다.

2) 호스트에서 실행되는 서비스와 통신해야 하는 모든 애플리케이션. 예를 들어, dockerhost가 있는 경우 docker 컨테이너에서 실행되는 웹 기반 SSH 클라이언트를 사용하여 호스트와의 SSH 연결을 설정할 수 있습니다. dockerhost 가 있으면 사용할 수 있는 Docker 컨테이너의 호스트에서 실행되는 서비스의 예는 셀 수 없이 많습니다.

3) 역 포트 포워딩. SSH 또는 OpenVPN 서버를 Docker 컨테이너에서 실행할 수 있으며 dockerhost가 있는 경우 호스트에서 실행 중인 서비스에 대한 액세스를 클라이언트에 제공할 수 있습니다. 컨테이너에서 dockerhost로 포트 포워딩을 설정할 수 있습니다.

Moby 개발자가 dockerhost와 관련하여 커뮤니티의 의견을 듣기를 거부하는 기술적 정당성을 듣고 싶습니다. 지금까지는 정치적/사업적 이유만 들었습니다.

macvlan 네트워크 인터페이스를 Swarm 서비스에 연결하는 방법을 찾던 중에 이 스레드를 발견했습니다... Swarm은 완성된 솔루션처럼 보이지만 서비스를 외부 세계에 직접 노출할 수 없다는 것은 저에게 계속해서 좌절감을 줍니다. Docker가 실제 사용 사례에서 관심을 잃은 것처럼 느껴집니다. 이 스레드가 시작된 지 4년이 지났지만 컨테이너가 스스로 관리하도록 하는 기본 구현이 아직 없습니다.

나는 Docker에 비교적 익숙하지 않습니다. 공식 문서에서 읽은 모든 것이 의미가 있습니다. _Docker는 실제로 선택하기가 상당히 쉬운 도구입니다._

사실, 내가 알아내려고 몇 시간을 보낸 유일한 것은 _ 컨테이너 내에서 호스트에 연결하는 방법입니다._ 다른 모든 것은 쉽게 결정할 수 있었습니다. 나는 아직도 그것을 하는 방법을 모른다. 이 포럼과 SO에 있는 많은 "해킹"이 작동하지 않습니다. 수개월 동안 "도커화"되지 않은 레거시 앱을 사용하려면 호스트에 액세스해야 합니다.

조쉬가 두려워서 그런 일은 절대 일어나지 않을 것입니다. 개발자들은 그것을 분명히 했습니다.
이는 도커를 많은 종류의 응용 프로그램에서 쓸모없는 것보다 나쁘게 만듭니다.
불행히도 docker(또는 "moby")는 이에 대해 던지지 못했습니다.
개발자 또는 해당 응용 프로그램.

2017년 6월 19일 01:08에 "Josh Wedekind" [email protected] 이 다음과 같이 썼습니다.

나는 Docker에 비교적 익숙하지 않습니다. 공식 문서에서 읽은 모든 것
말이된다. Docker는 실제로 선택하기 매우 쉬운 도구입니다.

사실, 내가 알아내려고 몇 시간을 보낸 유일한 것은
컨테이너 내에서 호스트에 연결하는 방법입니다. 다른 모든 것
쉽게 결정할 수 있었다. 나는 아직도 그것을 하는 방법을 모른다. 많은
이 포럼과 SO의 "해킹"이 작동하지 않습니다. 우리는 액세스해야합니다
"Dockerized"로 설정되지 않은 레거시 앱을 사용하기 위해 호스트
여러 달 동안.


당신이 댓글을 달았기 때문에 이것을 받는 것입니다.
이 이메일에 직접 답장하고 GitHub에서 확인하세요.
https://github.com/moby/moby/issues/1143#issuecomment-309311997 또는 음소거
스레드
https://github.com/notifications/unsubscribe-auth/AA-shyjglsJXawxHHWGhQH0d1LlZeJqxks5sFbwXgaJpZM4Ayw00
.

간단한 선언적 docker-compose 파일로 모든 상황을 처리할 수 있다는 것은 정말 실망스러운 일이지만 개발 환경의 컨테이너에서 레거시 애플리케이션에 연결하려면 수천 가지 트릭을 사용해야 합니다.
@thaJeztah 도커의 첫인상은 전혀 좋지 않습니다.

참고로 우리는 정확히 이러한 이유로 프로덕션에서 Docker를 포기했습니다. Docker 개발자가 이에 대해 완전히 반대한다는 것을 알고 있지만(일부 사람들이 주장하는 것처럼 사소한 기능이 아님을 압니다) 하지만 저는 단지 차임하고 싶었습니다: 고려조차 하지 않기 때문에 실제 고객을 잃고 있습니다 이 문제. 내 회사에서 꺼려하는 Docker "전문가"인 저는 이제 "Docker는 훌륭합니다... localhost에서 실행되는 것과 통신해야 하는 경우를 제외하고 "라고 말하여 이에 대해 묻는 사람들에게 주의를 기울여야 합니다.

다시 말하지만, 이 문제가 조용하다고 확신합니다. 하지만 이 스레드인 Docker 개발자를 다시 보면 이는 정말 고통스러운 일이며 실제 Docker 고객이 Docker 사용을 중단하도록 하고 있습니다. 나는 당신이 그 문제를 해결하기를 완고하게 거부한 것을 재고할 것을 권합니다. Docker가 어떻게 사용되어야 하는지에 대한 귀하의 비전에 맞지 않는다고 해서 그것이 쓸모없거나 불필요한 기능이라는 의미는 아닙니다.

기존 고객을 잃을 수 있을 뿐만 아니라. 개발에 대한 약속을 지키면 모든 것을 docker로 마이그레이션할 수 있었습니다. 이것은 docker가 모든 프로세스에 대규모로 사용하기 위한 진정한 안티 프로모션입니다.

내가 지금 작동하게 만드는 방법은 네트워크를 만드는 것입니다. 내 docker-compose 파일은 다음과 같습니다.

version: '2'
services:
  <container_name>:
    image: <image_name>
    networks:
      - dockernet

networks:
  dockernet:
    driver: bridge
    ipam:
      config:
        - subnet: 192.168.0.0/24
          gateway: 192.168.0.1

이렇게 하면 192.168.0.1로 호스트에 접속할 수 있습니다.
이 기능은 곧 제공되지 않을 것이기 때문에 일부 사용자에게 유용할 수 있습니다.

@deltabweb 호스트 시스템의 앱으로 들어오는 요청이 "localhost" 트래픽으로 표시됩니까, 아니면 192.168.0.1에 응답하도록 앱을 수정해야 합니까?

당신의 도움을 주셔서 감사합니다.

@하프니블
networks 문서를 자세히 보지는 않았지만 호스트 컴퓨터의 새 네트워크가 다음 위치에서 생성된다는 점을 이해하고 있습니다.

  • "dockerhost"의 IP는 192.168.0.1입니다.
  • 첫 번째 컨테이너의 IP는 192.168.0.2입니다.
  • 두 번째 컨테이너의 IP는 192.168.0.3입니다.
  • 등등 ...

거기에서 시작하면 모든 것이 로컬 네트워크에 연결된 물리적 시스템이 있는 것처럼 작동해야 합니다.

  • 기계는 서로 연결할 수 있습니다
  • 호스트에서 ping 192.168.0.2 를 사용할 수도 있어야 합니다. 이는 컨테이너가 ping에 응답하는 경우에만 작동합니다.

따라서 귀하의 질문에 대답하려면 호스트 컴퓨터의 앱이 192.168.0.X에 응답해야 한다고 생각합니다(연결하려는 컨테이너에 따라 다름).

@deltabweb 클라우드 서버 호스트 포트에 액세스하는 방법은 무엇입니까? >>> 연결이 거부되었습니다.

@nooperpudd 확실히 하자면 컨테이너에서 호스트에서 실행 중인 응용 프로그램에 액세스하려고 합니까?
먼저 응용 프로그램이 외부에서 들어오는 연결을 허용하는지 확인합니다(0.0.0.0 및 localhost가 아님). 그리고 연결을 차단하는 방화벽이 없는지 확인하십시오.

@nooperpudd Docker for mac 를 사용하는 경우 host 모드를 사용할 수 없습니다. @deltabweb 솔루션도 작동하지 않습니다(내 서버는 모두 0.0.0.0 및 내 호스트 컴퓨터 방화벽을 수신하고 있습니다. 꺼져 있지만 매번 Connection refused 를 얻습니다). 약 2일 간의 시도 및 오류 후 이 문제를 해결하는 유일한 방법은 다음 스크립트입니다.

#!/bin/bash
export DOCKERHOST=$(ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | head -n1)

# You should use DOCKERHOST env variable in your `docker-compose.yml` 
# and put it everywhere you want to connect to `localhost` of the host machine
docker-compose $@

이 접근 방식의 유일한 문제는 컨테이너를 실행한 후 IP가 변경된 경우 컨테이너를 다시 실행해야 하며 새 IP를 찾을 수 없다는 것입니다.

저에게 놀라운 관찰은 도커 컨테이너를 시작할 때 실행되는 명령이 호스트 IP 주소를 통해 컨테이너에 연결할 수 없다는 것입니다. 그러나 해당 명령이 이러한 연결 시도를 수행하지 않고 성공적으로 실행을 마치면 컨테이너는 호스트 IP 주소를 통해 자체적으로 도달할 수 있습니다.

NoSql 데이터베이스 클러스터 인스턴스의 끝점을 Swarm 클러스터 외부의 클라이언트에 노출하려고 할 때 이 관찰을 했습니다. 결국 이러한 끝점은 외부 클라이언트가 도달할 수 있도록 VM의 개인 또는 공용 IP 주소로 구성되어야 합니다. 그러나 Cassandra는 시작할 때 호스트 IP 주소( CASSANDRA_BROADCAST_ADDRESS 환경 변수로 설정 -- 아래 참조)와 즉시 연결을 시도하여 실패하는 방식으로 설계되었습니다. 반면, Mongodb 레플리카셋 노드는 모두 clean 상태로 먼저 시작한 후, 프라이머리 노드와 세컨더리 노드가 레플리카셋을 형성할 수 있도록 별도의 초기화 명령을 실행한다.

아래에서 cassandra에 대한 이 관찰에 대한 자세한 설명을 볼 수 있습니다(도커 떼를 사용하여 생성하지만 docker run -d 에 동일한 문제가 나타납니다(NAT 모드에서는 --net=host 옵션이 없음).

1) 한편으로는

docker service create  --name cassandra-service
--publish mode=host,target=7000,published=7000,protocol=tcp 
-e CASSANDRA_SEEDS=host IP address  -e CASSANDRA_BROADCAST_ADDRESS=host IP address

수신 주소에 연결할 수 없다는 메시지와 함께 실패: <host IP address>:7000

2) 반면에 오버레이 네트워크에 연결된 컨테이너는 다음과 같이 생성됩니다.

docker service create  --network cassandra-net --name cassandra-service
-e CASSANDRA_SEEDS=cassandra-service  -e CASSANDRA_BROADCAST_ADDRESS=cassandra-service

올바르게 시작하고 동시에 cassandra:2.0 이미지의 Dockerfile에 노출된 모든 포트의 호스트 IP 주소에 연결할 수 있습니다.

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                                         NAMES
07603a75a379        cassandra:2.0       "/docker-entrypoin..."   About a minute ago   Up About a minute   7000-7001/tcp, 7199/tcp, 9042/tcp, 9160/tcp   cassandra-service-1.1.m243u97zku15w08m6puytdngs

$ docker exec -it 1e61ec16f8d0 bash
root<strong i="5">@1e61ec16f8d0</strong>:/# cqlsh 172.17.13.151
Connected to Test Cluster at 172.17.13.151:9160.
[cqlsh 4.1.1 | Cassandra 2.0.17 | CQL spec 3.1.1 | Thrift protocol 19.39.0]

유사하게, 두 번째 카산드라 노드를 생성하는 동안에도 동일한 현상이 관찰될 수 있습니다.

1) 다른 노드에 두 번째 카산드라 컨테이너를 생성하는 경우

docker service create  --network cassandra-net --name cassandra-service-2
-e CASSANDRA_SEEDS=172.17.13.151  -e CASSANDRA_BROADCAST_ADDRESS=cassandra-service-2

컨테이너는 시드와 가십할 수 없다는 런타임 예외와 함께 실패합니다.

java.lang.RuntimeException: Unable to gossip with any seeds
        at org.apache.cassandra.gms.Gossiper.doShadowRound(Gossiper.java:1322)
        at org.apache.cassandra.service.StorageService.checkForEndpointCollision(StorageService.java:457)

2) 반면에 docker run -d 를 통해 카산드라 컨테이너를 생성하면 호스트 IP 주소를 통해 시드 노드에 도달할 수 있습니다.

$ docker run -d cassandra:2.0
d87a79cc3de8cd7e4cf40284d1eca91ceb660581cc71082fe64a6b84a09fbd77
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                         NAMES
d87a79cc3de8        cassandra:2.0       "/docker-entrypoin..."   3 seconds ago       Up 2 seconds        7000-7001/tcp, 7199/tcp, 9042/tcp, 9160/tcp   trusting_ardinghelli
$ docker exec -it d87a79cc3de8 bash
root<strong i="17">@d87a79cc3de8</strong>:/# cqlsh 172.17.13.151
Connected to Test Cluster at 172.17.13.151:9160.
[cqlsh 4.1.1 | Cassandra 2.0.17 | CQL spec 3.1.1 | Thrift protocol 19.39.0]
Use HELP for help.
cqlsh>

특히 Cassandra의 경우 카산드라 노드의 자동 부트스트랩을 해제하여 이 문제를 해결합니다. Compose V3에서 진입점 명령을 사용하여 /etc/cassandra/cassandra.yaml auto_bootstrapfalse 로 설정하면 됩니다.

version: '3'
services:
  cassandra-1:
    image: cassandra:2.0
    entrypoint:
    - "sh"
    - "-c"
    - "echo auto_bootstrap: false >> /etc/cassandra/cassandra.yaml; /docker-entrypoint.sh cassandra -f"
    environment:
      CASSANDRA_BROADCAST_ADDRESS: 172.17.13.151
    volumes:
    - volume1:/var/lib/cassandra
    ports:
    - "7000:7000"
    - "7001"
    - "7199"
    - "9042:9042"
    - "9160:9160"

그런 다음 docker exec -it <container id> nodetool rebuild 를 실행하여 cassandra 노드를 수동으로 시작합니다.

개발 중에 이 기능을 사용할 수 있습니다. 음...

@jpetazzo 우리는 여러 플랫폼에서 팀으로 PHP 솔루션을 개발합니다. 디버거(xdebug)는 호스트의 IDE에 다시 연결해야 합니다. Windows와 Linux에서는 '즉시' 작동하지만 Mac에서는 개발자가 로컬 IP를 구체적으로 언급하도록 xdebug.ini 파일을 변경해야 합니다. 그러나 Dockerfile은 소스 제어 하에 있습니다... 개발자가 이 파일 편집에 대해 충돌함에 따라 대기열에서 끊임없는 충돌과 맹세가 발생합니다. 예, 스크립트 가능한 해결 방법이 있지만 Windows 및 Mac용 docker에 docker.for.win.localhost 및 docker.for.mac.localhost가 있는 이유는 무엇입니까? 부분적으로 도움이 되지만 올바르게 설정한 플랫폼을 감지하려면 여전히 스크립트가 필요합니다. 그래야만 하는 것이 훨씬 더 복잡해 보입니다. 이 기능을 재고하십시오. Docker는 가파른 학습 곡선일 수 있지만 이와 같은 문제로 인해 사용자는 Google에서 몇 시간 동안 믿을 수 없을 정도로 검색하게 됩니다.

docker.for.mac.localhost 를 사용하여 https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds 페이지를 확인하는 것이 도움이 되었습니다. :)

좋든 나쁘든 docker-compose 는 로컬 개발 머신이나 CI에서 실행되는 웹 서버를 테스트하기 위해 Selenium Hub와 헤드리스 Firefox/Chrome 그리드 노드를 가동하는 가장 쉬운 방법입니다. 도커 컨테이너의 웹 서버는 개발하기에 너무 느립니다.) 도커가 의도한 바는 전혀 아니지만 도커가 그 일을 위한 최고의 도구이고 도커 자신의 잘못입니다 😆 유일한 문제는 모든 OS에서 작동하는 방식으로 호스트 IP를 쉽게 알아내는 것 외에는.

@rskuipers docker.for.mac.localhost 로 정확히 무엇을 했는지 설명할 수 있습니까? 내 컨테이너 내부에서 호스트 컴퓨터로 확인하기 위해 요청을 하려고 합니다. 내 컨테이너는 traefik에서 실행 중이므로 domain.docker.localhost를 통해 액세스할 수 있지만 컨테이너 내부에서 시작하는 URL에 액세스하려고 하면 확인되지 않습니다.

현재 내가 한 일은 docker-compose.yml 에 추가한 것입니다 /etc/hosts 에 라인을 추가하여 도메인이 잘 해결되도록 합니다.

extra_hosts: - "domain.docker.localhost:172.18.0.1"

IP는 컨테이너 내의 호스트 IP이며 ip route | awk '/^default via /{print $3}' 를 사용하여 얻을 수 있습니다. 그러나 가능하면 하드코딩하고 싶지 않습니다 ...

@jzavrl 내가 한 일은 HTTP 요청이 호스트에서 실행되는 프록시를 통과하도록 docker.for.mac.localhost 를 사용하는 것뿐이었습니다. docker-compose 외에 다른 레이어는 사용하지 않습니다.

그것이 바로 내가 관심을 갖는 것입니다. 구체적으로 어떤 종류의 변경을 가해야 했습니까?

@jzavrl 없음 :P 방금 작동했습니다.

이해가 되지 않습니다. 그럼 docker.for.mac.localhost 로 무엇을 하신 겁니까?

@jzavrl 연결할 IP 대신 사용했습니다. 그래서 docker.for.mac. 로컬 호스트:8888

아하하하, 이제야 이해가 되기 시작했습니다. 그러면 이것을 시도할 것입니다. 건배 @rskuipers.

컴퓨터에서 "en0"의 IP를 사용하기만 하면 됩니다.

예를 들어

ssh [email protected]

'192.168.1.100'은 라우터의 DHCP 서비스에서 가져온 것일 수 있습니다.

@acuthbert , 제안해 주셔서 감사합니다.
docker.for.win.localhost 는 Windows용 Docker에서 작동합니다. Docker와 Windows에는 아직 희망이 있습니다. 😣

이게 안되는 기술적인 이유가 거의 없고 이 쓰레드에 있는 사람들의 90%를 만족시킬 수 있는 코너 케이스와 실제로 작동하지 않는 상황, 그 상황에서 개발중인 사람들은 간단한 세트로 만족할 수 있습니다. 작동하지 않을 가능성이 있는 시나리오를 설명하는 "사용 사례"입니다.

이것은 대부분 정치적인 쓰레기일 뿐이며 실제 기술적인 추론은 아닙니다. 다른 컨테이너 엔진 중 하나가 선택되어 Kubernetes를 대신 사용하도록 바꿀 수 있기를 바랍니다. 그러면 더 이상 이 쓰레기를 처리할 필요가 없습니다.

@NdubisiOnuora , 어떤 유형의 응용 프로그램입니까? 웹 애플리케이션?

2개의 콘솔 앱(호스트의 tcp-server 및 컨테이너의 tcp-client)이 있습니다.
그들은 tcp를 사용하기 때문에 정확히 IP가 필요합니다( docker.for.win.localhost 도메인이기 때문에 적합하지 않음).

예를 들어, tcp-client에서 어떤 ip:port 를 설정해야 하는지, tcp-server에서 ip:port 127.0.0.1:9595 를 설정했다면?

도메인을 IP 주소로 확인하시겠습니까?

@orf ,
C#에서 이 코드를 사용하고 싶습니다.
IPAddress hostAddr = Dns.Resolve("docker.for.win.localhost").AddressList[0];
하지만 그 전에 docker.for.win.localhost 에 ping을 시도하지만 표시되지 않습니다. 오류: Ping request could not find host docker.for.win.localhost. Please check the name and try again.
내 Dockerfile:
FROM microsoft/windowsservercore
ADD . /
ENTRYPOINT powershell ping docker.for.win.localhost

누군가가 그것을 놓친 경우를 대비하여 18.03의 솔루션은 host.docker.internal 라고 생각하지만 어떤 이유로 이것은 Windows용 Docker에서만 작동합니다!? 왜 다른 사람들은 안됩니까?

편집: Github에 의해 댓글이 축소된 것을 보지 못했습니다... 🤦‍♂️

나를 위해 작동:
docker run --rm -it --add-host "docker.for.localhost:$(ip -4 addr show docker0 | grep -Po 'inet \K[\d.]+')" alpine:latest ping docker.for.localhost

@lukasmrtvy 쉘에서는 작동하지만 docker-compose.yml 는 어떻습니까?

모든 플랫폼에서 작업하는 일반적인 방법으로 이 문제를 해결하기 위해 컨테이너를 만들었습니다. https://github.com/qoomon/docker-host

이 페이지가 도움이 되었나요?
0 / 5 - 0 등급