====== Gerenciando Volumes e Plugins no Docker ======
===== Storage Drivers/Volumes/Bind Mount =====
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:
* **devicemapper**: este é o driver de armazenamento padrão do Docker para sistemas Linux. Ele usa um dispositivo lógico do Linux (LVM) para criar um volume de blocos para o container;
* **overlay**: este é um driver de armazenamento do Linux que fornece suporte a vários sistemas de arquivos, como o ext3 e o ext4. Ele usa um sistema de arquivos overlay para criar um volume de blocos para o container;
* **aufs**: este é um driver de armazenamento do Linux que fornece suporte a vários sistemas de arquivos, como o ext3 e o ext4. Ele usa um sistema de arquivos em modo de espelho para criar um volume de blocos para o container;
* **btrfs**: este é um driver de armazenamento do Linux que fornece suporte a vários sistemas de arquivos, como o ext3 e o ext4. Ele usa um sistema de arquivos Btrfs para criar um volume de blocos para o container;
* **zfs**: este é um driver de armazenamento do Linux que fornece suporte a vários sistemas de arquivos, como o ext3 e o ext4. Ele usa um sistema de arquivos ZFS para criar um volume de blocos para o container.
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 =====
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=,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=,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.
===== Volumes =====
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.
==== Tipos de volumes ====
* Bind Mounts: Uma montagem de ligação compartilha uma parte do sistema de arquivos do host com o contêiner. Isso permite que o contêiner acesse arquivos no host.
* Volumes nomeados: Um volume nomeado não usa o sistema de arquivos do host. Os dados são armazenados em um diretório no host gerenciado pelo Docker.
* Volumes Tmpfs: Um volume tmpfs armazena seus dados na memória do host. Isso é útil para armazenar dados que são acessados com frequência, mas podem ser descartados quando o contêiner é interrompido ou reiniciado.
==== Gerenciando Containers com Bind Mount ====
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
==== Use Montagem somente leitura ====
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**:
* A flag **–mount** consiste em vários pares de valores-chave, separados por vírgulas e cada uma consistindo em uma tupla ** = **. A sintaxe --mount é mais detalhada do que **-v** ou **--volume**, mas a ordem das chaves não é significativa e o valor do sinalizador é mais fácil de entender;
* A opção **type** pode ser **bind**, **volume** ou **tmpfs**;
* A opção **source** define o caminho para o arquivo ou diretório no host do daemon e do Docker. Pode ser especificado como source ou **src**;
* A opção **target** recebe como valor o caminho em que o arquivo ou diretório está montado no container;
* A opção **readonly**, se presente, faz com que a montagem de ligação seja montada no container como somente leitura.
===== Gerenciando Containers com Volumes =====
==== Volume do tipo host ====
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
==== Criar Volumes do tipo não nomeado ====
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
==== Usar Volume de Outro Container ====
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
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
==== Remover Volumes ====
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
* **docker run -v /volume:/volume**: Permite criar e mapear um novo volume no momento da execução de um container;
* **docker container exec**: Permite executar um comando diretamente em um container.
* **docker volume**: Permite gerenciar volumes no Docker;
* **docker volume ls**: Lista os volumes disponíveis no Docker;
* **docker volume inspect**: Exibe informações detalhadas sobre um ou mais volumes;
* **docker volume rm**: Permite remover um volume disponível no Docker;
* **docker volume prune**: Remove volumes não utilizados;
* **docker run –volumes-from**: Permite mapear um volume que está sendo utilizado por outro container.
==== Criar volumes personalizado ====
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:
* **-d**: Define qual será o driver utilizado para a criação do volume;
* **–opt type**: Define o sistema de arquivos utilizado pelo volume;
* **–opt device**: Define o dispositivo utilizado pelo volume; –opt size: Define o tamanho do volume;
* **–name**: Define o nome do volume.
==== Realizar Backup de Volumes ====
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
==== Backup de Volumes ====
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**
* No exemplo apresentado, o volume ''dca'' está montado a partir do container ''server'';
* O diretório de ''/var/lib/docker/volumes/dca/_data'' do host hospedeiro é montado como volume com o caminho (/backup) dentro do container ''server'';
* Dentro do container servidor, o comando tar está sendo executado no arquivo ''/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.
===== Gerenciando Plugins =====
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:
* **Armazenamento**: os plugins de armazenamento permitem que o Docker se conecte a diferentes back-ends de armazenamento, como sistemas de arquivos, bancos de dados ou nuvens públicas;
* **Rede**: os plugins de rede permitem que o Docker se conecte a diferentes tipos de redes, como VLANs, bridges ou redes virtuais;
* **Segurança**: os plugins de segurança podem ser usados para gerenciar as políticas de segurança do Docker, como controles de acesso e criptografia;
* **Ferramentas**: os plugins de ferramentas podem adicionar novas funcionalidades ao Docker, como gerenciamento de logs, monitoramento ou gerenciamento de configurações.
==== Instalar plugins de volume ====
=== nfs-volume-plugin ===
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
==== Utilizar volume em bloco no Docker ====
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
==== Instalar servidor NFS na dca-registry ====