Подтвердить что ты не робот

Могу ли я получить IP-адрес внутри контейнера докеров?

Как получить IP-адрес контейнера внутри этого контейнера?

'docker проверить $hostname...' не подходит, потому что я не передаю файл /var/run/docker.sock host в контейнер.

4b9b3361

Ответ 1

Поскольку IP-адрес находится в первой строке /etc/hosts, вы можете сделать в контейнере команду awk, которая печатает первое слово первой строки /etc/hosts

[email protected]:/$ awk 'END{print $1}' /etc/hosts 172.17.0.14

Ответ 2

Я могу найти IP-адрес с помощью

hostname -i

Конечно, это может быть не совсем точно, если имеется более одного интерфейса.

Edit

Примечание. В соответствии с главной страницей имени хоста, hostname -i использует DNS для разрешения IP-адреса, где hostname -i отображает все адреса, кроме loopback, не зависит от DNS и рекомендуется.

Во всех контейнерах Docker -i и -i возвращают те же результаты (но это не так на моем рабочем столе).

Ответ 3

Почему бы не просто так:

grep "`hostname`" /etc/hosts|awk '{print $1}'

или

grep "$HOSTNAME" /etc/hosts|awk '{print $1}'

Ответ 4

Обычно вы можете использовать программу linux ifconfig для получения IP-адресов и других сетевых сведений. Возможно, у вашего контейнера это нет, и в этом случае вам нужно будет установить его через apt-get или yum или ваш менеджер пакетов дистрибутива. Основным конвейером для получения IP-адреса будет

ifconfig eth0 | grep "inet addr:" | cut -d : -f 2 | cut -d " " -f 1

Ответ 5

Я нашел решение своей проблемы:

/sbin/ip route|awk '/scope/ { print $9 }'

Он печатает что-то вроде: '172.17.0.135'

Ответ 6

Вы также можете искать строку в /etc/hosts, которая заканчивается идентификатором контейнера, и печатать первое поле:

sed -n 's/^\([0-9\.]*\)[[:blank:]]*[0-9a-f]\{12,\}$/\1/p' /etc/hosts

Я бы использовал awk, но стандартный awk в dedian: jessie не поддерживает кванторы регулярных выражений, такие как {12,}.

Ответ 7

Если вы предпочитаете использовать ip а не ifconfig, в Linux вы можете сделать:

ip addr | grep inet | tr -s ' ' | cut -d ' ' -f 3

Он просто получает все IP-адреса и интерфейсы, ищет только те, которые начинаются с inet и возвращает только 3-й столбец.

Как хороший побочный эффект, это также включает маску подсети! (например, 172.17.0.2/16)

Если вы не хотите маску подсети, вы можете использовать:

ip addr | grep inet | tr -s ' ' | cut -d ' ' -f 3 | tr -d '/'

ПРИМЕЧАНИЕ. Здесь отображаются ВСЕ IP-адреса в контейнере. Вы можете использовать awk или sed для удаления 127.0.0.1/16 и других нежелательных IP-адресов. :)

Ответ 8

Это может работать на некоторых контейнерах, если в нем есть команда "hostname".

Докер PS, чтобы получить (идентификатор контейнера)

docker exec -it (идентификатор контейнера) имя хоста -i

Ответ 9

FROM alpine

# Upgrade grep so that it supports -Po flags
RUN apk add --no-cache --upgrade grep

ENV IPADDRESS "ip a show eth0 | grep -Po 'inet \K[\d.]+'"