wake-up-neo.com

Kann ich eine IP-Adresse in meinem Docker-Container erhalten?

Wie bekomme ich eine Container-IP-Adresse in diesen Container?

'docker inspect $ hostname ...' ist nicht geeignet, da ich die /var/run/docker.sock Host-Datei nicht mit dem Container teilen kann.

26
Kroid

Da sich die IP-Adresse in der ersten Zeile von/etc/hosts befindet, können Sie in einem Container den Befehl awk ausführen, der das erste Word der ersten Zeile von/etc/hosts druckt

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

24
user2915097

Ich kann die IP-Adresse mit finden

hostname -i

Das kann natürlich nicht ganz genau sein, wenn es mehr als eine Schnittstelle gibt.

Bearbeiten

Hinweis: Gemäß der Manpage hostname verwendet hostname -i die IP-Adresse mithilfe von DNS, wobei hostname -I alle Adressen außer Loopback anzeigt, nicht von DNS abhängig ist und empfohlen wird.

In allen meinen Docker-Containern geben -i und -I die gleichen Ergebnisse zurück (dies ist jedoch auf meinem Desktop nicht der Fall).

56
Victor Roetman

Warum nicht so einfach wie:

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

oder

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

Normalerweise können Sie das Linux-Programm ifconfig verwenden, um IP-Adressen und andere Netzwerkdetails abzurufen. In Ihrem Container ist es möglicherweise nicht vorhanden. In diesem Fall müssen Sie ihn über apt-get oder yum oder den Paketmanager Ihrer Distribution installieren. Eine grundlegende Pipeline zum Abrufen der IP-Adresse wäre 

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

Dies kann bei einigen Containern funktionieren, wenn der Befehl "hostname" verwendet wird.

Docker ps um die (Container ID) zu erhalten

Docker Exec -it (Container-ID) Hostname -i

1
user11231877

Ich habe eine Lösung für mein Problem gefunden:

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

Es ist etwas wie "172.17.0.135" gedruckt.

1
Kroid

Wenn Sie lieber ip anstelle von ifconfig verwenden, können Sie unter Linux Folgendes tun:

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

Dies holt einfach all der IP-Adressen und Schnittstellen, sucht nur nach denjenigen, die mit inet beginnen, und gibt nur die 3. Spalte zurück.

Als schöner Nebeneffekt beinhaltet dies auch die Subnetzmaske! (z. B. 172.17.0.2/16)

Wenn Sie die Subnetzmaske nicht möchten, können Sie Folgendes verwenden:

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

HINWEIS: Dies zeigtALLEder IPs im Container. Sie können awk oder sed verwenden, um 127.0.0.1/16 und andere unerwünschte IP-Adressen zu entfernen. :)

0
XtraSimplicity

Sie könnten auch in/etc/hosts nach einer Zeile suchen, die mit einer Container-ID endet, und das erste Feld drucken:

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

Ich würde awk verwenden, aber Standard-awk in dedian: Jessie unterstützt keine Regex-Quantifizierer wie {12,}.

0
Cole Tierney
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.]+'"
0
Quinn Vissak