Как получить IP-адрес хоста docker из контейнера docker
13 ответов
/sbin/ip route|awk '/default/ { print }'
Как заметил @MichaelNeale, нет смысла использовать этот метод в Dockerfile
(за исключением случаев, когда нам нужен этот IP только во время сборки), потому что этот IP будет жестко закодирован во время сборки.
On Docker для Mac, начиная с версии 18.03, вы можете использовать host.docker.internal
как IP хоста.
Примечание, как в документация, " это для целей разработки[s] и не будет работать в производственной среде за пределами Docker для Mac."Это потому, что в Docker для Mac "вы не можете увидеть интерфейс docker0 на хосте. Этот интерфейс фактически находится внутри виртуальной машины."
это обновление от docker.for.mac.localhost
, доступен, начиная с версии 17.06, и docker.for.mac.host.internal
, доступно с версии 17.12, которая также может работать.
например, у меня есть переменные среды, установленные на моем хосте:
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
Обновление: On настройки для Mac, начиная с версии 18.03, вы можете использовать хоста.докер.внутренний как IP хоста. См.allanberry это!--15-->. Для предыдущих версий Docker для Mac может быть полезен следующий ответ:
на Docker для Mac docker0
мост не существует, поэтому другие ответы здесь могут не работать. Однако весь исходящий трафик маршрутизируется через родительский хост, поэтому, пока вы пытаетесь подключиться к IP-адресу, он распознает как сам по себе (и контейнер docker не думает, что это сам по себе), вы должны быть в состоянии подключиться. Например, если вы запустите это с родительского компьютера, запустите:
ipconfig getifaddr en0
это должно показать вам IP вашего Mac в его текущей сети, и ваш контейнер docker также должен иметь возможность подключиться к этому адресу. Это, конечно, боль, если этот IP-адрес когда-либо изменится, но вы можете добавить пользовательский петлевой IP-адрес на свой Mac, который контейнер не думает, что сам по себе, делая что-то вроде этого родительская машина:
sudo ifconfig lo0 alias 192.168.46.49
затем вы можете проверить соединение из контейнера docker с telnet. В моем случае я хотел подключиться к удаленному серверу xdebug:
telnet 192.168.46.49 9000
теперь, когда трафик входит в ваш Mac, адресованный для 192.168.46.49 (и весь трафик, выходящий из вашего контейнера, проходит через ваш Mac), ваш Mac будет считать, что IP-это сам. Когда вы закончите использовать этот IP, вы можете удалить псевдоним loopback как это:
sudo ifconfig lo0 -alias 192.168.46.49
одна вещь, о которой нужно быть осторожным, заключается в том, что контейнер docker не будет отправлять трафик родительскому хосту, если он думает, что назначение трафика само по себе. Поэтому проверьте интерфейс loopback внутри контейнера, если у вас возникли проблемы:
sudo ip addr show lo
в моем случае, это показал inet 127.0.0.1/8
что означает, что я не мог использовать IPs в
для тех, кто работает Docker в AWS,метаданные экземпляра для хоста по-прежнему доступен изнутри контейнера.
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
единственный способ-передать информацию о хосте в качестве среды при создании контейнера
run --env <key>=<value>
на --add-host
может быть более чистым решением (но без части порта только хост может быть обработан этим решением). Итак, в вашем docker run
команда, сделайте что-то вроде:
docker run --add-host dockerhost:`/sbin/ip route|awk '/default/ { print }'` [my container]
Docker для Mac Я хочу подключиться из контейнера к службе на узле
хост имеет изменяющийся IP-адрес (или нет, если у вас нет доступа к сети). С 18.03 и далее наша рекомендация-подключиться к специальному хосту DNS-имен.докер.внутренний, который разрешает внутренний IP-адрес, используемый хостом.
шлюз также доступен как ворота.докер.внутренний. https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds
если вы включили docker удаленный API (via -H
tcp://0.0.0.0:4243
например) и знать имя хоста или IP-адрес хост-машины это можно сделать с большим количеством bash.
в пределах пользователя моего контейнера bashrc
:
export hostIP=$(ip r | awk '/default/{print }')
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'
)
вторая строка захватывает идентификатор контейнера из вашего локального .
Третья строка сворачивается к хост-машине (предполагая, что вы используете 4243 в качестве порта докера), затем использует узел для анализа вернулся JSON для DESIRED_PORT
.
вот еще один вариант для тех, кто работает Docker в AWS. Этот параметр позволяет избежать использования apk для добавления пакета curl и экономит драгоценный 7 МБ пространства. Используйте встроенный wget (часть монолитного двоичного файла BusyBox):
wget -q -O - http://169.254.169.254/latest/meta-data/local-ipv4
в linux вы можете запустить
HOST_IP=`hostname -I | awk '{print }'`
в macOS ваш хост-компьютер не является хостом Docker. Docker установит свою хост-ОС в VirtualBox.
HOST_IP=`docker run busybox ping -c 1 docker.for.mac.localhost | awk 'FNR==2 {print }' | sed s'/.$//'`
Если вы используете контейнер Windows в кластере Service Fabric, IP-адрес хоста доступен через переменную среды Fabric_NodeIPOrFQDN
. переменные среды Service Fabric
вот как я это делаю. В этом случае он добавляет запись hosts в /etc / hosts в образ docker, указывающий taurus-host на мой локальный компьютер 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://docs.docker.com/machine/install-machine/
a) $ docker-machine ip
b) получить IP-адрес одной или нескольких машин.
$ docker-machine ip host_name
$ docker-machine ip host_name1 host_name2