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 vai te ensinar como executar os comandos básicos do Docker para rodar e gerenciar containers.
Utilizando os recursos úteis do Visual Studio (VS) Code, você também aprenderá como aprimorar suas habilidades SSH. Vamos começar!
Relacionado: Um Cara do Windows em um Mundo Linux: VS Code e SSH Remoto
Pré-requisitos
Se você deseja seguir passo a passo, neste tutorial, certifique-se de ter o seguinte:
- A fresh install of Ubuntu Server LTS with SSH Enabled (This guide will be using Ubuntu Server LTS 20.04.1)
- A Windows Machine with VSCode installed (This guide will be using Visual Studio Code 1.52.1)
- A extensão SSH oficial do VSCode instalada e conectada ao seu Ubuntu Server LTS
Instalando o Docker no Ubuntu
Vamos começar instalando o Docker no Ubuntu. Neste ponto, o tutorial parte do pressuposto de que você está em seu computador local com Windows, com o VS Code aberto e conectado ao seu Ubuntu Server via SSH. Aprenda a 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:

O processo atual de instalação do Docker no Ubuntu Server está a dois comandos de distância. O Ubuntu torna o Docker disponível como uma opção de instalação no gerenciador de pacotes padrão que acompanha o Ubuntu, conhecido como apt
.
No terminal SSH do VS Code, execute os seguintes dois comandos para instalar o Docker:
Durante a instalação do Ubuntu Server, você pode ter sido oferecido a opção de instalar o Docker como um snap. Se você fez isso, remova o pacote snap primeiro executando
sudo snap remove docker
Você pode acompanhar a instalação do Docker na animação abaixo:

O Ubuntu é gentil o suficiente para habilitar automaticamente o serviço e configurar o início automático para você, então você está pronto para começar a usar o Docker!
Criando e Executando um Contêiner Docker no Ubuntu
Agora que você tem o Docker 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 o Mapeamento de Portas para mapear a porta HTTP dentro do contêiner para o seu host Ubuntu
- Configurar os Vínculos de Montagem para mapear dados importantes de dentro do contêiner para o seu host Ubuntu
- Configure a persistência através de reinicializações para o seu contêiner
Se algum dos passos acima parecer confuso, não se preocupe, vamos cobrir cada etapa, uma de cada vez, para ajudá-lo a entender o processo.
Baixando a Imagem do Docker
A primeira pergunta que você deve fazer é: de onde virá este contêiner? 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 junto com todo o ambiente operacional. Fazê-lo elimina os problemas introduzidos pelas diferenças entre ambientes de 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 executar como contêineres.
Como 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 mudar um pouco as coisas e potencialmente apresentá-lo a um novo servidor web, vamos usar um chamado Caddy.
O Caddy é um servidor web conhecido por sua simplicidade. Muitas configurações de servidor válidas podem ser implementadas usando apenas uma linha em um arquivo. Simples é bom e também serve como um bom exemplo básico.
- Primeiro, você precisará encontrar a imagem do Docker. No seu computador com Windows, acesse https://hub.docker.com.
- Realize uma busca por caddy no canto superior esquerdo da página. Você deverá ver uma página semelhante à seguinte:

A benefit (and downside) of Docker Hub is that anyone, even you, can create and upload Docker Images to the site.
É importante garantir que a imagem escolhida provenha de uma fonte confiável. Qualquer pessoa pode inserir malware em uma imagem e fazer o upload de sua versão no 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 nos próximos passos.
Executando um Contêiner com Docker no Ubuntu
Assim que souber o nome da imagem que deseja baixar, é hora de baixá-la e criar um contêiner a partir dela.
Iniciar um contêiner a partir de uma imagem requer um único comando. No seu terminal SSH conectado ao seu servidor Ubuntu, execute o seguinte comando docker run
.
O comando abaixo verifica a existência da imagem caddy na máquina local. Se não existir, ele baixa a imagem do Docker Hub, cria um contêiner e o inicia. O comando abaixo utiliza a opção -p
para mapear a porta de escuta do servidor Ubuntu (porta 80) para a porta 80 do contêiner. Essa funcionalidade é chamada de mapeamento de porta.
A maioria das imagens no Docker Hub segue uma convenção de nomenclatura <user>/<nome da imagem>. No entanto, imagens marcadas como “oficiais” pela Docker não têm um <user> na frente delas (como o caddy acima).
A execução do comando acima gera saída semelhante à seguinte, com as informações de log do Caddy sendo exibidas diretamente no terminal:

Você pode notar que quase todos os comandos do Docker são prefixados com
sudo
, para forçar os comandos a serem executados como administrador. Por padrão, o serviço do Docker é executado comoroot
, e todas as alterações feitas em contêineres ou imagens devem ser feitas como administrador.
E… você está pronto para começar! É só isso. Não está feliz por ter instalado o Docker no Ubuntu?
Agora, acesse http://<seu-ip> no seu computador com Windows e você deverá ver uma página inicial para o Caddy. Você pode ver isso abaixo (o IP deste guia é substituído por http://homelab-docker):

