Chciałbym poinformować mnie docker containers
o ich konfiguracji, tak samo jak można uzyskać informacje o instancjach EC2 poprzez metadane.
Mogę użyć (pod warunkiem, że docker
nasłuchuje na porcie 4243
)
curl http://172.17.42.1:4243/containers/$HOSTNAME/json
aby uzyskać część jego danych, ale chciałbym wiedzieć, czy istnieje lepszy sposób przynajmniej na uzyskanie pełnego identyfikatora kontenera, ponieważ HOSTNAME
jest on w rzeczywistości skrócony do 12 znaków, a docker wydaje się wykonywać na nim „najlepsze dopasowanie”.
Ponadto, jak mogę uzyskać zewnętrzny adres IP hosta dockera (inny niż dostęp do metadanych EC2, które są specyficzne dla AWS)
/var/run/docker.sock
, możliwe jest (trywialne) wyrwanie się z zabezpieczenia zapewnianego przez docker i uzyskanie dostępu do maszyny hosta. Oczywiście jest to potencjalnie niebezpieczne.Odpowiedzi:
Dowiedziałem się, że identyfikator kontenera można znaleźć w / proc / self / cgroup
Możesz więc uzyskać identyfikator za pomocą:
źródło
cat /proc/self/cgroup | grep "docker" | sed s/\\//\\n/g | tail -1
cat /proc/self/cgroup | grep 'docker' | sed 's/^.*\///' | tail -n1
cat /proc/1/cgroup | grep 'docker/' | tail -1 | sed 's/^.*\///' | cut -c 1-12
basename "$(cat /proc/1/cpuset)"
ibasename "$(head /proc/1/cgroup)"
O ile nie zostanie zastąpiona, nazwa hosta wydaje się być krótkim identyfikatorem kontenera w Docker 1.12
Zewnętrznie
źródło
const os = require('os'); console.log(os.hostname());
InetAddress.getLocalHost().getHostName()
.$HOSTNAME
(na przykład w skryptach powłoki).Z dockerem można się komunikować z wnętrza kontenera za pomocą gniazda unix poprzez Docker Remote API:
https://docs.docker.com/engine/reference/api/docker_remote_api/
W kontenerze możesz znaleźć zwarty identyfikator dockera, sprawdzając
$HOSTNAME
env var. Według doc. Istnieje mała szansa na kolizję, myślę, że przy małej ilości kontenerów nie trzeba się tym martwić. Nie wiem, jak bezpośrednio uzyskać pełny identyfikator.Możesz sprawdzić pojemnik w podobny sposób, jak opisano w odpowiedzi Banyana :
Odpowiedź:
Alternatywnie możesz przenieść identyfikator Dockera do kontenera w pliku. Plik znajduje się na „zamontowanym woluminie”, więc jest przenoszony do kontenera:
Identyfikator dockera (skrócony) będzie w pliku /mydir/host1.txt w kontenerze.
źródło
env
nie wymieniaHOSTNAME
, aleecho $HOSTNAME
działa.requests.exceptions.MissingSchema: Invalid URL '/containers/1d26a841bf07/json': No schema supplied. Perhaps you meant http:///containers/1d26a841bf07/json?
Spowoduje to pobranie pełnego identyfikatora kontenera z kontenera:
źródło
Najbardziej elegancko wygląda dla mnie komentarz Madeddie :
źródło
OSTRZEŻENIE: przed jej rozważeniem należy zrozumieć zagrożenia bezpieczeństwa związane z tą metodą . Podsumowanie ryzyka Johna :
Wewnątrz kontenera dockerId jest nazwą twojego hosta. Możesz więc:
--volume /var/run/docker.sock:/var/run/docker.sock --privileged
docker inspect $(hostname)
wewnątrz pojemnikaUnikajcie tego. Rób to tylko wtedy, gdy rozumiesz ryzyko i masz jasne środki zaradcze.
źródło
--hostname
została użyta opcja uruchamiania dockera .--hostname
jest ustawiona, możesz użyć kombinacji tej odpowiedzi i komentarza @Jay Taylor w zaakceptowanej odpowiedzi:docker inspect $(cat /proc/self/cgroup | grep 'docker' | sed 's/^.*\///' | tail -n1)
aby uzyskać wszystkie informacje o uruchomionym kontenerze.Aby to uprościć,
Aby uzyskać nazwę hosta,
lub
lub
Wyjście można przekierować do dowolnego pliku i odczytać z aplikacji Np .:
# hostname > /usr/src//hostname.txt
źródło
Odkryłem, że w 17.09 jest najprostszy sposób na zrobienie tego w kontenerze dockerowym:
Lub jak już powiedziano, krótsza wersja z
Lub po prostu:
źródło
Docker domyślnie ustawia nazwę hosta na identyfikator kontenera, ale użytkownicy mogą to zastąpić
--hostname
. Zamiast tego sprawdź/proc
:Oto przydatna jedna linijka do wyodrębnienia identyfikatora kontenera:
źródło
Możesz użyć tego wiersza polecenia, aby zidentyfikować bieżący identyfikator kontenera (przetestowany w Docker 1.9).
Następnie małe żądanie do Docker API (możesz udostępnić /var/run/docker.sock), aby pobrać wszystkie informacje.
źródło
Niektóre opublikowane rozwiązania przestały działać z powodu zmian w formacie
/proc/self/cgroup
. Oto pojedyncze polecenie GNU grep, które powinno być nieco bardziej odporne na zmiany formatu:Dla odniesienia, oto fragmenty / proc / self / cgroup z wewnątrz kontenerów docker, które zostały przetestowane za pomocą tego polecenia:
Linux 4.4:
Linux 4.8 - 4.13:
źródło
źródło
Na marginesie, jeśli masz pid kontenera i chcesz uzyskać identyfikator dockera tego kontenera, dobrym sposobem jest użycie nsenter w połączeniu z magią seda powyżej:
nsenter -n -m -t pid -- cat /proc/1/cgroup | grep -o -e "docker-.*.scope" | head -n 1 | sed "s/docker-\(.*\).scope/\\1/"
źródło
Użyj
docker inspect
.Można uzyskać ip w następujący sposób.
źródło