03 – DEVelopment OPerationS – 01 – Tutorial Docker – Fundamentos
03 – DEVelopment OPerationS – 01 – Tutorial Docker – Fundamentos
Se gostarem do conteúdo dêem um joinha 👍 na página do Código Fluente no
Facebook
Link do código fluente no Pinterest
Meus links de afiliados:
Hostinger
Digital Ocean
One.com
Voltar para página principal do blog
Todas as aulas desse curso
Aula 02 Aula 04
DEVelopment OPerationS – DevOps
Antes de começar a falar de Docker e contêineres, vale a pena ressaltar que não adianta muito entender e usar ferramentas DevOPs sem estabelecer o espírito DevOPs na cultura da empresa.
Genericamente, em cenários, temos: DBA(s), Sysadmin(s), redes … e para cada área gerente(s) de nível X, coordenador(es), etc.
A ideia principal é quebrar essas barreiras de cargos muito delimitados, para que não haja por exemplo, a necessidade de abrir uma requisição para ter uma informação simples dentro de um processo qualquer.
Para isso se concretizar na prática, é preciso aproximar as pessoas, estimular a empatia entre as equipes e desburocratizar os processos.
Não vai adiantar muito saber usar tecnicamente ferramentas DevOps, ter integração contínua, entrega contínua, conteinerização, etc. Sem quebrar essas barreiras viciadas em muitas empresas.
DevOPs busca evitar que aconteçam conflitos como esse:
Operacional – “O programador mandou o código, mas tá dando erro, tá quebrado!”
Programador – “Pô, mas quem tá colocando o software em produção tá fazendo errado!”
A ideia é aproximar pessoas assim, é estimular a empatia entre esses “seres”.
Agora sim, falemos de Docker e conteinerização
Contêiner – Caixa
Para colocar uma aplicação no ar, ou seja, em produção, temos que ter uma máquina na web com um sistema operacional, interpretador ou compilador da linguagem usada, as bibliotecas usadas, o código da sua aplicação, etc.
Muitas vezes, acontecem conflitos de versões em bibliotecas, você tem uma aplicação que depende de uma biblioteca na versão X.1, você instala uma outra aplicação que vai precisar, mas essa depende da mesma biblioteca na versão X.2, pronto, dependency hell, conflito de versões de dependências.
Um contêiner pode ser imaginado como uma caixa onde sua aplicação e tudo que a compõe irão morar.
É onde você vai empacotar seu projeto e todas as suas dependências (bibliotecas).
Tudo o que acontece na caixa fica dentro dela, a menos que você explicitamente queira estabelecer uma saída ou entrada.
Se por algum motivo houver algum problema e a aplicação quebrar, é só destruir esse contêiner e subir um novo e tudo vai voltar ao normal.
O contêiner vai ajudar a sua aplicação rodar em diferentes computadores.
O ideal é usar a mesmas imagens dos contêineres utilizados no projeto em todos os ambientes: desenvolvimento, homologação e produção.
Imagens e contêineres
Fundamentalmente, um contêiner não passa de um processo em execução, com alguns recursos adicionais de encapsulamento aplicados a ele para mantê-lo isolado do host e de outros contêineres.
Um dos aspectos mais importantes do isolamento de um contêiner é que cada contêiner interage com seu próprio sistema de arquivos privado.
Esse sistema de arquivos é fornecido por uma imagem do Docker.
Uma imagem inclui tudo o necessário para executar um aplicativo: o código ou binário, runtimes, dependências e quaisquer outros objetos do sistema de arquivos necessários.
Contêineres e máquinas virtuais
Um contêiner é executado nativamente no Linux e compartilha o kernel da máquina host com outros contêineres.
Ele executa um processo discreto, sem exigir mais memória do que qualquer outro executável, tornando-o leve.
Por outro lado, uma máquina virtual (VM) executa um sistema operacional “convidado” completo com acesso virtual a recursos de host por meio de um hypervisor.
Em geral, as VMs causam muita sobrecarga além do que está sendo consumido pela lógica do seu aplicativo.
As imagens abaixo ilustram essa diferença.
As imagens acima são do site oficial:
https://docs.docker.com/get-started/
Instalação
Nesse link abaixo, vocês encontrarão as instruções para a instalação do Docker nos vários sistemas operacionais:
https://docs.docker.com/install/
Aconselho enfaticamente que usem uma distribuição linux para desenvolvimento de software, mas, é apenas uma sugestão.
Algumas ferramentas só rodam em sistemas linux, ou rodam melhor em linux.
Por isso, se você usa windows, terá que emular um linux dentro dele, através de uma máquina virtual linux, ou com um WSL (Subsistema Windows para Linux) instalado e configurado dentro do windows.
Enfim, você terá mais problemas a resolver e gastará mais recursos da sua máquina física.
Ah, seria bom antes de seguir, que você crie sua conta no: https://hub.docker.com/ 😉
Seguindo!
Hello World
Depois que o Docker estiver instalado, você precisará iniciar o daemon do Docker.
A maioria das distribuições Linux usa systemctl para iniciar serviços.
Iniciado com systemctl:
sudo systemctl start docker
Se você não possui no seu linux o systemctl, pode usar o comando service.
Iniciando com service:
sudo service docker start
Flush das alterações:
sudo systemctl daemon-reload
Para reiniciar:
sudo systemctl restart docker
Confira a versão:
docker --version
Saída:
Docker version 19.03.6, build 369ce74a3c
Teste se tá tudo ok vamos executando a imagem do Docker hello-world com:
docker run hello-world
Saída:
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the “hello-world” image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
Lista todos os Contêineres
docker container ls --all
Mata o Contêiner passando o ID
docker container rm <ID>
Mata a imagem passando o nome ou o ID.
docker image rmi <nome> ou <ID>
Remove todos os contêineres parados
docker rm $(docker ps -a -q)
Vamos levantar um contêiner chamado container-teste com o ubuntu:18.04
docker run --name container-teste ubuntu:18.04
Vamos escrever a string Ola mundo! de dentro do contêiner usando echo.
docker run --name container-teste-2 \
ubuntu:18.04 \
/bin/echo 'Ola mundo!'
Obs. Depois que o contêiner é executado, ele para, ele executa só o que foi pedido e fecha. Ele só fica executando enquanto o comando que você mandou ele executar estiver rodando.
Os comandos anteriores ele levantou o contêiner esperou o comando ser executado e parou o contêiner.
Vamos abrir um shell dentro do contêiner
docker run -ti --name container-teste-3 \
ubuntu:18.04 \
/bin/bash
Com esse comando, você vai ter um shell rodando de dentro do contêiner, enquanto você não digitar ctrl d, você vai estar no shell do contêiner e ele vai ficar em execução.
Na hora que você digitar ctrl d, o contêiner será parado e voltará ao shell do sistema.
Vamos ver mais alguns comandos úteis do Docker
Para finalizar o processo, usando o ID do CONTAINER, use:
docker container stop 1fa4ab2cf395
Para remover o contêiner:
sudo docker rm 1fa4ab2cf395
Para remover uma imagem:
docker image rmi <image_id>
Para remover multiplas imagens:
docker image rmi <image_id> <image_id> <image_id> ...
Limpa todos os recursos – imagens, contêineres, volumes e redes
docker system prune
Para remover todos os contêineres parados e todas as imagens não utilizadas (não apenas imagens pendentes), adicione o sinalizador -a ao comando:
docker system prune -a
Imagens pendentes
Imagens pendentes são aquelas que não possuem relações com imagens etiquetadas.
Normalmente essas imagens não estão sendo utilizadas e apenas ocupam espaço em disco.
Para listar as imagens pendentes use o comando abaixo:
docker images –f dangling=true
Remover Imagens Pendentes:
docker images purge
Volumes pendentes
Volumes não são para existirem sem contêineres.
Se você remover contêineres e deixar os volumes vazios, eles não serão automaticamente removidos.
Para listar os volumes pendentes:
docker volume ls –f dangling=true
Para remover volumes pendentes
docker images –f dangling=true