Linux na Web

Docker – Introdução e gerenciamento de containers

Docker introdução e gerenciamento de containers

O Docker é uma ferramenta Open Source que utiliza a tecnologia de containers, mantida pela empresa Docker Inc. Ela é projetada para auxiliar desenvolvedores e administradores de sistemas, permitindo a criação, implantação e testes de aplicações de forma rápida, simples e utilizando poucos recursos.

Simplificando, ele é uma alternativa a virtualização, sendo mais ágil e menos pesada, pois ao invés de criar um sistema virtual completo, com todos os recursos de uma máquina física (Xen, VMWare, VirtualBox, etc), o Docker utiliza os mesmos recursos da máquina hospedeira, como: kernel, bibliotecas, etc…

O Docker foi baseado no LXC (Linux Containers), que são pacotes que permitem rodar diferentes sistemas isolados em um único sistema operacional real, utilizando o mínimo necessário para seu funcionamento. Sendo possível implantar e escalonar em qualquer ambiente, aumentando o desempenho e reduzindo o tamanho da aplicação.

Grandes empresas de tecnologia como Google, Amazon, Netflix, Spotify e até mesmo a Microsoft, vem utilizando essa tecnologia, substituindo a virtualização.

Comparando a utilização de máquinas virtuais e containers nos ambientes de produção, podemos definir que as máquinas virtuais simulam o hardware, enquanto os containers simulam o software, mas precisamente uma aplicação (wordpress, python, apache, postgresql, etc).

Benefícios:

  • Simplicidade no gerenciamento dos containers;
  • Reduz o número de sistemas necessários, pelo menor tamanho e sobrecarga;
  • Menor utilização de recursos (disco, memória e cpu) que uma virtualização completa;
  • Muitos programas já projetados para serem executados em containers;
  • Agilidade da criação e disponibilização de serviços e aplicativos;
  • Melhor rapidez na solução de problemas em diferentes ambientes;
  • Facilidade de backup e transferência de aplicações entre ambientes de desenvolvimento;

O Docker está disponível em 2 edições: CE (Community Edition) e EE (Enterprise Edition).

Docker CE: Plataforma grátis, ideal para iniciantes no Docker e para pequenos desenvolvedores;

Docker EE: Plataforma empresarial com assinatura e suporte, ideal para grandes empresas que desenvolvem aplicações críticas;

Instalando o Docker

O Docker pode ser instalado em diversos sistemas Linux como CentOS, Debian, Fedora e Ubuntu, também está disponível versões para Windows e MacOS. Para nossos exemplos utilizaremos o Debian 9. Podemos adicionar o repositório para a distribuição e usar os passos abaixo para fazer a instalação:

Também podemos baixar a versão mais atual, diretamente da empresa que desenvolve o Docker (precisa do curl instalado). Desta forma funcionará em qualquer distribuição. Para isso, digitamos o seguinte comando:

Após a finalização do script, o Docker já está pronto para ser utilizado, podemos verificar a versão com o comando:

Vamos utilizar o usuário root para gerenciar o Docker, caso esteja utilizando um usuário comum e não queira usar sudo para cada comando, pode adicionar o seu usuário ao grupo docker:

O Docker adiciona uma interface Bridge (docker0) no host hospedeiro. É através desta interface, que os containers se comunicam e também é feita o redirecionamento de portas para acesso aos aplicativos.

Docker introdução e gerenciamento de containers

 

Trabalhando com imagens

O Docker possui um repositório com diversas imagens de aplicações, tanto as oficiais como criadas por usuários, permitindo o seu compartilhamento. Esse repositório é o Docker Hub, vamos precisar baixar localmente essas imagens para criarmos nossos containers. Abaixo temos alguns comando úteis na criação e manipulação de imagens:

Pesquisando imagens no Docker Hub

O comando “docker search” irá pesquisar na base de dados do Docker Hub:

docker search

Fazendo download de uma imagem do Docker Hub

O comando “docker pull” irá preparar o download da imagem escolhida do Docker Hub, deixando disponível localmente:

