도커 컨테이너 내부에서 도커 호스트의 IP 주소를 얻는 방법


358

제목대로 도 커가 호스트하는 IP 주소와 호스트에서 컨테이너로 포트 맵을 검색하고 컨테이너 내부에서 IP 주소를 검색 할 수 있어야합니다.


이 정보를 어떻게 사용하고 싶은지 자세히 설명해 주시겠습니까? "도커 호스트"라고 말 했습니다. 둘 이상의 호스트에서 Docker를 실행하고 있습니까? 컨테이너가 호스트 및 포트 맵의 IP 주소를 알고 있으면 어떻게합니까?
Andy

도커 호스트 IP 주소를 도커 컨테이너에 전달하는 가장 간단한 방법은 'docker container exec'를 사용하여 컨테이너 내부에서 호출해야한다고 생각합니다. busybox 컨테이너 내부에서 호스트를 핑하고 싶다고 가정하십시오. $ IP = '8.8.8.8'&& docker container busybox ping $ IP '호스트 IP를 찾는 방법은 더 마음에 드는 것을 사용하십시오.
SauloAlessandre

답변:


314
/sbin/ip route|awk '/default/ { print $3 }'

@MichaelNeale에서 알 수 있듯이이 DockerfileIP는 빌드 시간 동안 하드 코딩되므로 빌드 시간 동안이 IP가 필요한 경우를 제외하고는 이 방법을 사용하는 것이 의미가 없습니다 .


49
컨테이너에 도커 브리지 (기본값)를 사용하는 경우 호스트의 IP (192.168.1.x) 대신 172.17.42.1과 같은 브리지 IP가 출력됩니다 (호스트가 홈 NAT에 있다고 가정합니다). 192.168.1.x 주소를 원한다면 @Magno Torres 답변을 사용하는 것이 아마도 그러한 상황에서 사람들이 원하는 것입니다.
Programster

2
RUN은 예상대로 작동하지 않습니다. 빌드 시간에만 IP를 계산합니다. 그 후에는 영원히 정적이므로 유용하지 않습니다. 빌드 호스트의 IP가됩니다.
Michael Neale

7
@Programster, 사람들이 docker 호스트와 컨테이너 사이의 연결을 원한다고 가정 할 수 있습니다. 교량 IP가 제공 할 수있는 것입니다 (물론 표준 "홈"설치). 도커 브리지 외부에 있어도 액세스 할 수없는 경우 왜 "실제"호스트 IP가 필요한가? 이것은 도커를 설치하고 짧은 시간 안에 도커를 가지고 싶어하는 모든 사람들을위한 솔루션입니다.
spinus

1
@MichaelNeale, 이전과 마찬가지로 도커로 시작하는 대부분의 사람들은 호스트와 컨테이너 사이의 연결이 필요하다고 가정합니다. 누군가 "적절한"배포를 수행하는 경우 어쨌든 도커 브리지를 사용하지 않거나 사용자 지정 네트워킹을 사용하고 있거나 아마도 모든 네트워크 문제를 알고 있거나 DNS (또는 검색)가 설정되어있을 것입니다.
spinus

1
@spinus-그러나 이것은 빌드 된 호스트에서 실행되는 경우에만 유효합니다.이 경우 하드 코딩 할 수 있습니다. 또는 찾아보십시오. 유용한 답변이 아니며 잘못 오도한다고 생각합니다. 사람들의-그것을 제거하는 것이 좋습니다. (런 비트)
Michael Neale

182

버전 18.03부터는 host.docker.internal호스트 IP로 사용할 수 있습니다 .

의 작품 Mac 용 부두 노동자 , Windows 용 부두 노동자 , 그리고 아마도 다른 플랫폼뿐만 아니라.

이 업데이트는 docker.for.mac.localhost17.06 이후 버전 및 docker.for.mac.host.internal17.12 이후 버전 의 Mac 전용 업데이트 이며 해당 플랫폼에서도 작동합니다.

