• Containers • Volumes • Volumes Somente Leitura • Data-Only Container O que vimos até agora
• Comandos básicos do Docker para podermos baixar imagens e
interagir com o container. • Imagens do Docker possuem um sistema de arquivos em camadas (Layered File System) e os benefícios dessa abordagem principalmente para o download de novas imagens. • Imagens são Read-Only sempre (apenas para leitura) • Containers representam uma instância de uma imagem • Como imagens são Read-Only os containers criam nova camada (layer) para guardar as alterações • O comando Docker run e as possibilidades de execução de um container O que vimos até agora • Segue também uma breve lista dos comandos utilizados:
• docker ps - exibe todos os containers em execução no
momento. • docker ps -a - exibe todos os containers, independente de estarem em execução ou não. • docker run -it NOME_DA_IMAGEM - conecta o terminal que estamos utilizando com o do container. • docker start ID_CONTAINER - inicia o container com id em questão. • docker stop ID_CONTAINER - interrompe o container com id em questão. • docker start -a -i ID_CONTAINER - inicia o container com id em questão e integra os terminais, além de permitir interação entre ambos. • docker rm ID_CONTAINER - remove o container com id em questão. O que vimos até agora • docker container prune - remove todos os containers que estão parados. • docker rmi NOME_DA_IMAGEM - remove a imagem passada como parâmetro. • docker run -d -P --name NOME dockersamples/static-site - ao executar, dá um nome ao container. • docker run -d -p 12345:80 dockersamples/static-site - define uma porta específica para ser atribuída à porta 80 do container, neste caso 12345. • docker run -d -e AUTHOR="Fulano" dockersamples/static-site - define uma variável de ambiente AUTHOR com o valor Fulano no container criado. Containers Na aula anterior, vimos que os containers nada mais são do que uma pequena camada de leitura e escrita, que funcionam em cima das imagens, que não podem ser modificadas, pois são somente para leitura. Containers Quando removemos um container (comando docker rm), a camada de leitura e escrita também é removida, o que faz com que os nossos dados também sejam removidos, o que é muito ruim, já que esses dados podem ser importantes, como por exemplo um banco de dados, então toda vez que o container for removido, tudo o que escrevemos nele será jogado fora? Sim. Não é isso que queremos, então temos que ver um jeito de persistir esses dados, mas também trabalhando com containers. Volumes
Quando escrevemos em um container, assim que ele for removido,
os dados também serão. Mas podemos criar um local especial dentro dele, e especificamos que esse local será o nosso volume de dados. Quando criamos um volume de dados, o que estamos fazendo é apontá-lo para uma pequena pasta no Docker Host. Então, quando criamos um volume, criamos uma pasta dentro do container, e o que escrevermos dentro dessa pasta na verdade estaremos escrevendo do Docker Host. Volumes Isso faz com que não percamos os nossos dados, pois o container até pode ser removido, mas a pasta no Docker Host ficará intacta. Trabalhando com volumes Sabendo disso, vamos ver como trabalhar com o Docker Host. No Terminal, criamos um container com o docker run, mas dessa vez utilizando a flag -v para criar um volume, seguido do nome do mesmo: Trabalhando com volumes No exemplo anterior, criamos o volume /var/www, mas a que pasta no Docker Host ele faz referência? Para descobrir, podemos inspecionar o container, executando o comando docker inspect, passando o seu id para o mesmo: Trabalhando com volumes
Temos uma saída com diversas informações, mas a que nos
interessa é o "Mounts":
Nele, podemos ver que o /var/www será escrito na nossa máquina
no diretório "/var/lib/docker/volumes/0b49051b2daed8e2b9987120f0419c5e8df6193f0f5f40cfcef a7ad31b9f7a33/_data", endereço que foi gerado automaticamente pelo Docker. Ou seja, tudo que escrevermos na pasta /var/www do container, na verdade estaremos escrevendo na pasta "/var/lib/docker/volumes/0b49051b2daed8e2b9987120f0419c5e8df6193f0f5f40cfcef a7ad31b9f7a33/_data" da nossa máquina. Trabalhando com volumes É possível usar uma sintaxe passando mais informações de forma que traga somente o que necessitamos.
Docker inspect –f {{.Mounts}} [CONTAINER ID]
Trabalhando com volumes Ou seja, quando escrevermos na pasta /var/www do container, estaremos escrevendo em /var/docker/ubuntu da nossa máquina. Para provar isso, na pasta /var/www, vamos criar um arquivo e escrever nele uma mensagem: Trabalhando com volumes
É possível usar uma sintaxe mais simples
Montando volume somente leitura É possível montar um volume co container somente leitura (read only). Para isso no momento que passarmos a informação do volume no container devemos adicionar “:ro” após o nome do volume, veja exemplo abaixo:
docker run –it –v “/var/docker/ubuntu:/var/www:ro” ubuntu
Montando arquivos
É possível além de montar diretórios através de volumes,
montarmos arquivos. Da mesma forma que visto anteriormente, ao invés de informarmos um diretório, informamos apenas o nome do arquivo e o nome do volume.
docker run –v /root/arquivo.txt:/arquivo ubuntu
Data-Only Container
O Docker foi feito para ter uma boa portabilidade. Um container
criado no seu laptop deve ser portátil a ponto de rodar em qualquer outro ambiente que utilize o Docker. Quando criamos um ambiente Docker e informamos para o container montar um diretório no Host Local, primeiramente uma série de fatores devem ser verificados, como: existência, permissão, espaço. O que faz com que o Docker não seja tão portátil , fugindo da sua principal características. Uma opção bastante interessante em relação aos volumes é o Data- Only Container, onde temos uma instância que irá compartilhar o volume com outras instâncias, através comando --volumes-from. Data-Only Container
Esse processo se dá montando apenas um volume real, e todas as máquinas
utilizam-se do mesmo volume. Facilitando dessa forma o gerenciamento de diretórios no Host Local. Em nosso exemplo iremos criar um diretório data para montar os volumes para o banco de dados postgresql. Data-Only Container
docker run -d -p 5433:5432 --name pgsql2 --volumes-from dbdados -e
POSTGRESQL_USER=docker -e POSTGKESQL_PASS=docker -e POSTGKESQL_DB=docker kamui/postgresql Data-Only Container Backup A forma de backup também é bem interessante, podemos obviamente copiar diretamente do volume /var/docker/data, ou ainda para não termos problemas de arquivos corrompido, gerar uma nova instância mapeando também o diretório data e copiando para um diretório no Host Local, também mapeado via volume. Veja abaixo, a criação de uma instância debian, que executa o comando de backup com tar para o volume no Host Local.