====== 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 ====