MacWindows 설명서에서 와 같이 개발 목적으로 만 사용됩니다.

예를 들어 호스트에 환경 변수가 설정되어 있습니다.

MONGO_SERVER=host.docker.internal

docker-compose.yml파일에는 다음이 있습니다.

version: '3'

services:
  api:
    build: ./api
    volumes:
      - ./api:/usr/src/app:ro
    ports:
      - "8000"
    environment:
      - MONGO_SERVER
    command: /usr/local/bin/gunicorn -c /usr/src/app/gunicorn_config.py -w 1 -b :8000 wsgi

2
@allanberry 불행히도 Docker 사람들은 의도하지 않은 사용 사례를 수용하지 않기 때문에 플랫폼 독립적 인 방법을 제공하지 않는 것을 선호합니다 (Docker 컨테이너에서 로컬 컴퓨터의 서비스에 액세스하는 것과 같은)
Andy

21
Build it once 와 같은 Docker에 소개되어 어디서나 실행됩니다. 그러나 항상 호스트 시스템을 구성해야하기 때문에 이것은 완전히 잘못된 것입니다. 그래서 docker.for.mac..대부분의 경우에 당신이 당신의 회사의 Linux- 또는 Mac 전용 환경을 가지고 있지 않기 때문에 쓸모가 없다. 혼합되어 있으며 Linux 및 Mac 및 Windows를 사용하는 개발자가 있습니다. 이 도메인은 99 %가 혼합 된 호스트 OS 환경이므로 의미가 없습니다. macOS에서 컨테이너를 개발하지 않고 macOS 서버에 배포합니다. Linux에 배포합니다. 이것이 모두의 일입니다. 그래서 요점은 docker.for.mac..무엇입니까?
TheFox

1
@allanberry docker.for.mac.host.internal는 Docker를 사용하거나 사용하지 않고 중요하지 않습니다 docker-compose. 구성 파일에서 고정 호스트를 사용하고 싶습니다. IDK는, 예를 들어 docker.host.internal, 어떤 항상 호스트의 IP 주소를 가리 킵니다. 사용중인 호스트 시스템에 관계없이 이것이 Docker를 사용하는 요점입니다. 자율적이기를 원합니다. 호스트 시스템과 컨테이너 사이에 다른 계층이 있기 때문에 macOS에서는 훨씬 까다 롭습니다. 그러나 어쨌든 docker.for.mac.host.internalmacOS에만 사용할 수 있다면 제 생각 에는 쓸모가 없습니다.
TheFox

1
host.docker.internal 적어도이 의견을 쓸 때 Docker for Windows 에서도 작동합니다 .
joanlofe 2016 년

1
이것은 완벽하게 작동합니다 .Windows 용 dockerCe가 있고 컨테이너 중 하나에서 jenkins를 실행합니다. jenkins 내에서 docker 명령을 실행하고 싶지만 docker가 클라우드 추가 단계에서 연결할 수 없었습니다 .tcp : //host.docker.internal : 2375를 사용하고 localhost : 2375의 'expose daemon'을 활성화했습니다. 많은 시간을 절약했습니다. 감사!
Vikash

84

업데이트 : Mac 용 Docker에서 버전 18.03부터 host.docker.internal 을 호스트의 IP로 사용할 수 있습니다 . allanberry의 답변을 참조하십시오 . Mac 용 Docker의 이전 버전에서는 다음과 같은 대답이 여전히 유용 할 수 있습니다.

Mac 용 Docker에는 docker0브리지가 없으므로 다른 답변이 작동하지 않을 수 있습니다. 그러나 모든 나가는 트래픽은 부모 호스트를 통해 라우팅되므로 IP에 연결하려고 시도하는 한 자체적으로 인식되고 Docker 컨테이너는 자신을 생각하지 않습니다. 연결할 수 있어야합니다. 예를 들어 상위 머신에서 이것을 실행하는 경우 :

ipconfig getifaddr en0

