Artigo original: Where are Docker Images Stored? Docker Container Paths Explained

O Docker vem sendo adotado amplamente e é usado para executar e escalar aplicações em produção. Além disso, ele pode ser usado para iniciar aplicações rapidamente executando um único comando do Docker.

Empresas também estão investindo cada vez mais esforços na melhoria do desenvolvimento em contêineres locais e remotos do Docker, o que traz muitas vantagens.

Você pode obter as informações básicas sobre sua configuração do Docker executando o comando:

$ docker info

...
 Storage Driver: overlay2
 Docker Root Dir: /var/lib/docker
...

O resultado contém as informações sobre seu driver de armazenamento e sobre seu diretório raiz do Docker.

O local de armazenamento das imagens e contêineres do Docker

Um contêiner do Docker é composto de configurações de rede, volumes e imagens. O local dos arquivos do Docker depende de seu sistema operacional. Aqui, vemos uma visão geral dos sistemas operacionais mais utilizados:

  • Ubuntu: /var/lib/docker/
  • Fedora: /var/lib/docker/
  • Debian: /var/lib/docker/
  • Windows: C:\ProgramData\DockerDesktop
  • MacOS: ~/Library/Containers/com.docker.docker/Data/vms/0/

No macOS e no Windows, o Docker executa contêineres do Linux em um ambiente virtual. Assim, é preciso saber mais algumas coisas.

Docker para o Mac

O Docker não é compatível nativamente com o macOS. Então, o Hyperkit é usado para executar uma imagem virtual. Os dados dessa imagem virtual estão localizados em:

~/Library/Containers/com.docker.docker/Data/vms/0

Dentro da imagem virtual, temos o caminho padrão do Docker /var/lib/docker.

Você pode investigar seu diretório raiz do Docker criando um shell no ambiente virtual:

$ screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty 

Você pode encerrar essa sessão pressionando Ctrl+a e, depois, pressionando k e y.

Docker para o Windows

No Windows, o Docker é um pouco fracionado. Há contêineres nativos do Windows que funcionam de forma semelhante aos contêineres do Linux. Os contêineres do Linux são executados em um ambiente virtual mínimo baseado no Hyper-V.

A configuração e a imagem virtual para executar imagens do Linux são salvas no diretório padrão do Docker.

C:\ProgramData\DockerDesktop

Se você inspecionar as imagens normais, verá caminhos do Linux, como, por exemplo:

$ docker inspect nginx

...
"UpperDir": "/var/lib/docker/overlay2/585...9eb/diff"
...

Você pode se conectar com a imagem virtual com:

docker run -it --privileged --pid=host debian nsenter -t 1 -m -u -i sh

Lá, você pode ir até o local referenciado:

$ cd /var/lib/docker/overlay2/585...9eb/
$ ls -lah

drwx------    4 root     root        4.0K Feb  6 06:56 .
drwx------   13 root     root        4.0K Feb  6 09:17 ..
drwxr-xr-x    3 root     root        4.0K Feb  6 06:56 diff
-rw-r--r--    1 root     root          26 Feb  6 06:56 link
-rw-r--r--    1 root     root          57 Feb  6 06:56 lower
drwx------    2 root     root        4.0K Feb  6 06:56 work

A estrutura interna do diretório raiz do Docker

Dentro de /var/lib/docker, informações diversas são armazenadas. Por exemplo, dados de contêineres, volumes, builds, redes e clusters.

$ ls -la /var/lib/docker

total 152
drwx--x--x   15 root     root          4096 Feb  1 13:09 .
drwxr-xr-x   13 root     root          4096 Aug  1  2019 ..
drwx------    2 root     root          4096 May 20  2019 builder
drwx------    4 root     root          4096 May 20  2019 buildkit
drwx------    3 root     root          4096 May 20  2019 containerd
drwx------    2 root     root         12288 Feb  3 19:35 containers
drwx------    3 root     root          4096 May 20  2019 image
drwxr-x---    3 root     root          4096 May 20  2019 network
drwx------    6 root     root         77824 Feb  3 19:37 overlay2
drwx------    4 root     root          4096 May 20  2019 plugins
drwx------    2 root     root          4096 Feb  1 13:09 runtimes
drwx------    2 root     root          4096 May 20  2019 swarm
drwx------    2 root     root          4096 Feb  3 19:37 tmp
drwx------    2 root     root          4096 May 20  2019 trust
drwx------   15 root     root         12288 Feb  3 19:35 volumes

Imagens do Docker

