Carregando...
DebianServidores Linux

Docker – Gerenciamento avançado de recursos

Tempo de leitura: 7 minutos

O Docker é uma ferramenta muito completa e com diversos recursos para criar e monitorar o funcionamento dos containers. Abaixo veremos algumas opções úteis que irão nos auxiliar na criação e manutenção dos nossos containers.

Opções de rede

Existem algumas configurações de rede que podemos fazer nos nossos containers, listamos abaixo alguns exemplos:

Definindo o nome do host do container

Por padrão o nome do host é o container id, podemos mudar utilizando o parâmetro −−hostname que irá definir um nome para este container:

docker --hostname

Definindo o servidor de DNS para o container

Se quisermos definir um dns específico para nosso container, podemos utilizar o parâmetro −−dns:

docker --dns

Personalizando MAC Address da interface do container

Podemos definir um MAC Address específico para a interface de rede do container utilizando o parâmetro −−mac-address:

docker --mac-address

Expondo uma porta do container

Definimos que um container terá acesso a uma porta através da opção −−expose:

docker --expose

Fazer redirecionamento (DNAT) de porta do host para um container

Para acessar um serviço de um container utilizando o IP do host hospedeiro, utilizamos o parâmetro −−publish, que criará uma regra pelo Iptables direcionando as portas:

docker --publish

Podemos verificar através do iptables que o docker adicionou uma regra de direcionamento:

iptables

Fazendo a ligação entre dois container

Para que um container reconheça outro, utilizamos o parâmetro −−link, basicamente ele acrescenta o container desejado no arquivo /etc/hosts:

docker --link

Definindo IP do hospedeiro para o container

Desta forma o ip do container será o mesmo do host hospedeiro com o parâmetro −−net=host. Basicamente seria como se o container estivesse simulando o host hospedeiro. Não é o ideal usar essa opção:

docker --net

 

Monitorando recursos

Existem diversos comandos do docker que nos auxiliam a gerenciar os recursos e analisar nossos containers, abaixo seguem alguns exemplos:

Listando informações do Docker

O comando “docker info”, traz diversas informações sobre o Docker, versão, imagens, quantos containers foram criados, quantos estão em execução, pausados, etc:

docker info

Verificando os logs dos containers

O comando “docker logs” exibe todas as ações realizadas dentro do container:

docker logs

Se você estiver trabalhando com um container que direciona os logs para saída padrão e quer analisar a saída desses logs, você pode utilizar o parâmetro -f, assim ele será atualizado de acordo com os novos registros:

docker logs -f

Verificando informações de processos em execução no container

O comando “docker top” exibe no console, informações dos processos executando no container. Precisamos passar como parâmetro o <nome> ou <container id>:

docker top

Visualizando todas as informações de um container

O comando “docker inspect”, lista diversas informações de um container, desde aspectos da sua criação (data, imagem base, autor…),  como características (rede, volumes, etc.). É um comando bem completo, que pode ser utilizado em conjunto com o grep para facilitar a pesquisa:

docker inspect

Também podemos formatar a saída do comando docker, usando o parâmetro -f, passando algumas strings:

Exibe o IP do container:

Exibe o MAC Address do container:

Exibe os volumes do container:

docker inspect -f

Limitando uso de memória no container

Por padrão, quando a memória não é limitada, o container utilizará até o limite de memória do host hospedeiro. O ideal é limitar de acordo com a utilização, evitando que um container interfira no funcionamento do outro. Utilizamos o parâmetro -m seguindo do tamanho que desejamos:

docker -m

Para alterar o valor de um container que está em execução, utilizamos o comando “docker update”, com o parâmetro -m:

docker update -m

Limitando uso de cpu no container

Por padrão, quando a cpu não é limitada, o container utilizará até o limite de cpu do host hospedeiro. Usamos proporção de uso de cpu para especificar quanto cada container poderá usar.