현재 네트워크에있는 Mac의 IP가 표시되고 도커 컨테이너도이 주소에 연결할 수 있어야합니다. 이 IP 주소가 변경되면 당연히 고통 스럽지만 부모 컴퓨터에서 다음과 같은 작업을 수행하여 컨테이너 자체가 아니라고 생각하는 사용자 정의 루프백 IP를 Mac에 추가 할 수 있습니다.

sudo ifconfig lo0 alias 192.168.46.49

그런 다음 텔넷을 사용하여 도커 컨테이너 내에서 연결을 테스트 할 수 있습니다. 제 경우에는 원격 xdebug 서버에 연결하고 싶었습니다.

telnet 192.168.46.49 9000

이제 트래픽이 192.168.46.49로 지정된 Mac으로 들어오고 컨테이너를 떠나는 모든 트래픽이 Mac을 통과하면 Mac은 IP 자체라고 가정합니다. 이 IP 사용을 마치면 다음과 같이 루프백 별명을 제거 할 수 있습니다.

sudo ifconfig lo0 -alias 192.168.46.49

주의해야 할 점은 도커 컨테이너가 트래픽의 대상이 자신이라고 생각하면 부모 호스트에 트래픽을 보내지 않는다는 것입니다. 따라서 문제가 발생하면 컨테이너 내부의 루프백 인터페이스를 확인하십시오.

sudo ip addr show lo

필자의 경우 inet 127.0.0.1/8이는 127.*범위 내의 IP를 사용할 수 없음을 나타 냅니다. 그래서 192.168.*위의 예에서 사용 했습니다. 사용하는 IP가 자신의 네트워크에있는 것과 충돌하지 않는지 확인하십시오.


시스템 재시작 후 이러한 루프백 설정을 정리합니까?
Robbo_UK

@Robbo_UK 예, Mac을 다시 시작하면 루프백 별칭이 사라집니다.
코드 사령관

1
이 호스트 이름의 사용은 Docker for Linux에서 작동하지 않으므로 의미가 없습니다. 왜 Linux 용으로 추가하지 않았습니까?
TheFox

그들은 지금이 순간 @TheFox 그것을 조사하고 있습니다 : github.com/docker/libnetwork/pull/2348
이보 페레이라

46

AWS에서 Docker를 실행하는 경우 컨테이너의 내부에서 호스트 의 인스턴스 메타 데이터 를 계속 사용할 수 있습니다.

curl http://169.254.169.254/latest/meta-data/local-ipv4

예를 들면 다음과 같습니다.

