Carregando...
ContainersDevOps

Docker – Introdução e gerenciamento de containers

Tempo de leitura: 9 minutos

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:

# apt -y install apt-transport-https curl gnupg2 software-properties-common
# curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
# add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian stretch stable"
# apt update && apt -y install docker-ce

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:

# curl -fsSl https://get.docker.com | bash

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

# docker ––version

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:

# sudo usermod -aG docker $(whoami)

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 debian

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 debian

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:

# docker pull centos:5

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 ls
# docker images

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:

# docker image inspect centos:5
# docker inspect centos:5

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 image tag 1ae98b2c895d centos:5.4
# docker tag 1ae98b2c895d centos:5.4

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>:

# docker image rm 6d83de432e98
# docker rmi 6d83de432e98

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 -f 1ae98b2c895d
# docker rmi -f 1ae98b2c895d

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>:

# docker image save debian -o /root/debian.tar
# docker save debian -o /root/debian.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>:

# docker image load -i /root/debian.tar
# docker load -i /root/debian.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 hello-world

docker run

Criando um container e executando um comando

# docker run debian /bin/echo "Bem-vindo ao Docker"

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 -it centos

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 container ls
# docker ps

docker ps

Definindo um nome na criação do container

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

# docker run -ti ––name teste debian

Criando container sem iniciá-lo

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

# docker container create ––name ubu ubuntu
# docker create ––name ubu ubuntu

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 container ls -a
# docker ps -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:

# docker container prune

Criando containers auto destrutivos

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

# docker run ––rm -it ––name testando debian

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>:

# docker container start teste
# docker start f162d3a30804

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>:

# docker container stop 8a6c279623fb
# docker stop suspicious_jepsen

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 container pause teste
# docker pause f162d3a30804

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 container unpause teste
# docker unpause f162d3a30804

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:

# docker container exec teste apt update && apt -y install apache2
# docker exec teste apt update && apt -y install apache2

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>:

# docker commit webapp nginx-webapp

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>:

# docker container attach teste
# docker attach f162d3a30804

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>:

# docker container rm dd614f0922a7
# docker rm dd614f0922a7

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

# docker container rm -f dd614f0922a7
# docker rm -f dd614f0922a7

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 container run -d ––name web httpd

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:

# docker run -d ––restart=always ––name webserver httpd

 

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 -ti -v /volume ––name files ubuntu

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>:

# mkdir -p /volumes/www
# echo '<html><body><h1>Docker Rulez!</h1></body></html>' > /volumes/www/index.html
# docker run -d -v /volumes/www:/usr/local/apache2/htdocs/ ––name www httpd

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:

# mkdir -p /volumes/data
# docker create -v /volumes/data:/data ––name dados centos:6

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:

# echo 'echo $(hostname)' > /volumes/data/host.sh

# docker run -d --name ubuntu ––volumes-from dados ubuntu bash -c "while true; do sleep 1; done"
# docker run -d --name centos ––volumes-from dados centos bash -c "while true; do sleep 1; done"

# docker ps
# docker exec ubuntu sh /data/host.sh
# docker exec centos sh /data/host.sh

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: