Série de Webinais: Iniciando com Containers

Este artigo complementa uma série de webinars sobre a implantação e gerenciamento de cargas de trabalho em contêineres na nuvem. A série abrange os fundamentos de containers, incluindo gerenciamento de ciclo de vida de containers, implantação de aplicações de múltiplos containers, dimensionamento de cargas de trabalho e entendimento do Kubernetes, além de destacar melhores práticas para execução de aplicações estado-afetadas.

Este tutorial inclui os conceitos e comandos abordados na primeira sessão da série, Iniciando com Contêineres.

Introdução

O Docker é uma plataforma para implantar e gerenciar aplicações em contêineres. Contêineres são populares entre desenvolvedores, administradores e engenheiros de DevOps por causa da flexibilidade que oferecem.

O Docker tem três componentes essenciais:

  • Docker Engine
  • Ferramentas do Docker
  • Registro do Docker

O Docker Engine fornece as capacidades centrais de gerenciamento de containers. Ele se interface com o sistema operacional Linux subjacente para expor APIs simples para lidar com o ciclo de vida de containers.

As Ferramentas do Docker são um conjunto de ferramentas de linha de comando que se comunicam com a API exposta pelo Docker Engine. Elas são usadas para executar os containers, criar novos imagens, configurar armazenamento e redes e realizar muitas outras operações que afetam o ciclo de vida de um container.

Registro do Docker é o lugar onde as imagens de contêneros são armazenadas. Cada imagem pode ter múltiplas versões identificadas através de etiquetas únicas. Os usuários pulam imagens existentes do registro e push novas imagens para ele. Docker Hub é um registro hospedado gerenciado por Docker, Inc.. É também possível executar um registro dentro de suas próprias ambientações para mantê-los mais próximos do motor.

Ao final deste tutorial, você terá instalado o Docker em uma Dropleta DigitalOcean, gerenciado contêneres, trabalhado com imagens, adicionado persistência, e configurado um registro privado.

Pré-requisitos

Para seguir este tutorial, você precisará de:

Por padrão, o comando docker requer privilégios de root. No entanto, você pode executar o comando sem o prefixo sudo se executar o docker como um usuário da grupo docker.

Para configurar sua Droplets desta maneira, execute o comando sudo usermod -aG docker ${USER}. Isso adicionará o usuário atual ao grupo docker. Então, execute o comando su - ${USER} para aplicar a nova membresia do grupo.

Esta guia de instruções assume que seu servidor está configurado para executar o comando docker sem o prefixo sudo.

Passo 1 — Instalando o Docker

Após SSH em uma Droplet, execute os seguintes comandos para remover quaisquer pacotes relacionados ao docker que já possam estar instalados e então instalar o Docker do repositório oficial:

  1. sudo apt-get remove docker docker-engine docker.io
  2. sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
  3. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  4. sudo apt-key fingerprint 0EBFCD88
  5. sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  6. sudo apt-get update
  7. sudo apt-get install -y docker-ce

Após instalar o Docker, verifique a instalação com os seguintes comandos:

  1. docker info

A partir desta linha de comandos, você pode ver os detalhes da instalação do Docker Engine implantada no ambiente. O próximo comando verifica se as ferramentas do Docker estão corretamente instaladas e configuradas. Ele deve imprimir as versões do Docker Engine e das Ferramentas Docker.

  1. docker version

### Step 2 — Lançando Containers

Os containers do Docker são lançados a partir de imagens já existentes que são armazenadas na registro. As imagens no Docker podem ser armazenadas em repositórios privados ou públicos. Repositórios privados requerem autenticação antes de seus usuários puxarem imagens. Imagens públicas podem ser acessadas por qualquer um.

Para buscar uma imagem chamada hello-world, execute o seguinte comando:

  1. docker search hello-world

Há possíveis múltiplos resultados para o nome hello-world. Escolha a imagem com o número mais alto de estrelas, indicando a popularidade da imagem.

Verifique as imagens disponíveis na sua instância local com o seguinte comando:

  1. docker images

Como não houve nenhuma imagem lançada até agora, não haverá nenhuma imagem disponível. Podemos agora baixar a imagem e executar ela localmente:

  1. docker pull hello-world
  2. docker run hello-world

Se executarmos o comando docker run sem primeiro baixar a imagem, o motor do Docker irá primeiro baixar a imagem e depois executar ela localmente. Executar o docker images novamente mostra que temos a imagem hello-world disponível localmente.

Vamos lançar um container mais significativo: um servidor Web Apache.

  1. docker run -p 80:80 --name web -d httpd

Você pode observar opções adicionais passadas ao comando docker run. Aqui está a explicação dessas opções:

  • -p — Este comando indica ao motor do Docker Engine que exponha a porta 80 do contênero na porta 80 do host. Como o Apache escuta na porta 80, precisamos expor essa porta no host.
  • --name — Este switch atribui um nome ao seu contênero em execução. Se omitirmos esta opção, o motor do Docker Engine irá atribuir um nome aleatorio.
  • -d — Essa opção instrui o motor do Docker Engine a executar o contênero em modo detachado. Sem essa opção, o contênero será executado na frente bloqueando acesso à shell. Pushando o contênero para o fundo, podemos continuar usando a shell enquanto o contênero está ainda rodando.

Para verificar se o nosso contênero de fato está rodando em fundo, tente esse comando:

  1. docker ps

A saída mostra que o contênero chamado web está rodando com a porta 80 mapeada para a porta 80 do host.

Agora acesse o servidor web:

  1. curl localhost

Experimente acessar o servidor web:

  1. docker stop web
  2. docker rm web

Para parar e remover o contênero que está rodando, use os seguintes comandos:

Running docker ps novamente confirma que o contênero foi terminado.
Step 3 — Adicionando Armazenamento ao Contênero

Os contêudos de um diálogo são epímeros, o que significa que qualquer informação armazenada dentro de um diálogo será perdida quando o diálogo for terminado. Para manter dados além do tempo de vida de um diálogo, precisamos anexar uma volumem ao diálogo. Um volume é diretório da sistema de arquivos do host.

Comece criando um novo diretório no host:

  1. mkdir htdocs

Agora, lance o diálogo com um novo switch para montar o diretório htdocs. Apontando-o para a raiz do servidor Web do Apache:

  1. docker run -p 80:80 --name web -d -v $PWD/htdocs:/usr/local/apache2/htdocs httpd

O -v switch aponta o diretório htdocs dentro do diálogo para o sistema de arquivos do host. Qualquer alteração feita neste diretório será visível em ambas as locais.

Acesso ao diretório do diálogo pela execução da seguinte comanda:

  1. docker exec -it web /bin/bash

Esta comanda conecta sua consola à shell do diálogo em modo interativo. Você deve ver que você foi depositado dentro do diálogo.

Navegue para o diretório htdocs e crie um simples arquivo HTML. Finalmente, saia da shell do diálogo:

  1. cd /usr/local/apache2/htdocs
  2. echo '<h1>Hello World from Container</h1>' > index.html
  3. exit

Executando a seguinte comanda curl localhost mostra novamente que o servidor Web está retornando a página que você criou.

Veja que não somente pode acessar esta página do diálogo, mas também a modificar:

  1. cd htdocs
  2. cat index.html
  3. echo '<h1>Hello World from Host</h1>' | sudo tee index.html >/dev/null

Executando novamente a curl localhost confirma que o servidor Web está exibindo a página criada do host.

Termine o diálogo com a seguinte comanda. (O -f força o Docker a terminar sem parar primeiro.)

  1. docker rm -f web

Passo 4 — Construindo Imagens

Além de executar imagens existentes do registro, você pode criar suas próprias imagens e armazená-las no registro.

Você pode criar novas imagens a partir de containers existentes. As alterações feitas ao container são primeiro cometidas e então as imagens são marcadas e enviadas para o registro.

Lancemos o container httpd novamente e modifique o arquivo padrão index.html:

  1. docker run -p 80:80 --name web -d httpd
  2. docker exec -it web /bin/bash
  3. cd htdocs
  4. echo '<h1>Welcome to my Web Application</h1>' > index.html
  5. exit

O container agora está rodando com um index.html personalizado. Você pode verificá-lo com o comando curl localhost.

Antes de cometer o container modificado, é uma boa ideia parar ele. Depois que ele seja parado, execute o comando de commit:

  1. docker stop web
  2. docker commit web doweb

Confira a criação da imagem com o comando docker images. Ele mostra a imagem doweb que acabou de ser criada.

Para marcar e armazenar esta imagem no Docker Hub, execute os seguintes comandos para enviar sua imagem para o registro público:

  1. docker login
  2. docker tag your_docker_hub_username/doweb
  3. docker push your_docker_hub_username/doweb

Veja a nova imagem na busca no Docker Hub na linha de comandos ou na web.

Passo 5 — Lançando um Registro Privado

É possível executar o registro de imagens em ambientes privados para manter as imagens mais seguras. Isso também reduz a latência entre o Motor do Docker e o repositório de imagens.

O Registro do Docker está disponível como um contêiner que pode ser lançado como qualquer outro contêiner. Como o registro armazena múltiplas imagens, é uma boa ideia anexar um volume de armazenamento à ele.

  1. docker run -d -p 5000:5000 --restart=always --name registry -v $PWD/registry:/var/lib/registry registry

Observe que o contênero foi lançado no fundo com a porta 5000 exposta e o diretório registry mapeado ao sistema de arquivos do host. Você pode verificar que o contênero está rodando executando o comando docker ps.

Agora você pode verificar se o contênero está rodando executando o comando docker ps. Nota que o contênero agora está marcado com localhost:5000, então você pode conferir que a imagem busybox foi marcada com o registro privado.

  1. docker pull busybox
  2. docker tag busybox localhost:5000/busybox
  3. docker images

O comando anterior confirma que o contênero busybox agora está marcado com localhost:5000, então vamos enviar a imagem para o registro privado.

  1. docker push localhost:5000/busybox

Com a imagem enviada para o registro local, vamos tentar removê-la do ambiente e fazer uma pull dela novamente do registro.

  1. docker rmi -f localhost:5000/busybox
  2. docker images
  3. docker pull localhost:5000/busybox
  4. docker images

Veja como você passou por todo o ciclo de pull da imagem, marcar a imagem, enviá-la para o registro local e, finalmente, fazer um pull dela de volta.

Há casos em que você poderia desejar rodar o registro de imagens em um hospedeiro dedicado. O Motor do Docker rodando em máquinas diferentes conversarão com o registro remoto para pull e push das imagens.

Como o registro não está seguro, precisamos modificar as configurações do Motor de Imagens do Docker para permitir acesso ao registro sem segurança. Para fazer isso, edite o arquivo /etc/docker/daemon.json. Se o arquivo não existe, crie-o.

Adicione a seguinte entrada:

Editing /etc/docker/daemon.json
{
  "insecure-registries" : ["REMOTE_REGISTRY_HOST:5000"]
}

Substitua REMOTE_REGISTRY_HOST com o hostname ou IP da instância do registro remoto. Restarte o Motor de Imagens do Docker para garantir que as alterações na configuração sejam aplicadas.

##Conclusão
Este tutorial teve como objetivo ajudar você a começar com o Docker. Ele abordou conceitos essenciais incluindo a instalação, gerenciamento de containers, gerenciamento de imagens, armazenamento e registro privado. As sessões e artigos subsequentes desta série lhe ajudarão a ir além dos fundamentos do Docker.

Source:
https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-docker