제목대로 도 커가 호스트하는 IP 주소와 호스트에서 컨테이너로 포트 맵을 검색하고 컨테이너 내부에서 IP 주소를 검색 할 수 있어야합니다.
제목대로 도 커가 호스트하는 IP 주소와 호스트에서 컨테이너로 포트 맵을 검색하고 컨테이너 내부에서 IP 주소를 검색 할 수 있어야합니다.
답변:
/sbin/ip route|awk '/default/ { print $3 }'
@MichaelNeale에서 알 수 있듯이이 Dockerfile
IP는 빌드 시간 동안 하드 코딩되므로 빌드 시간 동안이 IP가 필요한 경우를 제외하고는 이 방법을 사용하는 것이 의미가 없습니다 .
버전 18.03부터는 host.docker.internal
호스트 IP로 사용할 수 있습니다 .
의 작품 Mac 용 부두 노동자 , Windows 용 부두 노동자 , 그리고 아마도 다른 플랫폼뿐만 아니라.
이 업데이트는 docker.for.mac.localhost
17.06 이후 버전 및 docker.for.mac.host.internal
17.12 이후 버전 의 Mac 전용 업데이트 이며 해당 플랫폼에서도 작동합니다.
Mac 및 Windows 설명서에서 와 같이 개발 목적으로 만 사용됩니다.
예를 들어 호스트에 환경 변수가 설정되어 있습니다.
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
docker.for.mac..
대부분의 경우에 당신이 당신의 회사의 Linux- 또는 Mac 전용 환경을 가지고 있지 않기 때문에 쓸모가 없다. 혼합되어 있으며 Linux 및 Mac 및 Windows를 사용하는 개발자가 있습니다. 이 도메인은 99 %가 혼합 된 호스트 OS 환경이므로 의미가 없습니다. macOS에서 컨테이너를 개발하지 않고 macOS 서버에 배포합니다. Linux에 배포합니다. 이것이 모두의 일입니다. 그래서 요점은 docker.for.mac..
무엇입니까?
docker.for.mac.host.internal
는 Docker를 사용하거나 사용하지 않고 중요하지 않습니다 docker-compose
. 구성 파일에서 고정 호스트를 사용하고 싶습니다. IDK는, 예를 들어 docker.host.internal
, 어떤 항상 호스트의 IP 주소를 가리 킵니다. 사용중인 호스트 시스템에 관계없이 이것이 Docker를 사용하는 요점입니다. 자율적이기를 원합니다. 호스트 시스템과 컨테이너 사이에 다른 계층이 있기 때문에 macOS에서는 훨씬 까다 롭습니다. 그러나 어쨌든 docker.for.mac.host.internal
macOS에만 사용할 수 있다면 제 생각 에는 쓸모가 없습니다.
업데이트 : 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가 자신의 네트워크에있는 것과 충돌하지 않는지 확인하십시오.
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
ifconfig eth0 | grep -oP 'inet \K\S+'
유일한 방법은 컨테이너를 만들 때 호스트 정보를 환경으로 전달하는 것입니다
run --env <key>=<value>
-e "DOCKER_HOST=$(ip -4 addr show docker0 | grep -Po 'inet \K[\d.]+')"
(에서 허용 대답 사용 unix.stackexchange.com/questions/87468/...를 )
은 --add-host
더 청소기 솔루션이 될 수있다 (그러나 포트 부분없이 목적으로 만 호스트는이 솔루션을 처리 할 수 있습니다). 따라서 귀하의 docker run
명령으로 다음과 같이하십시오.
docker run --add-host dockerhost:`/sbin/ip route|awk '/default/ { print $3}'` [my container]
자동으로 수행하고자하는 대부분의 응용 프로그램에 대한 표준 것이 가장 좋습니다 : 그렇지 . 대신 컨테이너를 실행하는 사람이 외부 호스트 이름 / 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
명령 .. 감사합니다 :)
실제 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.2
spinus
허용 된 답변 과 같이 브리지 IP가 아닌 호스트의 IP 입니다.
나는 여기서 host.docker.internal을 사용하고 있습니다 :
호스트의 IP 주소가 변경되었습니다 (또는 네트워크에 액세스 할 수없는 경우 없음). 18.03부터는 권장 DNS 이름 host.docker.internal에 연결하여 호스트에서 사용하는 내부 IP 주소로 확인하는 것이 좋습니다. 이것은 개발 용이며 Docker for Windows 이외의 프로덕션 환경에서는 작동하지 않습니다.
Alpine Linux
입니까? 그렇지 않은 경우 특정에 해당하는 항목을 확인하십시오 linux distribution
.
linux containers
하고 있지 않습니다 windows containers
. 마우스 오른쪽 버튼을 클릭 docker icon
하고을 선택 하면 Switch to Linux containers
됩니다. 나는 당신이 이미지를 다운로드 할 때 중요 할 수 있다고 생각합니다. 당신이 있다면 windows container
확인 된 삭제하면 nginx
이미지를 당신에게 다른 컨테이너를 얻을 것이다 다시 다운로드. 그래도 문제가 해결되지 않으면에 설치 nslookup
하십시오 ash
.
host.docker.internal
용기 내부에서)
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 외부의 프로덕션 환경에서는 작동하지 않습니다.
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
docker remote API 를 활성화하고 (예를 통해 ) 호스트 시스템의 호스트 이름 또는 IP 주소를 알고 있다면 많은 bash로 수행 할 수 있습니다.-H
tcp://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
우분투 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]
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"
도움이 되길 바랍니다.
리눅스에서 당신은 실행할 수 있습니다
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'/.$//'`
hostname -I
는 "출력 순서에 대해 어떤 가정도하지 말라"고 경고합니다.
이는 위에서 언급 한 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);
})
Service Fabric 클러스터에서 Windows 컨테이너를 실행중인 경우 환경 변수를 통해 호스트의 IP 주소를 사용할 수 있습니다 Fabric_NodeIPOrFQDN
. 서비스 패브릭 환경 변수
내가하는 방법은 다음과 같습니다. 이 경우, 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 컨테이너를 호스팅하는 로컬 컴퓨터로 이동할 수 있습니다.
어쩌면 내가 만든 컨테이너도 유용합니다 https://github.com/qoomon/docker-host
컨테이너 이름 dns를 사용하여 호스트 시스템에 액세스 할 수 있습니다 (예 : curl http : // dockerhost : 9200 ). IP 주소를 사용하지 않아도됩니다.
내가 사용하는 솔루션은 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
이 시도
docker run --rm -i --net = host alpine ifconfig
Ubuntu에서 hostname
command는 다음 옵션과 함께 사용할 수 있습니다.
-i
, --ip-address
호스트 이름 주소-I
, --all-ip-addresses
호스트의 모든 주소예를 들면 다음과 같습니다.
$ hostname -i
172.17.0.2
변수에 할당하기 위해 다음과 같은 단일 라이너를 사용할 수 있습니다.
IP=$(hostname -i)
와 https://docs.docker.com/machine/install-machine/
a) $ 도커 머신 IP
b) 하나 이상의 머신의 IP 주소를 얻습니다.
$ docker-machine ip host_name
$ docker-machine ip host_name1 host_name2