Domine o Docker no Ubuntu: Guia de Implantação no Mundo Real

Se você está procurando informações sobre como instalar o Docker no Ubuntu, está no lugar certo. E não é só isso, como bônus, este tutorial também mostrará como executar os comandos básicos do Docker para iniciar e gerenciar contêineres.

Usando os recursos práticos do Visual Studio (VS) Code, você também aprenderá como aprimorar suas habilidades de SSH. Vamos começar!

Relacionado: Um usuário do Windows em um mundo Linux: VS Code e SSH Remoto

Pré-requisitos

Se deseja seguir passo a passo neste tutorial, certifique-se de ter o seguinte:

Instalando o Docker no Ubuntu

Vamos começar instalando o Docker no Ubuntu. Neste ponto, o tutorial assume que você está em seu computador Windows local com o VS Code aberto e conectado ao seu servidor Ubuntu via SSH. Aprenda como configurar este ambiente útil no último artigo sobre o uso do VS Code e SSH.

No exemplo abaixo, o VSCode está conectado remotamente ao Ubuntu com a pasta home (neste caso, /home/homelab) aberta como espaço de trabalho:

VSCode when SSHed into a Ubuntu Machine

O processo atual de instalação do Docker no Ubuntu Server está a apenas dois comandos de distância. O Ubuntu disponibiliza o Docker como uma opção de instalação no gerenciador de pacotes padrão, conhecido como apt.

No terminal SSH do VS Code, execute os dois comandos a seguir para instalar o Docker:

sudo apt update -y
sudo apt install docker.io -y

Durante a instalação do Ubuntu Server, você pode ter a opção de instalar o Docker como um snap. Se o fez, remova primeiro o pacote snap executando sudo snap remove docker

Você pode acompanhar a instalação do Docker na animação abaixo:

The Installation Process for Docker on Ubuntu

O Ubuntu é gentil o suficiente para ativar automaticamente o serviço e configurá-lo para iniciar no boot, então você está pronto para começar a usar o Docker!

Criando e Executando um Contêiner Docker no Ubuntu

Agora que o Docker está instalado, o que você pode fazer com ele? Vamos começar criando um contêiner Docker. Este tutorial configurará um servidor web estático como um bom exemplo de um contêiner Docker. Nesta seção, você irá:

  • Configurar um novo contêiner a partir do Repositório de Imagens do Docker Hub para executar um serviço HTTP
  • Usar Mapeamento de Porta para mapear a porta HTTP dentro do contêiner para o seu host Ubuntu
  • Configurar Vínculos de Montagem para mapear dados importantes de dentro do contêiner para o seu host Ubuntu
  • Configurar persistência através de reinicializações para o seu recipiente

Se algum dos passos acima parecer confuso, não se preocupe, vamos abordar cada passo, um de cada vez, para ajudar você a entender o processo.

Baixar a Imagem do Docker

A primeira pergunta que você deve fazer é: de onde virá este recipiente? Vamos dar uma olhada no Docker Hub.

A large part of Docker is understanding image repositories. Rather than being distributed like packages, services in Docker get distributed as Docker Images.

A Docker Image is a snapshot of the software that the publisher wants to distribute and the entire filing system! This is analogous to creating .wim image of Windows.

Esta captura de sistema de arquivos torna o Docker tão popular: o software é capturado juntamente com todo o ambiente operacional. Isso elimina os problemas introduzidos por diferenças entre os ambientes do servidor.

Um dos repositórios mais populares (e o padrão) para imagens é o Docker Hub, também conhecido como o repositório oficial do Docker. O repositório de imagens é onde você pode baixar milhares de imagens Docker pré-criadas para serem executadas como recipientes.

Dado que este tutorial está configurando um servidor web estático, você precisa baixar uma imagem de servidor web. Os dois servidores web mais populares são Apache httpd e Nginx, mas para variar um pouco e potencialmente apresentar a você um novo servidor web, vamos usar um chamado Caddy.

