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ć.

Author: dreftymac, 2013-12-28

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

 827
Author: Jiri,
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

Możesz to zrobić i dowiedzieć się, czy jest tam jakiś 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

 293
Author: Khalil Gharbaoui,
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.

 175
Author: Ilya Murav'jov,
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.

 43
Author: Rovanion,
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
 40
Author: Gaurav24,
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.

 32
Author: Julius Printz,
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
 18
Author: piercebot,
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

Https://github.com/wagoodman/dive

Tutaj wpisz opis obrazka

 17
Author: Andy Wong,
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
 15
Author: Gaurav Sharma,
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.

 14
Author: telamon,
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.

 13
Author: Florent,
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
 12
Author: shx,
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.

  1. Znajdź identyfikator procesu (PID) kontenera i zapisz go do zmiennej

    PID = $(Docker inspect-f' {{.Stan.Pid}} ' your-container-name-here)

  2. 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

 7
Author: Aditya Kresna Permana,
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.

 6
Author: Raphael,
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

 5
Author: LeYAUable,
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.

 4
Author: dashohoxha,
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

 4
Author: xrh,
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
 4
Author: qxo,
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.

 3
Author: Garren S,
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ć.

 3
Author: Giuseppe Scrivano,
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:

  1. Expose-p 8000

    docker run -it -p 8000:8000 image
    
  2. Uruchom serwer w nim

    python -m SimpleHTTPServer
    
 2
Author: kgnete,
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.

 2
Author: AlonL,
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
 2
Author: saurabh tiwari,
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

 1
Author: Vince,
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 
 1
Author: davidxxx,
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

 0
Author: Yang Yu,
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.

 0
Author: flyer2403,
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