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)
- Documentação do storagedriver do Docker
https://docs.docker.com/storage/storagedriver/ - Documentação do sistema de arquivos OverlayFS
https://www.kernel.org/doc/Documentation/filesystems/overlayfs.txt