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:
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
Se tiverem gostado, dêem um joinha 👍 na página do Código Fluente no
Facebook
Link do código fluente no Pinterest
Novamente deixo meus link de afiliados:
Obrigado, até a próxima e bons estudos. ;)