O Caddy é um servidor web conhecido por sua simplicidade. Muitas configurações válidas do servidor podem ser implantadas usando apenas uma linha em um arquivo. A simplicidade é boa e também serve como um bom exemplo básico.

  1. Primeiro, você precisará encontrar a imagem do Docker. Em sua máquina com Windows, navegue até https://hub.docker.com.
  2. Realize uma busca por caddy no canto superior esquerdo da página. Você deverá ver uma página semelhante à seguinte:
Searching for caddy on the Docker Hub

A benefit (and downside) of Docker Hub is that anyone, even you, can create and upload Docker Images to the site.

Você deve ter cuidado para garantir que a imagem que escolher venha de uma fonte confiável. Qualquer pessoa pode inserir malware em uma imagem se assim o desejar e fazer upload de sua versão para o Docker Hub.

3. Anote o nome da imagem. Na captura de tela acima, o nome é caddy exatamente. Você precisará desse nome para especificar o nome da imagem nas próximas etapas.

Executando um Container com Docker no Ubuntu

Assim que souber o nome da imagem que deseja baixar, é hora de baixá-la e criar um container a partir dela.

Iniciar um container a partir de uma imagem requer um único comando. Em seu terminal SSH conectado ao seu Servidor Ubuntu, execute o seguinte comando docker run.

O comando abaixo verifica a imagem caddy na máquina local. Se ela não existir, baixa a imagem do Docker Hub, cria um container e o inicializa. O comando abaixo está usando o switch -p para mapear a porta de escuta do Servidor Ubuntu 80 para a porta 80 do container. Esse recurso é chamado de mapeamento de porta.

sudo docker run -p 80:80 caddy

A maioria das imagens do Docker Hub segue uma convenção de nomenclatura de <usuário>/<nome da imagem>. No entanto, as imagens marcadas como “oficiais” pelo Docker não têm um <usuário> na frente delas (como caddy acima).

A execução do comando acima gera uma saída como a seguinte, com as informações de log do Caddy sendo exibidas diretamente no terminal:

Running the Caddy Docker container

Você pode notar que quase todos os comandos do Docker são precedidos por sudo, para forçar que os comandos sejam executados como administrador. Por padrão, o serviço do Docker é executado como root e todas as alterações que você fizer nos contêineres ou imagens devem ser feitas como administrador.

E… você está pronto para começar! É só isso. Você está feliz por ter instalado o Docker no Ubuntu?

Agora, acesse http://<seu-ip> em seu computador com Windows e você verá uma página inicial para o Caddy. Você pode ver abaixo (o IP deste guia foi substituído por http://homelab-docker):

The default landing page for Caddy

O contêiner caddy está em execução agora, mas você pode ter percebido um problema. Executar aquele comando docker assume o controle de sua linha de comando. Você não pode executar mais comandos e, se a sessão terminar, o contêiner em execução para. Vamos resolver esse problema executando o contêiner em segundo plano (também conhecido como desanexando o contêiner).

Executando Contêineres Docker em Segundo Plano

Você agora tem um contêiner em execução, mas sua linha de comando está travada. Você não pode fazer mais nada. Você precisa de uma maneira melhor de iniciar um contêiner executando-o em segundo plano como um serviço. Para fazer isso:

  1. Pare o contêiner atual pressionando control+c na linha de comando. Isso deve devolver sua linha de comando.
  2. Agora, execute o mesmo comando como anterior, mas desta vez com o parâmetro -d, conforme mostrado abaixo. Você verá que o Docker retornará um ID de contêiner e passará a linha de comando de volta para você.
sudo docker run -d -p 80:80 caddy
Running a detached container

Gerenciando Contêineres em Segundo Plano com Comandos Docker

Depois de ter um ou mais Dockers em segundo plano em execução, você precisará gerenciá-los de alguma forma. O Docker fornece alguns comandos diferentes para fazer isso usando comandos docker container.

  • sudo docker container list -a: Lista todos os contêineres (tanto em execução quanto parados) e seu status
  • sudo docker container stop <nome>: Para um contêiner do Docker pelo nome (ou pelo ID)
  • sudo docker container start <nome>: Inicia um contêiner do Docker pelo nome (ou pelo ID)
  • sudo docker container prune: Destrua e remova todos os contêineres parados

Você pode ver todos os comandos acima usados no contexto na captura de tela abaixo:

Managing detached containers using docker container commands

Existem muitos outros comandos de contêineres do Docker para visualizar, alterar, inspecionar ou até mesmo acessar remotamente os contêineres em seu servidor. Você pode vê-los todos executando sudo docker container --help.

Mesmo que você tenha implantado um servidor web em um contêiner em execução em segundo plano, ainda não tem como hospedar seu conteúdo personalizado. Como está, o Caddy está apenas servindo a página web padrão.

Vamos dar uma olhada em como você pode usar imagens do Docker com um conceito chamado montagem de bind para implantar containers com dados significativos.

Armazenando Dados do Contêiner com Montagens de Bind

O Docker trabalha com o conceito de imagens (e os contêineres que elas geram) como sendo descartáveis ou transientes. Se houver uma atualização no software Caddy, você não atualiza o serviço, você joga fora o bebê inteiro com a água do banho e usa uma imagem completamente nova do zero.

Os benefícios de descartar e recriar contêineres como este são significativos. Instabilidades no software são introduzidas ao longo do tempo pela atualização contínua de um software (potencialmente) antigo. Ao usar uma imagem nova a cada vez, o Docker fornece uma base estável, confiável e (presumivelmente) testada em cada atualização.

Este conceito é equivalente ao uso de uma instalação nova do Windows sempre que você atualiza seu software de aplicativo do Windows. Não é uma ideia divertida no Windows, mas extremamente aplicável no Docker.

A metodologia de descarte tem um problema claro, porém. Você não quer que dados essenciais sejam descartados quando o serviço atual for eliminado. O Docker resolve esse problema usando um conceito chamado montagens de bind.

Vamos agora explorar como criar uma montagem de bind para um contêiner.

Criando a Estrutura de Pastas e Limpeza

Antes de poder usar montagens de bind, você precisa criar um local para armazenar esses dados. Este tutorial criará uma pasta no seu diretório home. Para fazer isso no VS Code enquanto ainda estiver conectado ao seu Servidor Ubuntu:

  1. Clique com o botão direito em uma área em branco do painel do Explorer do VS Code e escolha nova pasta.

2. Nomeie a nova pasta como containers/caddy/files.

Os nomes das pastas ficam a seu critério, desde que estejam definidos corretamente no próximo comando docker. Usando uma barra (/), o VS Code interpreta isso como a criação de três pastas. A pasta files é um subdiretório de caddy, e caddy é um subdiretório de containers. Você não precisa usar essa estrutura de pastas, mas ela faz mais sentido quando você tem vários containers no mesmo servidor.

Se ainda não foi feito anteriormente, pare e remova quaisquer containers que você tenha criado anteriormente com o seguinte:

# pare e remova TODOS os containers atualmente em execução.
# O $(sudo docker ps -q) obtém dinamicamente todos os IDs de container em execução
sudo docker container stop $(sudo docker ps -q)
sudo docker container prune

Você pode ver esse comando na captura de tela abaixo:

Using the VSCode Explorer Window

Implantando um Container Caddy com Volumes Montados

Agora você tem a estrutura de pastas construída no servidor Ubuntu. É hora de criar um container Caddy com volumes montados.

  1. Antes de avançar muito, primeiro descubra onde o container com o qual você está trabalhando armazena dados persistentes. Esse local será diferente dependendo de quem criou a imagem Docker e qual é o seu propósito.

Sua melhor opção para encontrar onde os dados persistentes são armazenados é verificar a documentação dentro do Docker Hub para a imagem em questão. Para o Caddy, você pode encontrar a documentação aqui:

The Caddy documentation on Docker Hub