Caso não seja limitado o uso, o desempenho de um container pode afetar os demais. Utilizamos o parâmetro −−cpu-shares seguindo de um valor proporcional, vamos criar 3 containers como exemplo:

docker inspect | grep

No exemplo acima, container1 poderá usar 50% de recursos de cpu do host hospedeiro, enquanto que o container2 e container3 poderão usar 25% cada.

Para alterar recursos de cpu de containers em execução, utilizamos o comando “docker update”. Para igualar uso de cpu (33%) dos 3 containers, vamos alterar o valor do conatiner1, deixando igual aos demais:

docker --cpu-shares

Verificando o consumo de recursos pelos containers

O comando “docker stats” faz o acompanhamento em tempo real de todos os containers. Ele exibe as seguintes informações:

CONTAINER ID: Identificação do container no docker.
CPU %: Percentual de uso de CPU.
MEM USAGE / LIMIT: Quantidade de memória usada/limite.
MEM %: Percentual de memória usada.
NET I/O: Quantidade de uso de rede.
BLOCK I/O: Quantidade de escrita/leitura de blocos no disco.
PIDS: Quantidade de processos executando.

docker stats

Podemos verificar um container específico, passando como parâmetro o <nome> ou <container id>:

 

Trabalhando com Dockerfiles

Um arquivo Dockerfile é um script que contém algumas instruções para facilitar a criação de imagens personalizadas. A utilização desses arquivos automatizam o processo de criação e atualização de suas imagens. Abaixo estão descritos os mais importantes comandos usados nos Dockerfiles:

FROM: Define qual imagem base estamos usando para criarmos nossa imagem personalizada;
MAINTAINER: Definimos quem é o mantenedor da imagem, ela é opcional;
RUN: Permite executar comandos no momento da criação da imagem. O ideal é executar diversos comandos na mesma instrução RUN;
LABEL: Define metadados na nossa imagem, como descrição, versão;
ADD: Adiciona arquivos para dentro da imagem que estamos criando. Ele também envia arquivos tar descompactando-os;
COPY: Copia arquivos e diretórios para dentro da imagem;
CMD: Define o comando que será executado na inicialização de um container, pode ser sobrescrito na criação do mesmo. Também serve como parâmetro para o ENTRYPOINT;
ENTRYPOINT: Permite especificar qual será o principal processo dentro de um container. Por padrão é o bash, ele não pode ser sobrescrito;
ENV: Define variáveis de ambiente para o container. Úteis na configuração de uma ambiente;
EXPOSE: Permite determinar quais portas do container estarão disponível para conexão;
USER: Usuário padrão da imagem, o usuário padrão é o root;
WORKDIR: Define o diretório de trabalho do container;
VOLUME: Faz o mapeamento de um diretório para o container;

Exemplo simples de Dockerfile com Nginx e Php7

Para este exemplo, vamos criar uma pasta com alguns arquivos para adicionar na imagem, no momento do build. Também será instalado o supervisor, para controlar a inicialização de dois serviços diferentes dentro da imagem. Segue os passos:

Criando arquivo de configuração do nginx com suporte ao php7:

Arquivos de configuração do supervisor, configurando o start do nginx e php7:

Agora iremos criar nosso arquivo Dockerfile, lembrando que ele deve sempre ser escrito desta forma, com a primeira letra maiúscula:

Para criarmos a imagem iremos utilizar o comando “docker build”, com o parâmetro -t, para definirmos um nome e versão. O ponto no final do comando indica que o arquivo Dockerfile está na pasta atual, caso o arquivo Dockerfile esteja em outra pasta, basta passar o caminho até a pasta:

Após finalizar todo o processo de construção da imagem, ela já estará disponível para criar seus containers:

docker images

Agora para finalizar vamos criar um container usando nossa imagem. Para testar se está funcionando corretamente vamos mapear um volume e adicionar um arquivo php de teste:

Podemos acessar pelo browser do host hospedeiro, já que definimos um redirecionamento pela porta 8000:

browser

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: