Docker
Usando o Docker, podemos criar de forma consistente e automática ambientes isolados e portáteis para aplicações.
🐳 Install Docker
O Docker fornece um script pratico em get.docker.com para instalar o Docker.
Esse script não é recomendado para ambientes produtivos
1 2 3 4 5 6 7 | |
Root privileges
Por padrão, o daemon do Docker faz bind em um socket Unix, e não em uma porta TCP. Sockets Unix, por sua vez, são de propriedade e de uso exclusivo do usuário root (por isso o Docker sempre é iniciado como root).
Para evitar o uso contínuo do comando sudo ao rodar comandos Docker, utilize o grupo docker que é criado durante a instalação e adicione o seu usuário a ele.
Esse procedimento permite que o usuário tenha os mesmos privilégios do usuário root em operações relacionadas ao Docker.
Mais informações: https://docs.docker.com/engine/security/.
Para criar um grupo no Linux e adicionar um usuário:
1 | |
Interagindo com o container
O docker é acessado via terminal através do comando docker.
Hello World
O Docker disponibiliza uma imagem personalizada chamada "hello-world", que serve para testar a instalação e validar se tudo está funcionando conforme o esperado.
Para executar um contêiner, utilizamos o parâmetro run do comando docker.
Exemplos:
1 2 3 4 5 | |
Docker RUN common parameters
- Utilizando o parâmetro
-dfaz com que o container seja executado em background. -p: Publica/expõe a(s) porta(s) de um contêiner para o host.-e: Define variáveis de ambiente.-it: cria uma sessão que permite a interação em tempo real com o contêiner.-i: permite que você mantenha a entrada padrão (stdin) aberta para interagir com o contêiner em tempo real.-t: aloca um pseudo-terminal para o contêiner, permitindo que você visualize a saída do contêiner de forma formatada.
Fluxo de criação e execução de um container:
- O cliente do Docker se comunica com o daemon do Docker.
- O daemon do Docker baixa a imagem do registro caso ela não exista no host.
- O daemon do Docker cria e executa um novo contêiner a partir da imagem definida.
Basic usage
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | |
- Você pode usar qualquer outra imagem disponível no Docker Hub ou no seu registro privado.
- Use a opção -a/-all para listar até mesmo os contêineres parados.
- O comando "inspect" é extremamente útil para depuração.
- Quando um contêiner é excluído, a imagem permanece no host.
- Por padrão, o contêiner não tem limite de recursos.
Use docker update --help para verificar as opções disponíveis.
Isso funciona mesmo para contêineres em execução.
Dockerfile
O Dockerfile é um arquivo de configuração usado para definir e construir imagens de contêineres Docker. Nele, você pode especificar a imagem base, as dependências, as variáveis de ambiente e os comandos necessários para construir uma imagem de contêiner Docker para o seu projeto.
Getting started
Para iniciar, você apenas precisa criar o arquivo: Dockerfile
Dockerfile
1 2 3 | |
Edite seu arquivo com as seguintes instruções:
1 | |
1 2 3 4 5 | |
Execute o comando docker build para criar uma imagem usando o Dockerfile.
1 | |
1 2 3 4 5 6 7 8 9 10 11 12 | |
1 | |
Esse comando irá executar um container utilizando a imagem gerada pelo Dockerfile que você criou, e então você poderá ver uma mensagem no seu localhost
Dockerfile Instructions
Comando disponíveis na criação de um Dockerfile:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | |
Compartilhando imagens
Até então, estamos utilizando o registry Docker Hub para obter as imagens.
Para enviar uma imagem para o Docker Hub:
Isso tornará sua imagem disponivel para download para outros usuarios.
- Crie uma conta no Docker Hub
- Faça login com usuário e senha executando:
1docker login - Crie sua imagem usando o
Dockerfileque você criou anteriormente, utilizando uma tag:1docker build <your-username>/cloud-native:1.0 - Envie sua imagem para o docker hub registry executando:
1docker push <your-username>/cloud-native:1.0 - E é isso, sua imagem agora está disponível no docker hub!!.
Criando meu próprio registry
Embora o Docker Hub seja um registry público confiavel, existem casos em que empresas podem optar por não utilizá-lo e preferir um registry interno, como o Harbor!.
Registries internos fornecem um maior controle sobre a segurança, privacidade, conformidade, melhor desempenho e menor latência.
Criando um registry Distribution
1 2 3 4 5 6 7 8 | |
- Ao buildar uma imagem, o docker gera um
idque é visível no output do comando!
Outros registries populares:
Docker-compose
O Docker Compose é uma ferramenta para definir e gerenciar vários contêineres Docker como uma única aplicação, facilitando a configuração, execução e escalabilidade de serviços através de um único arquivo YAML.
Getting started
Para iniciar, você apenas precisa criar o arquivo: docker-compose.yaml
1 | |
Edite seu arquivo com as seguintes instruções:
docker-compose.yaml
1 2 3 4 5 6 7 | |
para utilizar o docker-compose, execute:
1 | |
- Se for necessário fazer o build de alguma imagem, você pode adicionar o parâmetro
--build
Esse docker-compose conta com uma configuração minima:
Uma network é criada por padrão para garantir a conexão entre os containers
- cria um service chamado
webutilizando a imagem donginx - expõe o serviço na porta
8022do host
Turbinando o docker-compose
Adicionando um novo service
Vamos adicionar um postgreSQL ao docker-compose:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
/var/lib/postgresql/dataé o diretório onde os dados ficam armazenados no postgreSQL- adicione um
targetse estiver utilizando multi-stage build
Alterações:
1 2 3 4 | |
- Este volume persiste os dados do container postgres na pasta
/postgresdo host.
Adicionando variáveis de ambiente
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | |
- adicione um
targetse estiver utilizando multi-stage build -
É nescessario que exista o arquivo
.env -
Podemos adicionar variáveis de ambiente no serviço adicionando a chave
environmente/ouenv_file
Adicionando recursos
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | |
- Parâmetros da chave
deployfuncionam apenas ao utilizardocker swarm, exceto peloresources.
Os parâmetros da chave deploy funcionam apenas ao utilizar docker swarm, valores setados são ignorados pelo docker-compose up, exceto pela chave resources.
Boas praticas usando Docker
Use imagens oficiais e verificadas sempre que possível
Básico
-
Em vez de usar uma imagem base do sistema operacional e instalar o
node.js, npm e outras ferramentas necessárias para sua aplicação, utilize a imagem oficial donodepara sua aplicação. -
Se você tiver várias imagens com muitos elementos em comum, considere criar a sua própria base image
- Faça uso do arquivo
.dockerignorepara manter apenas os arquivos necessários no container - Não utilize a tag
latestem produção - Persista seus dados usando volumes
Faça uso de Multi-stage build
-
Você pode ter múltiplas instruções
FROMno seu Dockerfile, cada uma inicia um novo estagio do build -
Você poderá seletivamente copiar artefatos de um estagio para outro
-
permitirá você deixar para trás tudo o que você não quiser na imagem final
-
Você pode especificar um
targetpara o build executando:docker build --target <stage> -
O parâmetro
targetestá disponível nobuilddo seu serviço nodocker-compose.yaml
1 2 3 4 5 6 | |
- Nomeie os estágios do seu build
Evite utilizar imagens do Alpine
Usar Alpine para obter imagens menores é possível, mas vem com alguns desafios:
- Avaliar os compiladores necessários e os cabeçalhos das bibliotecas
- Ter um profundo entendimento da construção de imagens Docker com multi-stage builds
Quando um projeto Python é implantado, NÃO É RECOMENDADO usar imagens Alpine como base.
Sem os cabeçalhos das bibliotecas necessárias, o container não vai buildar
Sem conhecimento sobre como as camadas e estágios do Docker funcionam, a imagem final pode ser maior do que uma imagem produzida sem Alpine devido a ferramentas de compilação desnecessárias na imagem final.