O conteúdo mais pesado são, em geral, as imagens. Se você usar o driver de armazenamento padrão, o overlay2, suas imagens do Docker são armazenadas em /var/lib/docker/overlay2. Lá, você poderá encontrar arquivos diferentes que representam camadas somente para leitura de uma imagem do Docker e uma camada superior que contém suas alterações.

Vamos explorar o conteúdo usando um exemplo:

$ docker image pull nginx
$ docker image inspect nginx

[
    {
        "Id": "sha256:207...6e1",
        "RepoTags": [
            "nginx:latest"
        ],
        "RepoDigests": [
            "nginx@sha256:ad5...c6f"
        ],
        "Parent": "",
 ...
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 126698063,
        "VirtualSize": 126698063,
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/585...9eb/diff:
                             /var/lib/docker/overlay2/585...9eb/diff",
                "MergedDir": "/var/lib/docker/overlay2/585...9eb/merged",
                "UpperDir": "/var/lib/docker/overlay2/585...9eb/diff",
                "WorkDir": "/var/lib/docker/overlay2/585...9eb/work"
            },
...

LowerDir contém as camadas somente para leitura de uma imagem. A camada de leitura e escrita que representa as alterações são parte de UpperDir. Neste caso, a pasta UpperDir do NGINX contém os arquivos de log:

$ ls -la /var/lib/docker/overlay2/585...9eb/diff

total 8
drwxr-xr-x    2 root     root    4096 Feb  2 08:06 .
drwxr-xr-x    3 root     root    4096 Feb  2 08:06 ..
lrwxrwxrwx    1 root     root      11 Feb  2 08:06 access.log -> /dev/stdout
lrwxrwxrwx    1 root     root      11 Feb  2 08:06 error.log -> /dev/stderr

O MergedDir representa o resultado de UpperDir e LowerDir que é usado pelo Docker para executar o contêiner. O WorkDir é um diretório interno para overlay2 e deve estar vazio.

Volumes do Docker

É possível adicionar um armazenamento persistente para contêineres de modo a manter os dados por mais tempo do que a existência do contêiner ou para compartilhar o volume com o host ou com outros contêineres. Um contêiner pode ser iniciado com um volume usando a opção -v:

$ docker run --name nginx_container -v /var/log nginx

Podemos obter informações sobre o local do volume conectado com:

$ docker inspect nginx_container

...
"Mounts": [
            {
                "Type": "volume",
                "Name": "1e4...d9c",
                "Source": "/var/lib/docker/volumes/1e4...d9c/_data",
                "Destination": "/var/log",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
...

O diretório referenciado contém arquivos do local /var/log do contêiner do NGINX.

$ ls -lah /var/lib/docker/volumes/1e4...d9c/_data

total 88
drwxr-xr-x    4 root     root        4.0K Feb  3 21:02 .
drwxr-xr-x    3 root     root        4.0K Feb  3 21:02 ..
drwxr-xr-x    2 root     root        4.0K Feb  3 21:02 apt
-rw-rw----    1 root     43             0 Jan 30 00:00 btmp
-rw-r--r--    1 root     root       34.7K Feb  2 08:06 dpkg.log
-rw-r--r--    1 root     root        3.2K Feb  2 08:06 faillog
-rw-rw-r--    1 root     43         29.1K Feb  2 08:06 lastlog
drwxr-xr-x    2 root     root        4.0K Feb  3 21:02 nginx
-rw-rw-r--    1 root     43             0 Jan 30 00:00 w

Limpeza do espaço usado pelo Docker

Recomenda-se usar o comando do Docker para limpar contêineres não utilizados. Contêiner, redes, imagens, e o cache criado podem ser limpos executando o seguinte comando:

$ docker system prune -a

Além disso, você pode remover volumes não utilizados com o comando:

$ docker volumes prune

Resumo

O Docker é uma parte importante dos ambientes e do conjunto de ferramentas de muitos desenvolvedores. Às vezes, o Docker pode parecer meio mágico ao resolver problemas de modo muito inteligente sem dizer ao usuário como ele funciona por debaixo dos panos. Ainda assim, ele é uma ferramenta normal, que armazena as partes mais pesadas em locais que podem ser abertos e alterados.

Por vezes, o armazenamento pode encher rapidamente. Desse modo, é útil inspecionar o diretório raiz, mas não é recomendado excluir ou alterar arquivos manualmente dentro dele. Em vez disso, os comandos de prune (ver acima) podem ser usados para liberar espaço em disco.

Esperamos que você tenha gostado do artigo. Se gostou e quiser parabenizar o autor, siga-o no Twitter. O autor trabalha no eBay Kleinanzeigen, uma das maiores empresas de anúncios classificados do mundo inteiro. Falando nisso, eles estão contratando!

Uma boa exploração do Docker para você :)


Referências (em inglês)