03 – DEVelopment OPerationS – 01 – Tutorial Docker – Fundamentos

03 – DEVelopment OPerationS – 01 – Tutorial Docker – Fundamentos

Docker

Docker

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.

Contêiner

Contêiner

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.

contêiner

contêiner

Máquina Virtual

Máquina Virtual

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

Aula 02                       Aula 04

Voltar para página principal do blog

Todas as aulas desse curso

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:

Hostinger

Digital Ocean

One.com

Obrigado, até a próxima e bons estudos. 😉

Category: DevOps, Docker
About The Author
-

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>