O contêiner caddy está em execução agora, mas você pode ter notado um problema. Executar esse comando docker
toma conta da 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 desanexar o contêiner).
Executando Contêineres Docker em Segundo Plano
Agora você 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:
- Pare o contêiner atual pressionando control+c na linha de comando. Isso deve devolver sua linha de comando.
- Agora, execute o mesmo comando anterior, apenas com o parâmetro
-d
desta vez, como mostrado abaixo. Você verá que o Docker retornará um ID de contêiner e passará a linha de comando de volta para você.

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 statussudo docker container stop <nome>
: para um contêiner Docker pelo nome (ou pelo ID)sudo docker container start <nome>
: inicia um contêiner Docker pelo nome (ou pelo ID)sudo docker container prune
: destrói e remove todos os contêineres parados
Você pode ver todos os comandos acima usados em contexto na captura de tela abaixo:

Há muitos outros comandos de contêiner do Docker para visualizar, alterar, inspecionar ou até mesmo acessar remotamente contêineres em seu servidor. Você pode visualizá-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 há maneira de hospedar seu conteúdo personalizado. Como está, o Caddy está apenas servindo a página da web padrão.
Vamos dar uma olhada em como você pode usar imagens Docker com um conceito chamado montagens de vinculação para implantar containers com dados significativos.
Armazenando Dados do Contêiner com Montagens de Vinculação
O Docker funciona com o conceito de imagens (e os containers que elas geram) como sendo descartáveis ou transitórios. Se houver uma atualização no software Caddy, você não atualiza o serviço, descarta todo o conteúdo e usa uma imagem completamente nova do zero.
Os benefícios de descartar e recriar containers dessa forma são significativos. Instabilidades no software são introduzidas ao longo do tempo por atualizações contínuas em um software (potencialmente) antigo. Ao usar uma imagem nova a cada vez, o Docker fornece uma base estável, confiável, (presumivelmente) testada em cada atualização.
Esse conceito é equivalente a usar uma instalação nova do Windows toda vez que você atualiza seu software de aplicativo do Windows. Não é uma ideia divertida no Windows, mas extremamente aplicável no Docker.
A metodologia descartável, no entanto, tem um problema claro. Você não quer que dados essenciais sejam descartados quando o serviço atual é eliminado. O Docker resolve esse problema usando um conceito chamado montagens de vinculação.
Vamos agora explorar como criar uma montagem de vinculação para um contêiner.
Criando a Estrutura de Pasta e Fazendo a Limpeza
Antes de poder usar montagens de vinculação, 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 está conectado ao seu Servidor Ubuntu:
- 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 são de sua escolha, desde que estejam definidos corretamente no próximo comando docker. Ao usar uma barra inclinada, 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 pasta, mas ela faz mais sentido quando você tem vários containers no mesmo servidor.
Se ainda não feito anteriormente, pare e remova quaisquer containers que você tenha criado anteriormente com o seguinte:
Você pode ver esse comando na captura de tela abaixo:

Implantando um Container Caddy com Volumes de Ligação
Agora você possui a estrutura de pasta construída no Ubuntu Server. É hora de criar um container Caddy com volumes de ligação.
- Antes de prosseguir, descubra primeiro onde o container com o qual você está trabalhando armazena dados persistentes. Essa localização 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:

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 semelhante 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.
O til (~) no código acima refere-se à pasta home. Para este artigo, isso equivale a
/home/homelab
.
3. Abra um navegador e navegue de volta para o endereço http do seu servidor. Você notará que o servidor agora está servindo uma página 404
. Isso é esperado porque você atualmente 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 Explorador do VS Code que se parece com o seguinte:
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:

Ao contrário dos comandos de gerenciamento do Docker, os arquivos que você está criando (como index.html) não exigem 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! Não apenas você 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:
- Pare e remova o contêiner em execução. Esta etapa remove completamente tudo, incluindo o arquivo index.html, se você não estivesse usando bind mounts.
2. Crie um novo contêiner.
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.
- Pare e remova todos os contêineres em execução.
2. Reinicie o contêiner do caddy com o parâmetro --restart always
, para definir este novo contêiner para iniciar com o host no reinício. Com a bandeira --restart always
no lugar, seu contêiner agora se comporta como um serviço adequado: iniciando automaticamente no boot.
3. Reinicie o servidor.
4. Agora verifique se o novo contêiner é iniciado e ainda está servindo o arquivo index.html no endereço http://<seu servidor>
.
Você pode ver os seguintes comandos aplicados abaixo:

Seguindo em frente
Neste estágio, você deve ter um ambiente Docker funcional e um entendimento básico de imagens e contêineres. Você pode puxar, iniciar, parar e realizar o gerenciamento básico de seus contêineres. Você também criou com sucesso um contêiner de serviço da web em execução usando montagens de vínculo e mapeamento de porta.
Ainda há muito a ser abordado sobre o Docker: Fique ligado neste espaço, pois o próximo artigo abordará o gerenciamento avançado do Docker usando o Docker Compose.