Eksploracja systemu plików kontenera Docker
Zauważyłem w dockerze, że muszę zrozumieć, co dzieje się wewnątrz kontenera lub jakie pliki tam istnieją. Jednym z przykładów jest pobieranie obrazów z indeksu Dockera - nie masz pojęcia, co zawiera obraz, więc nie można uruchomić aplikacji.
Co byłoby idealne, to być w stanie ssh do nich lub równoważne. Czy istnieje narzędzie do tego, czy moja koncepcja Dockera jest błędna w myśleniu, że powinienem być w stanie to zrobić.
27 answers
Oto kilka różnych metod...
A) użyj docker exec (najprostszy)
Docker w wersji 1.3 lub nowszej obsługuje polecenie exec
, które zachowuje się podobnie do nsenter
. Polecenie to może uruchomić nowy proces w już uruchomionym kontenerze(kontener musi mieć już uruchomiony proces PID 1). Możesz uruchomić /bin/bash
, aby zbadać stan kontenera:
docker exec -t -i mycontainer /bin/bash
Zobacz dokumentacja wiersza poleceń Dockera
B) Użyj Snapshotting
Możesz ocenić kontener system plików w ten sposób:
# find ID of your running container:
docker ps
# create image (snapshot) from container filesystem
docker commit 12345678904b5 mysnapshot
# explore this filesystem using bash (for example)
docker run -t -i mysnapshot /bin/bash
W ten sposób można ocenić system plików uruchomionego kontenera w określonym momencie czasu. Kontener nadal działa, nie uwzględniono żadnych przyszłych zmian.
Można później usunąć migawkę za pomocą (System plików uruchomionego kontenera nie jest naruszony!):
docker rmi mysnapshot
C) użyj ssh
Jeśli potrzebujesz ciągłego dostępu, możesz zainstalować sshd na swoim kontenerze i uruchomić demona sshd:
docker run -d -p 22 mysnapshot /usr/sbin/sshd -D
# you need to find out which port to connect:
docker ps
W ten sposób można uruchomić aplikację za pomocą ssh (connect and wykonaj co chcesz).
D) użyj nsenter
Użyj nsenter
, Zobacz dlaczego nie trzeba uruchamiać SSHd w kontenerach Docker
skrócona wersja to: z nsenter można dostać powłokę do istniejący kontener, nawet jeśli ten kontener nie uruchamia SSH lub jakiegokolwiek rodzaju daemon specjalnego przeznaczenia
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-12-02 11:08:21
UPDATE: EXPLORING!
To polecenie powinno pozwolić ci zbadać działający kontener Dockera :
docker exec -it name-of-container bash
Odpowiednikiem tego w docker-compose będzie:
docker-compose exec web bash
(web jest nazwą usługi w tym przypadku i domyślnie ma tty.)
Gdy już będziesz w środku do:
ls -lsa
Lub inne polecenie bash typu:
cd ..
To polecenie powinno pozwolić Ci zbadać obraz dokera :
docker run --rm -it --entrypoint=/bin/bash name-of-image
Once inside do:
ls -lsa
Lub inne polecenie bash typu:
cd ..
-it
oznacza interactive... i tty.
To polecenie powinno pozwolić Ci sprawdzić uruchomiony kontener dokera lub obraz :
docker inspect name-of-container-or-image
bash
lub sh
. Poszukaj entrypoint lub cmd w JSON return.
Uwaga: ta odpowiedź polega na obecności narzędzia commen, ale jeśli nie ma bash
powłoki lub popularne narzędzia, takie jak ls
present możesz najpierw dodać jeden w warstwie, jeśli masz dostęp do Dockerfile
:
przykład dla alpine:
RUN apk add --no-cache bash
W przeciwnym razie, jeśli nie masz dostępu do Dockerfile
, po prostu skopiuj pliki z nowo utworzonego kontenera i poszukaj ich wykonując:
docker create <image> # returns container ID the container is never started.
docker cp <container ID>:<source_path> <destination_path>
docker rm <container ID>
cd <destination_path> && ls -lsah
Zobacz docker Exec documentation
Zobacz docker-compose Exec documentation
Zobacz docker inspect documentation
Zobacz docker create dokumentacja
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-11-05 01:30:12
W przypadku, gdy kontener jest zatrzymany lub nie ma powłoki (np. hello-world
wymienione w poradniku instalacji , lub nie-alpine
traefik
), jest to prawdopodobnie jedyna możliwa metoda eksploracji systemu plików.
Możesz zarchiwizować system plików kontenera do pliku tar:
docker export adoring_kowalevski > contents.tar
Lub Lista plików:
docker export adoring_kowalevski | tar t
Należy pamiętać, że w zależności od obrazu, może to zająć trochę czasu i miejsca na dysku.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-15 12:20:10
System plików kontenera znajduje się w folderze danych Dockera, zwykle w /var/lib/docker. Aby uruchomić i sprawdzić działający system plików containers wykonaj następujące czynności:
hash=$(docker run busybox)
cd /var/lib/docker/aufs/mnt/$hash
I teraz bieżący katalog roboczy jest katalogiem głównym kontenera.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-29 12:19:17
Przed Utworzeniem Kontenera:
Jeśli chcesz zbadać strukturę obrazu zamontowanego wewnątrz kontenera, możesz to zrobić
sudo docker image save image_name > image.tar
tar -xvf image.tar
Daje to widoczność wszystkich warstw obrazu i jego konfiguracji, która jest obecna w plikach json.
Po utworzeniu kontenera:
Na to jest już wiele odpowiedzi powyżej. my preferred way to do to byłoby -
docker exec -t -i container /bin/bash
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-08 16:52:20
Najbardziej upvoted odpowiedź działa dla mnie, gdy kontener jest rzeczywiście uruchomiony, ale gdy nie jest możliwe, aby uruchomić i na przykład chcesz skopiować pliki z kontenera to zapisało mnie wcześniej:
docker cp <container-name>:<path/inside/container> <path/on/host/>
Dzięki docker CP (link) możesz kopiować bezpośrednio z kontenera tak, jak to było w każdej innej części Twojego systemu plików. Na przykład odzyskiwanie wszystkich plików wewnątrz kontenera:
mkdir /tmp/container_temp
docker cp example_container:/ /tmp/container_temp/
Zauważ, że nie musisz określać, że chcesz kopiować rekurencyjnie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-21 13:31:24
On Ubuntu 14.04 running Docker 1.3.1, I found the container root filesystem on the host machine in the following directory:
/var/lib/docker/devicemapper/mnt/<container id>/rootfs/
Pełna informacja o wersji Dockera:
Client version: 1.3.1
Client API version: 1.15
Go version (client): go1.3.3
Git commit (client): 4e9bbfa
OS/Arch (client): linux/amd64
Server version: 1.3.1
Server API version: 1.15
Go version (server): go1.3.3
Git commit (server): 4e9bbfa
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-13 16:39:31
Możesz użyć dive do interaktywnego wyświetlania zawartości obrazu za pomocą TUI
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-25 07:24:00
Spróbuj użyć
docker exec -it <container-name> /bin/bash
Istnieje możliwość, że bash nie jest zaimplementowany. do tego możesz użyć
docker exec -it <container-name> sh
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-31 12:48:14
Używam innego brudnego triku, który jest aufs / devicemapper agnostic.
Patrzę na komendę, że kontener działa np. docker ps
a jeśli jest to apache lub java
to po prostu robię co następuje:
sudo -s
cd /proc/$(pgrep java)/root/
I voilá jesteś wewnątrz pojemnika.
Zasadniczo Możesz jako root cd do folderu /proc/<PID>/root/
tak długo, jak ten proces jest uruchamiany przez kontener. Uwaga dowiązania symboliczne nie będą miały sensu używać tego trybu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-10 10:10:48
Najczęściej głosowana odpowiedź jest dobra, chyba że Twój kontener nie jest prawdziwym systemem Linux.
Wiele kontenerów (zwłaszcza tych opartych na go) nie ma standardowych binarnych (no /bin/bash
lub /bin/sh
). W takim przypadku będziesz musiał uzyskać bezpośredni dostęp do aktualnego pliku containers:
Działa jak czar:
name=<name>
dockerId=$(docker inspect -f {{.Id}} $name)
mountId=$(cat /var/lib/docker/image/aufs/layerdb/mounts/$dockerId/mount-id)
cd /var/lib/docker/aufs/mnt/$mountId
Uwaga: musisz uruchomić go jako root.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-11 23:14:33
W moim przypadku żadna powłoka nie była obsługiwana w kontenerze z wyjątkiem sh
. Więc, to działało jak urok
docker exec -it <container-name> sh
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-17 18:24:22
Tylko dla Linuksa
Najprostszym sposobem, którego używam, było użycie katalogu proc, czyli kontener musi być uruchomiony, aby sprawdzić pliki kontenera Dockera.
-
Znajdź identyfikator procesu (PID) kontenera i zapisz go do zmiennej
PID = $(Docker inspect-f' {{.Stan.Pid}} ' your-container-name-here)
-
Upewnij się, że proces kontenera jest uruchomiony i użyj nazwy zmiennej, aby dostać się do kontenera folder
Cd / proc / $PID / root
Jeśli chcesz przejść przez dir BEZ poznawania numeru PID , po prostu nam to długie polecenie
cd /proc/$(docker inspect -f '{{.State.Pid}}' your-container-name-here)/root
Porady:
Po wejściu do kontenera wszystko, co zrobisz, wpłynie na rzeczywisty proces kontenera, taki jak zatrzymanie usługi lub zmiana numeru portu.
Hope it helps
Uwaga:
Ta metoda działa tylko wtedy, gdy kontener jest nadal uruchomiony, w przeciwnym razie katalog przestałby istnieć, gdyby kontener został zatrzymany lub usunięty
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-06 07:56:27
Żadna z istniejących odpowiedzi nie odnosi się do przypadku kontenera, który się zakończył (i nie może zostać uruchomiony ponownie) i/lub nie ma zainstalowanej powłoki (np. bezstratnej). Ten działa tak długo, jak masz dostęp roota do hosta dokera.
Aby uzyskać prawdziwą kontrolę ręczną, najpierw znajdź identyfikatory warstw:
docker inspect my-container | jq '.[0].GraphDriver.Data'
W wyjściu powinieneś zobaczyć coś w rodzaju
"MergedDir": "/var/lib/docker/overlay2/03e8df748fab9526594cfdd0b6cf9f4b5160197e98fe580df0d36f19830308d9/merged"
Przejdź do tego folderu (jako root), aby znaleźć aktualny widoczny stan systemu plików kontenera.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-25 09:34:08
To uruchomi sesję bash dla obrazu:
Docker run --rm-it --entrypoint= / bin / bash
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-11 14:55:07
Dla mnie ten działa dobrze (dzięki ostatnim komentarzom za wskazanie katalogu / var / lib/docker/):
chroot /var/lib/docker/containers/2465790aa2c4*/root/
Tutaj, 2465790aa2c4 jest krótkim identyfikatorem działającego kontenera (wyświetlanym przez docker ps ), po którym następuje gwiazdka.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-15 08:18:36
W nowszych wersjach Dockera można uruchomić docker exec [container_name]
, który uruchamia powłokę wewnątrz kontenera
Więc aby uzyskać listę wszystkich plików w kontenerze wystarczy uruchomić docker exec [container_name] ls
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-11 10:56:19
Dla sterownika docker aufs:
Skrypt znajdzie katalog główny kontenera (Test na dockerze 1.7.1 i 1.10.3)
if [ -z "$1" ] ; then
echo 'docker-find-root $container_id_or_name '
exit 1
fi
CID=$(docker inspect --format {{.Id}} $1)
if [ -n "$CID" ] ; then
if [ -f /var/lib/docker/image/aufs/layerdb/mounts/$CID/mount-id ] ; then
F1=$(cat /var/lib/docker/image/aufs/layerdb/mounts/$CID/mount-id)
d1=/var/lib/docker/aufs/mnt/$F1
fi
if [ ! -d "$d1" ] ; then
d1=/var/lib/docker/aufs/diff/$CID
fi
echo $d1
fi
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-14 10:11:23
Ta odpowiedź pomoże tym (takim jak ja), którzy chcą zbadać system plików woluminu Dockera, nawet jeśli kontener nie jest uruchomiony.
Lista uruchomionych kontenerów Dockera:
docker ps
= > identyfikator kontenera "4c721f1985bd"
Spójrz na punkty montowania głośności dokera na lokalnej maszynie fizycznej ( https://docs.docker.com/engine/tutorials/dockervolumes/):
docker inspect -f {{.Mounts}} 4c721f1985bd
=> [{ /tmp /container-garren / tmp true rprivate}]
To mi mówi, że lokalny fizyczny katalog maszyn /tmp /container-garren jest mapowany do miejsca docelowego woluminu dokującego / tmp.
Znajomość lokalnego fizycznego katalogu maszyn (/tmp / container-garren) oznacza, że mogę zbadać system plików, czy kontener Dockera jest uruchomiony. Miało to kluczowe znaczenie, aby pomóc mi zrozumieć, że istnieją pewne szczątkowe dane, które nie powinny się utrzymywać nawet po tym, jak kontener nie był uruchomiony.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-21 19:43:24
Kolejną sztuczką jest użycie narzędzia atomic do zrobienia czegoś takiego jak:
mkdir -p /path/to/mnt && atomic mount IMAGE /path/to/mnt
Obraz dokera zostanie zamontowany do /path/to / mnt, abyś mógł go sprawdzić.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-03 14:01:38
Moim preferowanym sposobem na zrozumienie tego, co dzieje się wewnątrz kontenera jest:
-
Expose-p 8000
docker run -it -p 8000:8000 image
-
Uruchom serwer w nim
python -m SimpleHTTPServer
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-02 12:31:22
Dla już działającego kontenera, możesz zrobić:
dockerId=$(docker inspect -f {{.Id}} [docker_id_or_name])
cd /var/lib/docker/btrfs/subvolumes/$dockerId
Musisz być rootem, aby nagrać płytę do tego katalogu. Jeśli nie jesteś rootem, spróbuj 'sudo su' przed uruchomieniem polecenia.
Edit: po v1.3, Zobacz odpowiedź Jiri - jest lepiej.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-31 19:28:05
Jeśli używasz Docker v19. 03, wykonaj poniższe kroki.
# find ID of your running container:
docker ps
# create image (snapshot) from container filesystem
docker commit 12345678904b5 mysnapshot
# explore this filesystem
docker run -t -i mysnapshot /bin/sh
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-02-25 05:04:34
Jeśli używasz sterownika pamięci AUFS, możesz użyć skryptu my Docker-layer, aby znaleźć główny system plików kontenera (mnt) i warstwę readwrite:
# docker-layer musing_wiles
rw layer : /var/lib/docker/aufs/diff/c83338693ff190945b2374dea210974b7213bc0916163cc30e16f6ccf1e4b03f
mnt : /var/lib/docker/aufs/mnt/c83338693ff190945b2374dea210974b7213bc0916163cc30e16f6ccf1e4b03f
Edycja 2018-03-28:
Docker-layer został zastąpiony przez Docker-backup
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-28 22:00:38
Polecenie docker exec
do uruchomienia polecenia w uruchomionym kontenerze może pomóc w wielu przypadkach.
Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...] Run a command in a running container Options: -d, --detach Detached mode: run command in the background --detach-keys string Override the key sequence for detaching a container -e, --env list Set environment variables -i, --interactive Keep STDIN open even if not attached --privileged Give extended privileges to the command -t, --tty Allocate a pseudo-TTY -u, --user string Username or UID (format: [:]) -w, --workdir string Working directory inside the container
Na przykład:
1) Dostęp w bash do uruchomionego systemu plików kontenera :
docker exec -it containerId bash
2) dostęp w bash do uruchomionego systemu plików kontenera jako root, aby mieć wymagane prawa :
docker exec -it -u root containerId bash
Jest to szczególnie przydatne, aby móc wykonać pewne przetwarzanie jako root w kontenerze.
3) Dostęp w bash do uruchomionego systemu plików kontenera z konkretnym katalogiem roboczym:
docker exec -it -w /var/lib containerId bash
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-08 10:45:28
Możesz uruchomić bash wewnątrz kontenera za pomocą tego:
$ docker run -it ubuntu /bin/bash
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-03 05:49:36
Chciałem to zrobić, ale nie byłem w stanie uruchomić kontenera, ponieważ zatrzymał się i nie uruchamiał się ponownie z powodu błędu w kodzie.
To, co zadziałało dla mnie, to po prostu skopiowanie zawartości całego kontenera do nowego folderu, takiego jak ten:
docker cp container_name:/app/ new_dummy_folder
Byłem wtedy w stanie zbadać zawartość tego folderu tak, jak zrobi się to w normalnym folderze.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-12-16 11:03:34