2. Inicie o contêiner usando o comando abaixo. O parâmetro -v ~/containers/caddy/files:/usr/share/caddy está mapeando o caminho antes do dois pontos (~/containers/caddy/files) para a pasta dentro do contêiner (/usr/share/caddy). Isso funciona de forma extremamente similar ao comando de mapeamento de porta: Exceto que você está mapeando uma pasta em vez de uma porta. Esse tipo de comando é chamado de Bind Mount.

# vincule uma pasta no host (o caminho antes do dois pontos) para
# /usr/share/caddy dentro do contêiner
sudo docker run -d -p 80:80 -v ~/containers/caddy/files:/usr/share/caddy caddy

O til (~) no código acima refere-se à pasta home. Para este artigo, isso é equivalente a /home/homelab.

3. Abra um navegador e navegue de volta para o endereço http do seu servidor. Você notará que o servidor está agora servindo uma página 404. Isso é esperado porque atualmente você não tem um arquivo index.html em ~/containers/caddy/files.

4. Crie um arquivo index.html em ~/containers/caddy/files no servidor Ubuntu na janela do Explorer do VS Code que se parece com o seguinte:

<body><h2>hello world!</h2></body>

5. Navegue até o endereço HTTP do seu servidor e confirme que o contêiner está agora servindo sua nova página index.html.

Você pode ver tudo acima na seguinte animação:

container is now serving your new index.html page.

Ao contrário dos comandos de gerenciamento do Docker, os arquivos que você está criando (como index.html) não requerem direitos administrativos. Isso ocorre porque você é o proprietário do conteúdo que o servidor Caddy está servindo, pois eles estão em sua pasta pessoal.

Validando o Bind Mount

Excelente! Você não apenas está usando um contêiner Docker completamente novo, mas esse contêiner está servindo conteúdo salvo localmente em sua pasta pessoal! Você pode comprovar isso executando o seguinte:

  1. Interrompa e remova o contêiner em execução. Este passo remove completamente tudo, incluindo o arquivo index.html, se você não estiver usando bind mounts.
sudo docker container stop $(sudo docker ps -q)
sudo docker container prune

2. Crie um novo contêiner.

sudo docker run -d -p 80:80 -v ~/containers/caddy/files:/usr/share/caddy caddy

3. Verifique se o novo contêiner ainda está servindo o arquivo index.html no endereço http://<seu servidor>.

Criando Contêineres Docker Persistentes

A container isn’t that useful if it stops when the server reboots. By default, that’s what is going to happen if you don’t make it happen. To prevent this, let’s generate a new caddy container again but this time once that restarts when the Docker host, Ubuntu in this case, restarts.

  1. Interrompa e remova todos os contêineres em execução.
# interrompa e remova TODOS os contêineres atualmente em execução
sudo docker container stop $(sudo docker ps -q)
sudo docker container prune

2. Reinicie o contêiner do Caddy com o parâmetro --restart always, para configurar esse novo contêiner para iniciar com o host na reinicialização. Com a bandeira --restart always em vigor, seu contêiner agora se comporta como um serviço adequado: iniciando automaticamente na inicialização.

sudo docker run -d -p 80:80 -v ~/containers/caddy/files:/usr/share/caddy --restart always caddy

3. Reinicie o servidor.

4. Agora, verifique se o novo contêiner sobe e ainda está servindo o arquivo index.html no endereço http://<seu servidor>.

Você pode ver os seguintes comandos aplicados abaixo:

Setting caddy to restart on boot

Seguindo em frente

Neste estágio, você deverá ter um ambiente Docker funcional e uma compreensão básica de imagens e contêineres. Você pode puxar, iniciar, parar e realizar a gestão básica de seus contêineres. Você também criou com sucesso um contêiner de serviço web em execução usando montagens vinculadas e mapeamento de portas.

Ainda há muito a ser abordado em relação ao Docker: Fique ligado neste espaço, pois o próximo artigo abordará o gerenciamento avançado do Docker usando o Docker Compose.

Source:
https://adamtheautomator.com/docker-ubuntu/