Как получить IP-адрес хоста docker из контейнера docker

Как говорится в названии. Мне нужно иметь возможность получить IP-адрес хостов docker и portmaps от хоста к контейнеру и сделать это внутри контейнера.

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]

(от https://stackoverflow.com/a/26864854/127400)


Docker для Mac Я хочу подключиться из контейнера к службе на узле

хост имеет изменяющийся IP-адрес (или нет, если у вас нет доступа к сети). С 18.03 и далее наша рекомендация-подключиться к специальному хосту DNS-имен.докер.внутренний, который разрешает внутренний IP-адрес, используемый хостом.

шлюз также доступен как ворота.докер.внутренний. https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds


если вы включили docker удаленный API (via -Htcp://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