[Linux] Esplorazione del file system del contenitore Docker


Answers

Puoi archiviare il filesystem del tuo contenitore nel file tar:

docker export adoring_kowalevski > contents.tar

In questo modo funziona anche se il tuo contenitore è fermo e non ha alcun programma di shell come /bin/bash . Intendo immagini come ciao-mondo dalla documentazione di Docker .

Question

Ho notato con la finestra mobile che ho bisogno di capire cosa sta succedendo all'interno di un contenitore o quali file esistono in là. Un esempio è il download delle immagini dall'indice di docker: non hai idea di cosa contiene l'immagine, quindi è impossibile avviare l'applicazione.

Quale sarebbe l'ideale è essere in grado di ssh in loro o equivalente. C'è uno strumento per farlo, o la mia concettualizzazione della finestra mobile è sbagliata nel pensare che dovrei essere in grado di farlo.




Io uso un altro trucco sporco che è aufs / devicemapper agnostico.

Guardo il comando che il contenitore sta eseguendo, ad esempio, docker ps e se si tratta di un apache o java faccio solo quanto segue:

sudo -s
cd /proc/$(pgrep java)/root/

e voilá sei dentro il contenitore.

Fondamentalmente puoi usare cd root in /proc/<PID>/root/ folder purché quel processo sia eseguito dal container. Attenzione, i collegamenti simbolici non avranno senso usando questa modalità.




Il file system del contenitore si trova nella cartella dati della finestra mobile, normalmente in / var / lib / docker. Per avviare e ispezionare un file system di contenitori in esecuzione, effettuare le seguenti operazioni:

hash=$(docker run busybox)
cd /var/lib/docker/aufs/mnt/$hash

E ora la directory di lavoro corrente è la radice del contenitore.




La risposta più votata è buona, tranne se il tuo contenitore non è un vero sistema Linux.

Molti contenitori (specialmente quelli basati su go) non hanno alcun binario standard (no / bin / bash, / bin / sh). In tal caso, sarà necessario accedere direttamente al file dei contenitori effettivi:

Funziona come un fascino:

name=<name>
dockerId=$(docker inspect -f {{.Id}} $name)
cd /var/lib/docker/devicemapper/mnt/$dockerId

Nota: è necessario eseguirlo come root.




un altro trucco è usare lo strumento atomic per fare qualcosa del tipo:

mkdir -p /path/to/mnt && atomic mount IMAGE /path/to/mnt

L'immagine Docker verrà montata su / percorso / su / mnt per consentirne l'ispezione.




Nelle versioni più recenti di Docker è possibile eseguire docker exec [container_name] che esegue una shell all'interno del contenitore

Quindi per ottenere un elenco di tutti i file in un contenitore è sufficiente eseguire docker exec [container_name] ls




La risposta più aggiornata funziona per me quando il contenitore è effettivamente avviato, ma quando non è possibile eseguirlo e ad esempio vuoi copiare i file dal contenitore, questo mi ha salvato prima:

docker cp <container-name>:<path/inside/container> <path/on/host/>

Grazie a docker cp ( this ) puoi copiare direttamente dal container come se fosse una qualsiasi altra parte del tuo filesystem. Ad esempio, il recupero di tutti i file all'interno di un contenitore:

mkdir /tmp/container_temp
docker cp example_container:/ /tmp/container_temp/

Si noti che non è necessario specificare che si desidera copiare ricorsivamente.




Puoi eseguire una bash all'interno del contenitore con questo: $ docker run -it ubuntu /bin/bash




Per il driver di docker aufs:

Lo script troverà la directory principale del contenitore (Test su docker 1.7.1 e 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