docker pull

Fazendo download de uma versão específica da imagem

Na criação de imagens podemos definir um versionamento, quando formos baixá-la basta especificar qual versão deseja através do parâmetro <imagem>:<versão>. Abaixo um exemplo baixando a versão 5 do CentOS:

Listando todas as imagens disponíveis

O comando “docker images ls” ou somente “docker images” lista as imagens disponíveis localmente, exibindo algumas informações importantes, são elas:

REPOSITORY: Nome definido para imagem.
TAG: Utilizado para versionamento da imagem.
IMAGE ID: Identificação da imagem no Docker.
CREATED: Tempo de criação da imagem.
SIZE: Tamanho que a imagem ocupa no disco.

docker images

Exibindo mais detalhes da imagem

O comando “docker image inspect” ou somente “docker inspect” trás mais informações detalhadas relacionadas a imagem, como autor, variáveis de sistema, comando executado, entre outras:

Alterando nome e versão de uma imagem

O comando “docker image tag” ou somente “docker tag” permite alterar o nome de uma imagem e a versão. Precisamos passar os parâmetros <image id> e <repository>:<versão>. O comando irá criar uma nova imagem baseada na original:

docker images

Removendo uma imagem

O comando “docker image rm” ou somente “docker rmi” remove uma imagem baixada anteriormente. Precisamos passar como parâmetro <repository> ou <image id>:

Caso a imagem esteja associada a outra, ou exista um container que é baseado nela, será preciso utilizar o parâmetro -f para forçar a remoção:

docker image rm

Fazendo backup de uma imagem para um arquivo tar

O comando “docker image save” ou somente “docker save” salva a imagem no disco com o formato tar. Precisamos passar como parâmetro <repository> ou <image id>, e também o caminho -o </caminho/arquivo.tar>:

Restaurando backup a partir de um arquivo tar

O comando “docker image load” ou somente “docker load” carrega o arquivo para as imagens do Docker. Precisamos passar o parâmetro -i </caminho/arquivo.tar>:

 

Trabalhando com containers

Para começarmos a trabalhar com containers vamos utilizar o comando “docker run”. Para iniciar, vamos utilizar a imagem hello-world do repositório do Docker Hub, que trará uma mensagem de Hello e algumas informações. Caso a imagem não exista localmente, ele irá baixá-la:

docker run

Criando um container e executando um comando

docker run swabian

Criando um container e conectando ao console

Para podermos criar um container acessando o console, temos que passar os parâmetros -t (terminal) e -i (interatividade) junto com o comando “docker run”.

docker run -ti

Após criar o container já iremos cair direto no console, podemos ver que o usuário padrão é root e o nome do host é o container id.

Ao sair do console com exit, o container será finalizado. Para que ele continue executando, saia do console com CTRL + P, CTRL + Q, assim ele continuará em segundo plano.

Visualizando os containers em execução

O comando “docker container ls” ou somente “docker ps” lista os containers que estão em execução, exibindo algumas informações, são elas:

CONTAINER ID: Identificação do container no docker.
IMAGE: Imagem utilizada na criação do container.
COMMAND: Comando executado dentro do container.
CREATED: Tempo de criação do container.
STATUS: Status atual do container (Execução, pausado, etc).
PORTS: Portas utilizadas no container e se tem direcionamento de porta com o host hospedeiro.
NAMES: Nome do container (quando não é definido um nome o docker seleciona um aleatório).

docker ps

Definindo um nome na criação do container

O parâmetro ––name é utilizado para definir um nome para o container:

Criando container sem iniciá-lo

O comando “docker container create” ou somente “docker create” cria um container sem iniciá-lo:

Visualizando todos  os containers criados

Durante a manipulação dos containers, vários são criados e finalizamos, mas não excluídos. Para visualizá-los execute o comando “docker container ls” com o parâmetro -a:

docker ps -a

Removendo containers que não estão em execução

O comando “docker container prune” irá remover todos os containers que estão parados. Cuidado!!! Será solicitado confirmação e ao confirmar, não conseguirá desfazer o processo:

