GNU/Linux >> Linux Esercitazione >  >> Linux

Esplorare il file system del contenitore Docker

Ecco un paio di metodi diversi...

A) Usa docker exec (più semplice)

Docker versione 1.3 o successiva supporta il comando exec che si comportano in modo simile a nsenter . Questo comando può eseguire un nuovo processo in un contenitore già in esecuzione (il contenitore deve avere già un processo PID 1 in esecuzione). Puoi eseguire /bin/bash per esplorare lo stato del contenitore:

docker exec -t -i mycontainer /bin/bash

consulta la documentazione della riga di comando di Docker

B) Usa l'istantanea

Puoi valutare il filesystem contenitore in questo modo:

# 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

In questo modo, puoi valutare il filesystem del contenitore in esecuzione nel momento preciso. Il contenitore è ancora in esecuzione, non sono incluse modifiche future.

Successivamente puoi eliminare l'istantanea usando (il filesystem del contenitore in esecuzione non è interessato!):

docker rmi mysnapshot

C) Usa ssh

Se hai bisogno di un accesso continuo, puoi installare sshd nel tuo container ed eseguire il demone sshd:

 docker run -d -p 22 mysnapshot /usr/sbin/sshd -D
 
 # you need to find out which port to connect:
 docker ps

In questo modo, puoi eseguire la tua app usando ssh (connettiti ed esegui quello che vuoi).

D) Usa nsenter

Usa nsenter , vedi Perché non è necessario eseguire SSHd nei container Docker

La versione breve è:con nsenter, puoi inserire una shell in un contenitore esistente, anche se quel contenitore non esegue SSH o qualsiasi tipo di demone per scopi speciali


AGGIORNAMENTO:ESPLORAZIONE!

Questo comando dovrebbe consentirti di esplorare un contenitore docker in esecuzione :

docker exec -it name-of-container bash

L'equivalente per questo in docker-compose sarebbe:

docker-compose exec web bash

(web è il nome del servizio in questo caso e ha tty per impostazione predefinita.)

Una volta che sei dentro fai:

ls -lsa

o qualsiasi altro comando bash come:

cd ..

Questo comando dovrebbe consentirti di esplorare un'immagine docker :

docker run --rm -it --entrypoint=/bin/bash name-of-image

una volta dentro fai:

ls -lsa

o qualsiasi altro comando bash come:

cd ..

Il -it sta per interattivo... e tty.

Questo comando dovrebbe consentirti di ispezionare un contenitore o un'immagine docker in esecuzione :

docker inspect name-of-container-or-image

Potresti volerlo fare e scoprire se c'è qualche bash o sh lì dentro. Cerca entrypoint o cmd nel json return.

NOTA: Questa risposta si basa sulla presenza dello strumento commen, ma se non c'è bash shell o strumenti comuni come ls present potresti prima aggiungerne uno in un livello se hai accesso a Dockerfile :esempio per alpine:

RUN apk add --no-cache bash

Altrimenti se non hai accesso al Dockerfile quindi basta copiare i file da un contenitore appena creato e cercarli facendo:

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

vedere la documentazione di docker exec

vedere la documentazione di docker-compose exec

vedere la documentazione di docker inspect

vedere docker create documentazione


Nel caso in cui il tuo contenitore sia fermo o non abbia una shell (ad es. hello-world menzionato nella guida all'installazione, o diverso da alpine traefik ), questo è probabilmente l'unico metodo possibile per esplorare il filesystem.

Puoi archiviare il filesystem del tuo contenitore nel file tar:

docker export adoring_kowalevski > contents.tar

Oppure elenca i file:

docker export adoring_kowalevski | tar t

Tieni presente che, a seconda dell'immagine, potrebbe richiedere del tempo e spazio su disco.


Linux
  1. Dì solo no al root (in contenitori)

  2. Alcuni comandi DOCKER

  3. Come reindirizzare l'output di system() su un file?

  4. Inoltra la porta host al contenitore docker

  5. File system multipiattaforma

Introduzione al file system Linux

Comando Fsck in Linux (ripara file system)

Amministrazione di Network File System (NFS) su Linux

Come SSH in un Docker Container

Che cos'è il file system Linux? Guida facile

Come gestire i container Docker