O Docker usa um driver de armazenamento para criar uma camada de abstração entre os sistemas de arquivos do host e o sistema de arquivos do container do Docker. O Docker suporta vários drivers de armazenamento, cada um com suas próprias características e vantagens. Aqui estão alguns dos mais comuns:
Cada um destes drivers de armazenamento tem suas próprias vantagens e desvantagens. Por exemplo, o driver de armazenamento do devicemapper é o driver de armazenamento padrão do Docker para sistemas Linux, mas ele não é compatível com o Windows. O driver de armazenamento do overlay é compatível com o Windows, mas não é o driver de armazenamento padrão do Docker para sistemas Linux.
Qual driver de armazenamento você deve usar? Isso depende de suas necessidades específicas. Se você precisar usar o Docker no Windows, você terá que usar o driver de armazenamento do overlay. Se você precisar de mais compatibilidade com sistemas de arquivos do Linux, você poderá usar o driver de armazenamento do aufs. Se você precisar de suporte ao Btrfs, você terá que usar o driver de armazenamento do btrfs.
Bind Mounts têm funcionalidade limitada em comparação com volumes, mas ainda são úteis para fins de desenvolvimento ou teste. Você pode usar uma montagem de ligação para montar um arquivo ou diretório de sua máquina host em um contêiner.
Um Bind Mount é especificado no comando de execução do Docker usando a flag –mount.
docker container run --mount type=bind,source=</path/to/file>,target=/path/to/container example/image
Também é possível especificar o acesso somente leitura a uma montagem de ligação usando a flag :ro conforme mostrado abaixo.
docker run --mount type=bind,source=</path/to/file>,target=/path/to/container, readonly example/image
Bind Mounts têm funcionalidade limitada em comparação com volumes, que podem ser montados em vários nós ao mesmo tempo, permitindo que os dados sejam compartilhados entre vários pods no Kubernetes. Eles também permitem que os dados sejam migrados para outros nós facilmente, caso um nó fique indisponível.
Os volumes do Docker permitem que os usuários criem pontos de montagem dentro de uma imagem do Docker para que os dados possam ser preservados e compartilhados entre diferentes contêineres. Os volumes do Docker também podem ser usados para compartilhar arquivos entre um host e um contêiner.
Os volumes do Docker são úteis para armazenar dados persistentes gerados e usados por contêineres. Os volumes são mais fáceis de fazer backup, restaurar e migrar do que os dados armazenados na camada gravável de um contêiner. Você pode criar um novo volume usando o comando docker volume create.
Os volumes são o mecanismo preferencial para a persistência de dados gerados e usados por contêineres do Docker. Os volumes são mais fáceis de fazer backup, restaurar e gerenciar do que vincular montagens. Você pode usar volumes para manter dados, arquivos de configuração e imagens carregadas, por exemplo. Os volumes são projetados para manter os dados, independentemente do ciclo de vida do contêiner.
Volumes são mais fáceis de fazer backup ou migrar do que Bind Mounts, porque você não precisa se preocupar com os detalhes do sistema de arquivos subjacente. Os volumes são armazenados em uma parte do sistema de arquivos do host que é gerenciado pelo Docker no diretório /var/lib/docker/volumes no Linux.
Mapeando o diretório site para /var/www/html do container.
mkdir site echo 'Bind Mount' > site/index.html
docker container run -di --name web -h web --mount type=bind,source=$PWD/site,target=/var/www/html -p 80:80 php:7.2-apache
docker container inspect web | grep Mounts -A 5 "Mounts": [ { "Type": "bind", "Source": "/home/gean/site", "Target": "/var/www/html" } -- "Mounts": [ { "Type": "bind", "Source": "/home/gean/site", "Destination": "/var/www/html", "Mode": "",
docker container rm -f web web
mkdir html echo 'Site Somente Leitura' > html/index.html
docker container run -di --name web -h web --mount type=bind,source=$PWD/html,target=/usr/share/nginx/html,readonly -p 80:80 nginx
curl localhost Somente Leitura
Vamos testar o mapeamento tentando copiar um novo arquivo para o diretório /usr/share/nginx/html/:
echo 'Novo site' > index.html
docker container cp index.html web:/usr/share/nginx/html/ Successfully copied 2.05kB to web:/usr/share/nginx/html/ Error response from daemon: mounted volume is marked read-only
docker container inspect web | grep Mounts -A5 "Mounts": [ { "Type": "bind", "Source": "/home/gean/html", "Target": "/usr/share/nginx/html", "ReadOnly": true -- "Mounts": [ { "Type": "bind", "Source": "/home/gean/html", "Destination": "/usr/share/nginx/html", "Mode": "",
docker container rm -f web web
Descrição das opções:
Para mapear um volume no container com um diretório no host hospedeiro, use a flag -v do comando docker run:
docker container run -dit --name=server -h server -v /srv:/srv busybox 657c62ec8903c03259600973f0ac80e52fbd711409b2edc7cb51fb746eb0fcc7
Faça um teste copiando arquivos no host hospedeiro, e verifique se o conteúdo é mapeado no volume do container:
docker container exec server ls /srv
sudo cp /etc/*.conf /srv/
docker container exec server ls /srv adduser.conf ca-certificates.conf debconf.conf deluser.conf e2scrub.conf fuse.conf gai.conf hdparm.conf host.conf kernel-img.conf ld.so.conf libaudit.conf logrotate.conf mke2fs.conf multipath.conf nftables.conf nsswitch.conf overlayroot.conf overlayroot.local.conf pam.conf resolv.conf rsyslog.conf sudo.conf sudo_logsrvd.conf sysctl.conf ucf.conf usb_modeswitch.conf xattr.conf
docker container rm -f server server
docker container run -di --name=server -v /volume busybox 321ce4bb049179ce1c4e4988067df2955c2ef2039672d6755127a5b91d021590
docker container inspect server | grep volume "Type": "volume", "Source": "/var/lib/docker/volumes/0b69e5958d95c6183ad83d2d0e27cda6cdfd15b19b9ca71395014ddb0778fe34/_data", "Destination": "/volume", "/volume": {}
Veja que o Docker criou um hash representando o novo volume criado:
$ docker volume ls DRIVER VOLUME NAME local 0b69e5958d95c6183ad83d2d0e27cda6cdfd15b19b9ca71395014ddb0778fe34
docker volume inspect 0b69e5958d95c6183ad83d2d0e27cda6cdfd15b19b9ca71395014ddb0778fe34 [ { "CreatedAt": "2024-10-07T18:43:25Z", "Driver": "local", "Labels": { "com.docker.volume.anonymous": "" }, "Mountpoint": "/var/lib/docker/volumes/0b69e5958d95c6183ad83d2d0e27cda6cdfd15b19b9ca71395014ddb0778fe34/_data", "Name": "0b69e5958d95c6183ad83d2d0e27cda6cdfd15b19b9ca71395014ddb0778fe34", "Options": null, "Scope": "local" } ]
Veja também no interior do container o volume:
docker container exec server df -Th /volume Filesystem Type Size Used Available Use% Mounted on /dev/vda1 ext4 30.8G 4.1G 26.7G 13% /volume
docker container exec server df -Th /volume Filesystem Type Size Used Available Use% Mounted on /dev/vda1 ext4 30.8G 4.1G 26.7G 13% /volume
docker container exec server ls volume
Copie arquivos no host hospedeiro e verifique se o conteúdo é mapeado no volume:
sudo cp /etc/*.conf /var/lib/docker/volumes/0b69e5958d95c6183ad83d2d0e27cda6cdfd15b19b9ca71395014ddb0778fe34/_data
docker container exec server ls volume adduser.conf ca-certificates.conf debconf.conf deluser.conf e2scrub.conf fuse.conf gai.conf hdparm.conf host.conf kernel-img.conf ld.so.conf libaudit.conf logrotate.conf mke2fs.conf multipath.conf nftables.conf nsswitch.conf overlayroot.conf overlayroot.local.conf pam.conf resolv.conf rsyslog.conf sudo.conf sudo_logsrvd.conf sysctl.conf ucf.conf usb_modeswitch.conf xattr.conf
Para utilizar um volume existente de outro container use a opção –volumes-from quando executar um novo container:
docker container run -di --name=client -h client --volumes-from server busybox 9bd272dc94410098b16c5714365e384ae9a1fc4805930d3722f726290634f13b
Verifique se no novo container o volume mapeado está montado e com conteúdo:
docker container exec client df -Th /volume Filesystem Type Size Used Available Use% Mounted on /dev/vda1 ext4 30.8G 4.1G 26.7G 13% /volume <code bash>
docker container exec client ls volume adduser.conf ca-certificates.conf debconf.conf deluser.conf e2scrub.conf fuse.conf gai.conf hdparm.conf host.conf kernel-img.conf ld.so.conf libaudit.conf logrotate.conf mke2fs.conf multipath.conf nftables.conf nsswitch.conf overlayroot.conf overlayroot.local.conf pam.conf resolv.conf rsyslog.conf sudo.conf sudo_logsrvd.conf sysctl.conf ucf.conf usb_modeswitch.conf xattr.conf
docker container rm -f client client </code>
docker container rm -f server server
docker volume prune WARNING! This will remove anonymous local volumes not used by at least one container. Are you sure you want to continue? [y/N] y Deleted Volumes: 0b69e5958d95c6183ad83d2d0e27cda6cdfd15b19b9ca71395014ddb0778fe34 Total reclaimed space: 54.1kB
Descrição dos comandos
Para criar um volume definindo o tipo, nome e tamanho, execute o comando abaixo:
docker volume create -d local --opt type=tmpfs --opt device=tmpfs --opt o=size=1000m --name dca dca
docker volume ls DRIVER VOLUME NAME local dca
docker volume inspect dca [ { "CreatedAt": "2024-10-07T20:30:31Z", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/dca/_data", "Name": "dca", "Options": { "device": "tmpfs", "o": "size=1000m", "type": "tmpfs" }, "Scope": "local" } ]
Use a flag -v, apontando o volume personalizado e o diretório mapeado no container:
docker container run -di --name=server -h server -v dca:/backup busybox 7bcf213a863dc2b36b800f02ca5cf89abee1c6c653dd2baaae5ec8e45b0ab5ad
docker container inspect server | grep volume "Type": "volume", "Source": "/var/lib/docker/volumes/dca/_data",
docker container exec server df -Th backup Filesystem Type Size Used Available Use% Mounted on tmpfs tmpfs 1000.0M 0 1000.0M 0% /backup
Faça um teste copiando arquivos no host hospedeiro, e verifique se o conteúdo é mapeado no volume personalizado do container:
sudo cp /etc/*.conf /var/lib/docker/volumes/dca/_data
docker container exec server ls backup adduser.conf ca-certificates.conf debconf.conf deluser.conf e2scrub.conf fuse.conf gai.conf hdparm.conf host.conf kernel-img.conf ld.so.conf libaudit.conf logrotate.conf mke2fs.conf multipath.conf nftables.conf nsswitch.conf overlayroot.conf overlayroot.local.conf pam.conf resolv.conf rsyslog.conf sudo.conf sudo_logsrvd.conf sysctl.conf ucf.conf usb_modeswitch.conf xattr.conf
Opções do comado docker volume create:
Para realizar o backup de um volume existente, use a opção –volumes-from, conforme o exemplo abaixo:
docker container run --rm --volumes-from server -v dca:/backup busybox tar cvf /backup/backup.tar /backup
Verifique se o arquivo empacotado foi criado no diretório de volume, e aproveite para listar seu conteúdo:
sudo ls /var/lib/docker/volumes/dca/_data
sudo tar -tf /var/lib/docker/volumes/dca/_data/backup.tar backup/ backup/xattr.conf backup/usb_modeswitch.conf backup/ucf.conf backup/sysctl.conf backup/sudo_logsrvd.conf backup/sudo.conf backup/rsyslog.conf backup/resolv.conf backup/pam.conf backup/overlayroot.local.conf backup/overlayroot.conf backup/nsswitch.conf backup/nftables.conf backup/multipath.conf backup/mke2fs.conf backup/logrotate.conf backup/libaudit.conf backup/ld.so.conf backup/kernel-img.conf backup/host.conf backup/hdparm.conf backup/gai.conf backup/fuse.conf backup/e2scrub.conf backup/deluser.conf backup/debconf.conf backup/ca-certificates.conf backup/adduser.conf
Antes de realizar o restore, remova os arquivos .conf diretório de volume:
sudo su - -c 'rm -f /var/lib/docker/volumes/dca/_data/*.conf'
sudo ls /var/lib/docker/volumes/dca/_data/ backup.tar
Para realizar o restore de um volume existente, use a opção –volumes-from, conforme o exemplo abaixo:
docker container run --rm --volumes-from server -v dca:/backup busybox tar xvf /backup/backup.tar backup/ backup/xattr.conf backup/usb_modeswitch.conf backup/ucf.conf backup/sysctl.conf backup/sudo_logsrvd.conf backup/sudo.conf backup/rsyslog.conf backup/resolv.conf backup/pam.conf backup/overlayroot.local.conf backup/overlayroot.conf backup/nsswitch.conf backup/nftables.conf backup/multipath.conf backup/mke2fs.conf backup/logrotate.conf backup/libaudit.conf backup/ld.so.conf backup/kernel-img.conf backup/host.conf backup/hdparm.conf backup/gai.conf backup/fuse.conf backup/e2scrub.conf backup/deluser.conf backup/debconf.conf backup/ca-certificates.conf backup/adduser.conf
sudo ls /var/lib/docker/volumes/dca/_data/ adduser.conf deluser.conf hdparm.conf libaudit.conf nftables.conf pam.conf sudo_logsrvd.conf xattr.conf backup.tar e2scrub.conf host.conf logrotate.conf nsswitch.conf resolv.conf sysctl.conf ca-certificates.conf fuse.conf kernel-img.conf mke2fs.conf overlayroot.conf rsyslog.conf ucf.conf debconf.conf gai.conf ld.so.conf multipath.conf overlayroot.local.conf sudo.conf usb_modeswitch.conf
docker container rm -f server server
Restore de Volumes
dca está montado a partir do container server;/var/lib/docker/volumes/dca/_data do host hospedeiro é montado como volume com o caminho (/backup) dentro do container server;/backup/backup.tar e o seu conteúdo será extraído para o diretório (/var/lib/docker/volumes/dca/_data), que é montado pelo volume dca.Os plugins do Docker são bibliotecas de código que estendem as funcionalidades do Docker. Eles podem ser usados para criar novos tipos de contêineres, adicionar suporte a novos formatos de imagem ou para integrar o Docker com outros sistemas.
Existem plugins para várias finalidades, incluindo:
Vamos instalar em todas as instâncias o plugin nfs-volume-plugin, que irá permitir o armazenamento de dados em um servidor NFS.
docker plugin install --alias nfs-volume-plugin --grant-all-permissions trajano/nfs-volume-plugin
sudo docker plugin ls
Para desativar um plugin no Docker, utilize a flag disable.
sudo docker plugin disable nfs-volume-plugin:latest
Para criar um volume utilizando o novo plugin, utilize a flag -d (driver) definindo ponto de montagem (mountpoint) e nome:
docker volume create -d local-persist -o mountpoint=/mysql-data --name=mysql-data
docker volume inspect mysql-data