$ docker run alpine /bin/sh -c "apk update ; apk add curl ; curl -s http://169.254.169.254/latest/meta-data/local-ipv4 ; echo"
fetch http://dl-cdn.alpinelinux.org/alpine/v3.3/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.3/community/x86_64/APKINDEX.tar.gz
v3.3.1-119-gb247c0a [http://dl-cdn.alpinelinux.org/alpine/v3.3/main]
v3.3.1-59-g48b0368 [http://dl-cdn.alpinelinux.org/alpine/v3.3/community]
OK: 5855 distinct packages available
(1/4) Installing openssl (1.0.2g-r0)
(2/4) Installing ca-certificates (20160104-r2)
(3/4) Installing libssh2 (1.6.0-r1)
(4/4) Installing curl (7.47.0-r0)
Executing busybox-1.24.1-r7.trigger
Executing ca-certificates-20160104-r2.trigger
OK: 7 MiB in 15 packages
172.31.27.238

$ ifconfig eth0 | grep -oP 'inet addr:\K\S+'
172.31.27.238

이것은 AWS를 사용하는 사람들에게 매우 편리한 방법입니다. 이것을 사용하여 Consul 에이전트의 클라이언트 및 바인드 주소를 구성합니다. Elastic Beanstalk 및 ECS에 컨테이너 배포와 같이 호스트 네트워킹을 사용할 수없는 상황에 적합합니다.
Richard Clayton

이것은 생명의 은인입니다. 감사합니다. ECS 클러스터에서 컨테이너 간 통신을 처리하는 방법을 알아내는 데 어려움이있었습니다.
Brennan

Phusion basimage (우분투 기반)에서 나는 당신의 명령을 약간 변경해야했습니다.ifconfig eth0 | grep -oP 'inet \K\S+'
Meuoi

25

유일한 방법은 컨테이너를 만들 때 호스트 정보를 환경으로 전달하는 것입니다

run --env <key>=<value>

19
:보다 구체적으로, 브리지 IP 주소는 명령 행 옵션과 같은 사용하여 전달 될 수있다 -e "DOCKER_HOST=$(ip -4 addr show docker0 | grep -Po 'inet \K[\d.]+')"(에서 허용 대답 사용 unix.stackexchange.com/questions/87468/...를 )
ncoghlan

7
Docker for Mac / Windows에서는 작동하지 않는다고 생각합니다. (브리지 IP)
zx1986

22

--add-host더 청소기 솔루션이 될 수있다 (그러나 포트 부분없이 목적으로 만 호스트는이 솔루션을 처리 할 수 있습니다). 따라서 귀하의 docker run명령으로 다음과 같이하십시오.

docker run --add-host dockerhost:`/sbin/ip route|awk '/default/ { print  $3}'` [my container]

( https://stackoverflow.com/a/26864854/127400에서 )


다른 누군가가 / etc / hosts에 항목을 원할 때 "만들기"라고 말했습니다. 이 질문에서 그것은 사실이 아닙니다. 또한 OP는 "호스트 및 포트 맵"을 요청했으며 호스트 만 다뤘습니다.
Bryan

확인. 수용 된 솔루션이 호스트 부분 만 다루기 때문에 약간 혼란 스러웠습니다. 그리고 귀하의 솔루션이 spinus 솔루션보다 우수하다고 생각합니다.
Augunrik

dind-docker-in-docker를 사용하려는 경우에는 작동하지 않습니다. 내부 도커는 다른 IP를 가질 것입니다
시끄러운

12

자동으로 수행하고자하는 대부분의 응용 프로그램에 대한 표준 것이 가장 좋습니다 : 그렇지 . 대신 컨테이너를 실행하는 사람이 외부 호스트 이름 / IP 주소를 구성 (예 : 환경 변수 또는 구성 파일)으로 주입합니다. 사용자가 이것을 주입하도록 허용하면 가장 휴대하기 쉬운 디자인이됩니다.

왜 이렇게 어려운가요? 컨테이너는 설계 상 호스트 환경과 응용 프로그램을 분리하기 때문입니다. 네트워크는 기본적으로 해당 컨테이너에 네임 스페이스로 지정되며 호스트의 세부 정보는 컨테이너 내부에서 실행되는 프로세스로부터 완전히 신뢰되지 않을 수 있습니다.


특정 상황에 따라 다른 옵션이 있습니다.

컨테이너가 호스트 네트워킹으로 실행중인 경우 호스트의 라우팅 테이블을 직접보고 기본 경로를 확인할 수 있습니다. 에서 이 질문에 나를 예는 다음 작품 :

ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p'

컨테이너의 호스트 네트워킹에서이를 보여주는 예는 다음과 같습니다.

docker run --rm --net host busybox /bin/sh -c \
  "ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p'"

Docker Desktop의 일부 버전에서는 내장 VM에 DNS 항목을 삽입했습니다.

getent hosts host.docker.internal | awk '{print $1}'

클라우드 환경에서 실행중인 경우 클라우드 공급자 (예 : AWS)에서 메타 데이터 서비스를 확인할 수 있습니다.

curl http://169.254.169.254/latest/meta-data/local-ipv4

외부 / 인터넷 주소를 원하는 경우 다음과 같은 원격 서비스를 쿼리 할 수 ​​있습니다.

curl ifconfig.co

이들 각각에는 한계가 있으며 특정 시나리오에서만 작동합니다. 가장 이식성이 좋은 옵션은 IP 주소를 구성으로 주입하여 컨테이너를 실행하는 것입니다. 예를 들어 ip호스트 에서 이전 명령을 실행하고 환경 변수로 주입 하는 옵션 이 있습니다.

export HOST_IP=$(ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p')
docker run --rm -e HOST_IP busybox printenv HOST_IP

정말 유용한 curl ifconfig.co명령 .. 감사합니다 :)
MadAboutProgramming

8

실제 IP주소 (다리가 아닌 IP)를 원 Windows하고 도커 18.03(또는 최신)가있는 경우 다음을 수행하십시오.

이미지 이름이 nginx(작동하는 Alpine Linux distribution) 호스트의 컨테이너에서 bash를 실행하십시오 .

 docker run -it nginx /bin/ash

그런 다음 컨테이너 내부를 실행하십시오.

/ # nslookup host.docker.internal

Name:      host.docker.internal
Address 1: 192.168.65.2

192.168.65.2spinus허용 된 답변 과 같이 브리지 IP가 아닌 호스트의 IP 입니다.

나는 여기서 host.docker.internal을 사용하고 있습니다 :

호스트의 IP 주소가 변경되었습니다 (또는 네트워크에 액세스 할 수없는 경우 없음). 18.03부터는 권장 DNS 이름 host.docker.internal에 연결하여 호스트에서 사용하는 내부 IP 주소로 확인하는 것이 좋습니다. 이것은 개발 용이며 Docker for Windows 이외의 프로덕션 환경에서는 작동하지 않습니다.


2
나는 당신에게 해결책을 시도하고 nslookup 명령을 찾을 수없는 것 같습니다
Sergey

@Sergey 이미지가 기반 Alpine Linux입니까? 그렇지 않은 경우 특정에 해당하는 항목을 확인하십시오 linux distribution.
Kamil Witkowski

아니, 난 당신의 명령을 정확하게 사용합니다-docker run -it nginx / bin / ash
Sergey

Ok-당신이 창문에 있다면, 나는 스위치로 전환하고 사용 linux containers하고 있지 않습니다 windows containers. 마우스 오른쪽 버튼을 클릭 docker icon하고을 선택 하면 Switch to Linux containers됩니다. 나는 당신이 이미지를 다운로드 할 때 중요 할 수 있다고 생각합니다. 당신이 있다면 windows container확인 된 삭제하면 nginx이미지를 당신에게 다른 컨테이너를 얻을 것이다 다시 다운로드. 그래도 문제가 해결되지 않으면에 설치 nslookup하십시오 ash.
Kamil Witkowski

nslookup을 수행 할 수 없으면 핑만 수행하십시오. 확인 된 IP가 표시됩니다. 나를 위해이 답변이 작동하고, 난 그냥이 호스트 이름을 (사용하고 host.docker.internal용기 내부에서)
드미트리 Minkovsky

7

Mac 및 Windows 용 TLDR

docker run -it --rm alpine nslookup host.docker.internal

... 호스트의 IP 주소를 인쇄합니다 ...

nslookup: can't resolve '(null)': Name does not resolve

Name:      host.docker.internal
Address 1: 192.168.65.2

세부

윈도우 , 당신은 특별한 DNS 이름을 사용할 수 있습니다 host.docker.internal.

호스트의 IP 주소가 변경되었습니다 (또는 네트워크에 액세스 할 수없는 경우 없음). 18.03부터는 권장 DNS 이름 host.docker.internal에 연결하여 호스트에서 사용하는 내부 IP 주소로 확인하는 것이 좋습니다. 이것은 개발 용이며 Mac 용 Docker Desktop 외부의 프로덕션 환경에서는 작동하지 않습니다.


1
여러 질문에 동일한 답변을 추가하지 마십시오 . 충분한 평판을 얻으면 가장 좋은 것에 대답하고 나머지는 중복으로 표시하십시오. 복제본이 아닌 경우 게시물을 질문에 맞게 조정하고 삭제를 위해 플래그를 지정하십시오.
Bhargav Rao

6

Mac 용 Docker 컨테이너에서 호스트의 서비스로 연결하고 싶습니다.

호스트의 IP 주소가 변경되었습니다 (또는 네트워크에 액세스 할 수없는 경우 없음). 18.03부터는 권장 DNS 이름 host.docker.internal에 연결하여 호스트에서 사용하는 내부 IP 주소로 확인하는 것이 좋습니다.

게이트웨이는 gateway.docker.internal로도 접근 할 수 있습니다. https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds


5

docker remote API 를 활성화하고 (예를 통해 ) 호스트 시스템의 호스트 이름 또는 IP 주소를 알고 있다면 많은 bash로 수행 할 수 있습니다.-Htcp://0.0.0.0:4243

내 컨테이너 사용자 내 bashrc:

export hostIP=$(ip r | awk '/default/{print $3}')
export containerID=$(awk -F/ '/docker/{print $NF;exit;}' /proc/self/cgroup)
export proxyPort=$(
  curl -s http://$hostIP:4243/containers/$containerID/json |
  node -pe 'JSON.parse(require("fs").readFileSync("/dev/stdin").toString()).NetworkSettings.Ports["DESIRED_PORT/tcp"][0].HostPort'
)

두 번째 줄은 로컬 /proc/self/cgroup파일 에서 컨테이너 ID를 가져옵니다 .

세 번째 줄은 호스트 컴퓨터로 말려 들어갑니다 (4243을 도커 포트로 사용한다고 가정) DESIRED_PORT.


포트 전달을 사용하는 경우에만 적용됩니다. 실제로 HostPort여기에 유용한 정보가 될 수 있습니다, 불행하게도이 HostIp있을 수 있습니다0.0.0.0
Arnout Engelen

4

우분투 16.03이 있습니다. 나를 위해

docker run --add-host dockerhost:`/sbin/ip route|awk '/default/ { print  $3}'` [image]

작동하지 않습니다 (잘못된 IP 생성 중)

내 작업 솔루션은 다음과 같습니다.

docker run --add-host dockerhost:`docker network inspect --format='{{range .IPAM.Config}}{{.Gateway}}{{end}}' bridge` [image]

3

AWS에서 Docker를 실행하는 사람들을위한 또 다른 옵션이 있습니다. 이 옵션은 컬 패키지를 추가하기 위해 apk를 사용하지 않고 소중한 7MB의 공간을 절약합니다. 내장 wget (모 놀리 식 BusyBox 바이너리의 일부)을 사용하십시오.

wget -q -O - http://169.254.169.254/latest/meta-data/local-ipv4

3

AFAIK, Docker for Linux (표준 배포) 의 경우 호스트의 IP 주소는 항상입니다 172.17.0.1 .

가장 쉬운 방법 ifconfig은 호스트에서 (인터페이스 docker0)을 사용하는 것입니다.

ifconfig

도커 내부에서 도커의 다음 명령 : ip -4 route show default | cut -d" " -f3

다음 명령 줄을 사용하여 도커에서 빠르게 실행할 수 있습니다.

# 1. Run an ubuntu docker
# 2. Updates dependencies (quietly)
# 3. Install ip package   (quietly)
# 4. Shows (nicely) the ip of the host
# 5. Removes the docker (thanks to `--rm` arg)
docker run -it --rm ubuntu:19.10 bash -c "apt-get update && apt-get install iproute2 -y && ip -4 route show default | cut -d' ' -f3"

도움이 되길 바랍니다.


2

리눅스에서 당신은 실행할 수 있습니다

HOST_IP=`hostname -I | awk '{print $1}'`

macOS에서 호스트 시스템은 Docker 호스트가 아닙니다. Docker는 VirtualBox에 호스트 OS를 설치합니다.

HOST_IP=`docker run busybox ping -c 1 docker.for.mac.localhost | awk 'FNR==2 {print $4}' | sed s'/.$//'`

1
첫 번째 코드 블록은 호스트 IP가 아닌 컨테이너 IP를 가져옵니다.
Ari

mandoc of hostname -I는 "출력 순서에 대해 어떤 가정도하지 말라"고 경고합니다.
cannot_mutably_borrow

1

이는 위에서 언급 한 EC2 메타 데이터 인스턴스를 사용하여 AWS EC2 인스턴스 에서 호스트를 실행하는 사용자를위한 Node.js 의 최소 ​​구현입니다.

const cp = require('child_process');
const ec2 = function (callback) {
    const URL = 'http://169.254.169.254/latest/meta-data/local-ipv4';
    // we make it silent and timeout to 1 sec
    const args = [URL, '-s', '--max-time', '1'];
    const opts = {};
    cp.execFile('curl', args, opts, (error, stdout) => {
        if (error) return callback(new Error('ec2 ip error'));
        else return callback(null, stdout);
    })
        .on('error', (error) => callback(new Error('ec2 ip error')));
}//ec2

로 사용

ec2(function(err, ip) {
        if(err) console.log(err)
        else console.log(ip);
    })


0

내가하는 방법은 다음과 같습니다. 이 경우, taurus-host를 가리키는 docker 이미지 내의 / etc / hosts에 호스트 항목을 로컬 시스템 IP :에 추가합니다.

TAURUS_HOST=`ipconfig getifaddr en0`
docker run -it --rm -e MY_ENVIRONMENT='local' --add-host "taurus-host:${TAURUS_HOST}" ...

그런 다음 Docker 컨테이너 내에서 스크립트는 호스트 이름 taurus-host를 사용하여 docker 컨테이너를 호스팅하는 로컬 컴퓨터로 이동할 수 있습니다.



0

내가 사용하는 솔루션은 http 요청을받을 때 Docker 호스트의 외부 주소를 반환하는 "서버"를 기반으로합니다.

"서버"에서 :

1) jwilder / nginx-proxy를 시작하십시오

# docker run -d -p <external server port>:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy

2) ipify 컨테이너 시작

# docker run -e VIRTUAL_HOST=<external server name/address> --detach --name ipify osixia/ipify-api:0.1.0

컨테이너가 서버에 http 요청을 보낼 때

# curl http://<external server name/address>:<external server port>

Docker 호스트의 IP 주소는 http 헤더 "X-Forwarded-For"를 통해 ipify에 의해 반환됩니다.

예 (ipify 서버의 이름은 "ipify.example.com"이며 포트 80에서 실행되며 docker 호스트의 IP는 10.20.30.40입니다.)

# docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy
# docker run -e VIRTUAL_HOST=ipify.example.com --detach --name ipify osixia/ipify-api:0.1.0

컨테이너 내부에서 다음을 호출 할 수 있습니다.

# curl http://ipify.example.com
10.20.30.40


-2

Ubuntu에서 hostnamecommand는 다음 옵션과 함께 사용할 수 있습니다.

  • -i, --ip-address 호스트 이름 주소
  • -I, --all-ip-addresses호스트의 모든 주소

예를 들면 다음과 같습니다.

$ hostname -i
172.17.0.2

변수에 할당하기 위해 다음과 같은 단일 라이너를 사용할 수 있습니다.

IP=$(hostname -i)

호스트가 아닌 Docker 컨테이너의 IP 주소를 제공합니다.
Mario Camou

-7

https://docs.docker.com/machine/install-machine/

a) $ 도커 머신 IP

b) 하나 이상의 머신의 IP 주소를 얻습니다.

  $ docker-machine ip host_name

  $ docker-machine ip host_name1 host_name2

10
이 검색하는 고정 표시기 용기, 컨테이너가있는 호스트의 IP를 실행하지 않는 것이 실행되는 가상 머신의 IP.
스펜서 윌리엄스

2
이것은 docker-machine에서 실행되는 docker에만 적용됩니다. mac 용 새 docker는 docker-machine에서 실행되지 않습니다.
thomas.han
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.