Criando containers auto destrutivos

Podemos utilizar o parâmetro ––rm, para criar containers que serão destruídos ao sairmos da sessão:

docker rum -rm

Iniciar um container que está parado

O comando “docker container start” ou somente “docker start” inicia um container parado. Precisamos passar como parâmetro o <nome> ou o <container id>:

Parando um container ativo

O comando “docker container stop” ou somente “docker stop”  interrompe um container ativo. Precisamos passar como parâmetro o <nome> ou <container id>:

Pausando um container que está em execução

O comando “docker container pause” ou somente “docker pause” interromper temporariamente um container. Precisamos passar como parâmetro o <nome> ou o <container id>:

docker pause

Tirando a pausa do container

O comando “docker container unpause” ou somente “docker unpause” retira a pausa do container. Precisamos passar como parâmetro o <nome> ou o <container id>:

docker unease

Executa um comando num container ativo

O comando “docker container exec” ou somente “docker exec” executa comandos dentro de um container em execução. Precisamos passar como parâmetro o <nome> ou o <container id>, seguido do comando desejado:

Salvando alterações do container numa imagem

Após criar um container e instalar programas, mudar configurações, você pode querer replicar estas alterações em outros containers, assim, precisamos salvar estas alterações como uma imagem. Para isso, utilizamos o comando “docker commit” e passamos como parâmetros o <container> e depois o <novo repository>:

Conectando no console de um containers em execução

O comando “docker container attach” ou somente “docker attach” é utilizado para acessar o console de um container que está em execução em segundo plano. Precisamos passar como parâmetro o <nome> ou <container id>:

Removendo um container

O comando “docker container rm” ou “docker rm” é utilizado para remover um container. Precisamos passar como parâmetro o <nome> ou <container id>:

Caso o container esteja em execução, será preciso utilizar a opção -f para forçar:

Criando container em background

Para deixar um container em background, precisamos passar o parâmetro -d na criação do container. Entretanto, para que funcione corretamente, o container precisa de um aplicativo rodando, por exemplo um servidor web:

docker run -d

Definir que um container fique sempre ativo

Para que um container fique sempre em execução, mesmo quando o host hospedeiro for reiniciado, utilizamos o parâmetro ––restart=always:

 

Trabalhando com volumes

Quando trabalhamos com containers de aplicativos, precisamos que os usuários acrescentem arquivos aos projetos que estão trabalhando (ex. webserver), mas o ideal é não dar acesso direto via ssh nesse container, então, podemos adicionar volumes que são acessados pelo host hospedeiro. Abaixo temos alguns exemplos de utilização:

Definindo um volume na criação de um container

Para definir um volume utilizamos o parâmetro -v seguido do <nome do volume>. O container acrescentará a partição mapeada /volumes ao sistema de arquivos do container. Os volumes geralmente ficam na pasta /var/lib/docker/volumes.

docker run -v

Mapeando volume na criação de um container

Podemos especificar um diretório que servirá de volume para o container, usando a opção -v <dir no host>:<volume no container>:

docker volumes

Criando um container de volume (data-only)

Podemos criar um container que tem como objetivo servir como um volume que poderá ser compartilhado entre os outros containers. Ele é um container que não fica em execução, abaixo temos um exemplo:

Compartilhando volume entre containers

Criaremos dois containers que irão mapear o nosso container de volume criado anteriormente (dados), para testar se ambos acessam o mesmo volume, iremos criar um script para exibir o hostname (container id) de cada um deles. Execute os comandos abaixo:

docker exec

Para mais informações sobre Docker e Containers, veja as referências utilizadas abaixo:

Referências:

https://docs.docker.com
https://linuxcontainers.org
https://www.howtoforge.com/tutorial/how-to-use-docker-introduction
https://www.server-world.info/en/note?os=Debian_9&p=docker&f=1
https://www.youtube.com/channel/UCJnKVGmXRXrH49Tvrx5X0Sw

%d blogueiros gostam disto: