Série de Webinares: Começando com Container

Este artigo complementa uma série de webinars sobre o deploy e a gestão de cargas de trabalho contínuas na nuvem . A série abrange os fundamentos dos contêudos, incluindo a gestão da vida útil dos contêudos, a implantação de aplicativos com múltiplos contêudos, a escalação de cargas de trabalho e o entendimento do Kubernetes, além de destacar práticas melhores para executar aplicativos estáveis.

Este tutorial inclui conceitos e comandos apresentados na primeira sessão da série, Introdução às Containers.

Introdução

O Docker é um plataforma para implantar e gerenciar aplicativos contínuos em recipientes. Os recipientes 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
  • Docker Tools
  • Docker Registry

O Docker Engine proporciona as capacidades principais de gerenciamento de recipientes. Ele interage com o sistema operativo Linux subjacente para expor APIs simples para lidar com o ciclo de vida de recipientes.

As ferramentas de Docker são um conjunto de ferramentas de linha de comando que se comunicam com a API exposta pelo motor do Docker. Elas são usadas para executar recipientes, criar novas imagens, configurar armazenamento e redes, e muitas outras operações que afetam o ciclo de vida de um recipiente.

Registro do Docker é o lugar onde as imagens de contêiner 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êineres, 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 Dropleta 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 conectar-se à Dropleta por meio de SSH e rodar os seguintes comandos para remover quaisquer pacotes relacionados ao docker que já possam estar instalados e depois instalar o Docker da 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

Depois de instalar o Docker, verifique a instalação com os seguintes comandos:

  1. docker info

A seguir, o comando mostra detalhes sobre o motor de contêudos deployado no ambiente. O próximo comando verifica se as ferramentas do Docker estão corretamente instaladas e configuradas. Ele deve imprimir a versão de ambos o Motor e as Ferramentas do Docker.

  1. docker version

### Step 2 — Lançando Containers

Os contêudos Docker são lançados a partir de imagens existentes que estão armazenadas na registro. As imagens em 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á muitas imagens que coincidam com o nome hello-world. Escolha a que tem mais estrelas, indicando a popularidade da imagem.

Verifique as imagens disponíveis na sua ambientação atual com o seguinte comando:

  1. docker images

Como não houve nenhuma imagem lançada ainda, 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 então executar ela localmente. Executar o docker images novamente mostrará 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 notar opções adicionais passadas ao comando docker run. Aqui está a explicação dessas opções:

  • -p — Este comando informa ao Motor do Docker que exponha a porta 80 do contêiner na porta 80 do host. Como o Apache escuta na porta 80, precisamos expor essa porta no host.
  • --name — Esse switch atribui um nome ao seu contênero em execução. Se omitirmos esta opção, o Motor do Docker irá atribuir um nome aleatoriamente.
  • -d — Essa opção instrui o Motor do Docker a executar o contênero em modo detachado. Sem essa opção, o contênero será executado no foreground bloqueando acesso à shell. Conseguindo puslando o contênero para o fundo, podemos continuar usando a shell enquanto o contênero estiver rodando.

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

  1. docker ps

O resultado 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

Espere um momento e confira se você consegue acessar o servidor web:

  1. docker stop web
  2. docker rm web

Agora veja como parar e remover o contênero que está rodando com os seguintes comandos:

Running docker ps novamente confirma que o contênero foi terminado.

Os contêudos de um diálogo são efé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, lancemos o diálogo com um novo switch para montar o diretório htdocs. Apontando ele 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 comanda curl localhost novamente mostra 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

Executar 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 Docker a terminar sem parar primeiro.)

  1. docker rm -f web

Passo 4 — Construir 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 confirmadas 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 verificar isso com o comando curl localhost.

Antes de commitar o container modificado, é uma boa ideia parar-lo. 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 pesquisa no Docker Hub pelo navegador ou na linha de comandos.

Passo 5 — Lançamento de 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 marcar uma imagem local e enviar-la para o registro privado. Primeiro, vamos fazer o pull da imagem busybox do Hub Docker. Depois marque-la.

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

O comando anterior confirma que a imagem busybox agora está marcada com localhost:5000, então faça o push da 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 o 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 completou o ciclo completo de pull da imagem, marcar-la, enviar-la para o registro local e, finalmente, fazer o pull dela de volta.

Há casos em que você poderá querer executar o registro privado em um host dedicado. O Motor do Docker executado em máquinas diferentes conversarão com o registro remoto para pull e push de imagens.

Como o registro não é 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 existir, 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 infraestrutura de registro remota. 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 os conceitos essenciais incluindo a instalação, gestão de containers, gerenciamento de imagens, armazenamento e registro privado. As sessões subsequentes e artigos deste conjunto ajudarão você a ir além dos fundamentos do Docker.

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