Docker para iniciantes: rodar serviços no servidor doméstico
Quase todo serviço que você vai querer no servidor, do monitor de disponibilidade ao servidor de mídia, vem hoje "em Docker". Este guia explica o que isso significa sem teoria em excesso, instala o Docker do jeito recomendado pelo projeto e coloca um serviço real no ar com um arquivo de poucas linhas, cuidando para que ele fique acessível só dentro de casa.
- Para quem é
- Quem já acessa o servidor por SSH, está confortável com meia dúzia de comandos e quer rodar serviços sem bagunçar o sistema.
- Pré-requisitos
- SSH básico: acessar o servidor pela linha de comando.
- Você vai sair sabendo
- A diferença entre contêiner e máquina virtual, como instalar o Docker e o Compose, escrever um compose.yaml, subir, acompanhar, atualizar e remover um serviço, e onde seus dados ficam guardados.
O que é um contêiner (e o que ele não é)
Instalar um programa de servidor "na mão" significa adicionar pacotes, bibliotecas, arquivos de configuração e usuários ao sistema. Dois programas podem precisar de versões diferentes da mesma biblioteca; desinstalar um deixa restos; atualizar o sistema pode quebrar outro. Um contêiner resolve isso empacotando o programa com tudo de que ele precisa em uma caixa isolada, que roda sobre o mesmo Linux do servidor sem misturar nada com ele. Apagar o contêiner apaga a caixa inteira; o sistema continua como estava.
A comparação clássica é com a máquina virtual (VM): uma VM é um computador inteiro simulado, com seu próprio sistema operacional, que consome memória e disco como um computador de verdade. Um contêiner não simula hardware nem carrega um sistema completo; ele compartilha o núcleo do Linux do servidor e isola apenas o que o programa enxerga (arquivos, processos, rede). Resultado: um contêiner inicia em segundos e consome pouco; uma máquina modesta roda dez deles sem esforço. A VM continua sendo a escolha certa quando você precisa de outro sistema operacional (um Windows dentro do Linux, por exemplo) ou de isolamento forte; para rodar serviços Linux em um servidor Linux, o contêiner é mais leve e mais simples.
O vocabulário mínimo:
- Imagem: o pacote pronto, publicado pelo desenvolvedor do serviço, baixado de um registro como o Docker Hub. É como um instalador.
- Contêiner: uma imagem em execução. Você pode ter vários contêineres da mesma imagem.
- Volume: uma pasta do servidor conectada ao contêiner, onde os dados persistem. Sem volume, o que o serviço grava some quando o contêiner é recriado.
- Porta: o "número de portão" pelo qual o serviço atende na rede. O contêiner tem suas portas internas, e você decide quais expor no servidor.
Instalar o Docker no Ubuntu Server
O Ubuntu tem um pacote chamado docker.io nos repositórios normais, e há também o Docker em formato snap. Evite os dois: costumam estar atrasados e o snap tem limitações de permissões que geram erros difíceis de entender. O caminho recomendado pelo projeto é adicionar o repositório oficial do Docker ao apt, o que garante versões atuais e atualizações junto com o resto do sistema. O procedimento completo e sempre atualizado está em docs.docker.com/engine/install/ubuntu; em resumo, ele tem quatro movimentos:
- Instalar os pré-requisitos
sudo apt update && sudo apt install ca-certificates curl. São as ferramentas para baixar e validar a chave do repositório. - Adicionar a chave de assinatura do DockerA documentação fornece os comandos que baixam a chave pública do Docker para
/etc/apt/keyrings/docker.asc. É ela que permite aoaptconfirmar que os pacotes vêm do Docker e não foram alterados. - Adicionar o repositórioUm comando cria o arquivo
/etc/apt/sources.list.d/docker.listapontando para o repositório do Docker correspondente à sua versão do Ubuntu. Depois,sudo apt update. - Instalar os pacotes
TerminalO
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugindocker-ceé o motor; odocker-compose-pluginadiciona o comandodocker compose, usado no resto deste guia.
Existe um atalho: o script get.docker.com, mantido pelo próprio Docker, que faz esses quatro passos sozinho (curl -fsSL https://get.docker.com -o get-docker.sh e depois sudo sh get-docker.sh). Ele é conveniente, mas tem o mesmo problema de qualquer "baixe e execute como administrador": você está confiando cegamente no conteúdo. O próprio Docker o recomenda apenas para testes e ambientes de desenvolvimento. Para o servidor, vale os cinco minutos a mais do método do repositório.
Confirme que tudo funcionou e descubra as versões instaladas:
sudo docker version
sudo docker compose version
sudo docker run --rm hello-worldO último comando baixa uma imagem minúscula de teste, roda um contêiner que imprime uma mensagem de boas-vindas e o remove (--rm). Se a mensagem apareceu, o Docker está operacional.
Para não digitar sudo a cada comando, adicione seu usuário ao grupo docker com sudo usermod -aG docker $USER, saia e entre de novo no SSH. É cômodo, e é o que quase todo mundo faz em casa. Mas saiba que quem está no grupo docker tem, na prática, poder de administrador sobre o servidor, porque pode montar qualquer pasta dentro de um contêiner. Em um servidor doméstico com um único usuário administrador, é aceitável; não dê esse grupo a usuários que só deveriam acessar pastas compartilhadas.
Docker Compose: o serviço descrito em um arquivo
É possível subir contêineres com comandos longos do tipo docker run -d -p ... -v ... imagem, mas ninguém lembra desses comandos uma semana depois. O Docker Compose troca o comando por um arquivo de texto, o compose.yaml, que descreve o serviço: qual imagem, quais volumes, quais portas, se deve reiniciar sozinho. O arquivo fica guardado, pode ser lido, copiado para outro servidor e corrigido. Toda a operação passa a ser docker compose seguido de um verbo, rodado na pasta onde o arquivo está.
Repare no nome: docker compose, com espaço, é o plugin atual, instalado acima. O antigo docker-compose, com hífen, era um programa separado em Python; tutoriais antigos o usam e ele pode nem estar instalado na sua máquina. Se um comando com hífen falhar, troque pelo espaço.
Organize uma pasta por serviço. Uma estrutura que funciona bem é ~/servicos/nome-do-servico/, com o compose.yaml e as pastas de dados dentro. Assim, fazer backup dos serviços é fazer backup de ~/servicos, e os guias de ferramentas de backup se aplicam diretamente.
O primeiro serviço, do arquivo ao navegador
O exemplo é o Uptime Kuma, um monitor de disponibilidade com interface web: você cadastra o roteador, o NAS, o site da família, e ele avisa quando algo sai do ar. É um serviço real, útil em qualquer casa, com imagem oficial, um único volume e uma única porta: o exemplo perfeito para entender a receita.
- Criar a pasta e o arquivo
Terminal
mkdir -p ~/servicos/uptime-kuma cd ~/servicos/uptime-kuma nano compose.yaml - Descrever o serviçoCole o conteúdo abaixo no editor. A indentação com dois espaços faz parte da sintaxe: respeite-a.
Arquivo compose.yamlLinha a linha:
services: uptime-kuma: image: louislam/uptime-kuma:1 container_name: uptime-kuma restart: unless-stopped ports: - "3001:3001" volumes: - ./data:/app/dataimageé a imagem oficial do projeto, fixada na linha de versão 1 (sem isso, o Docker usarialatest, que pode mudar de versão principal sem aviso).restart: unless-stoppedfaz o contêiner voltar sozinho após um reinício do servidor, a menos que você o tenha parado de propósito.portsliga a porta 3001 do servidor à porta 3001 interna do contêiner; o número da esquerda é o que você usa no navegador.volumesconecta a pastadata, ao lado do arquivo, à pasta/app/datadentro do contêiner, onde o programa guarda seu banco de dados; é isso que faz os dados sobreviverem. - Subir o serviço
TerminalO Docker baixa a imagem (só na primeira vez) e inicia o contêiner. O
docker compose up -d-d("detached") devolve o terminal em vez de prender a tela com os registros. - Abrir no navegadorEm qualquer computador da casa, acesse
http://192.168.0.25:3001(com o IP do seu servidor). A tela de criação da conta de administrador do Uptime Kuma aparece. Pronto: seu primeiro serviço está no ar.
A receita é a mesma para qualquer outro serviço. Um servidor de mídia Jellyfin, por exemplo, usa a imagem jellyfin/jellyfin, a porta 8096, um volume para a configuração e outro, somente leitura, apontando para a pasta onde estão os vídeos (/mnt/dados/videos:/media:ro). A página de cada projeto no Docker Hub ou na documentação oficial informa a imagem, as portas e as pastas internas; o seu trabalho é só traduzir isso para o compose.yaml.
Operar no dia a dia: logs, atualização, limpeza
Todos os comandos abaixo são executados dentro da pasta do serviço (onde está o compose.yaml).
| Comando | O que faz | Quando usar |
|---|---|---|
docker compose up -d | Cria e inicia o serviço (ou aplica mudanças no arquivo) | Primeira vez e após editar o compose.yaml |
docker compose ps | Mostra o estado dos contêineres do arquivo | Para confirmar que está "running" ou "healthy" |
docker compose logs -f | Exibe os registros ao vivo (Ctrl+C sai sem parar o serviço) | Quando algo não funciona |
docker compose logs --tail 100 | Só as últimas 100 linhas | Diagnóstico rápido |
docker compose restart | Reinicia o serviço sem recriá-lo | Após mudar uma configuração interna |
docker compose pull e docker compose up -d | Baixa a imagem mais nova e recria o contêiner com ela | Para atualizar o serviço |
docker compose down | Para e remove o contêiner (os volumes ficam) | Para desligar um serviço de vez |
docker ps | Lista todos os contêineres em execução no servidor | Visão geral, de qualquer pasta |
docker image prune | Apaga imagens antigas que não estão mais em uso | Limpeza mensal; libera gigabytes |
docker stats | Consumo de CPU e memória por contêiner, ao vivo | Para ver quem está pesando |
Atualizar é o par pull e up -d: o Docker baixa a imagem nova e, ao recriar o contêiner, mantém o volume, de modo que os dados ficam. Como você fixou a linha de versão na imagem (:1), as atualizações ficam dentro de uma faixa compatível; para mudar de versão principal, leia as notas do projeto e troque a tag de propósito. Cada atualização deixa a imagem antiga no disco, e é por isso que o docker image prune entra na rotina de manutenção.
Como tudo que importa está na pasta do serviço (o compose.yaml e os volumes ao lado dele), o backup é copiar essa pasta, de preferência com o serviço parado (docker compose stop, copiar, docker compose start) para que bancos de dados não sejam copiados no meio de uma gravação. Restaurar em outro servidor é copiar a pasta de volta e rodar docker compose up -d. Teste essa restauração uma vez, como recomenda Testar e restaurar backups.
Segurança: portas, usuário e o que não fazer
Contêineres isolam, mas não blindam. Três cuidados fazem a diferença entre um servidor caseiro tranquilo e um problema:
- Portas publicadas ficam abertas na rede local. O
"3001:3001"do exemplo atende qualquer aparelho conectado ao seu roteador. Isso é o desejado dentro de casa, mas pense em quem está na rede: visitas com a senha do Wi-Fi, uma TV com aplicativos duvidosos. Serviços que só o próprio servidor precisa acessar (um banco de dados usado por outro contêiner, por exemplo) devem ser publicados em"127.0.0.1:5432:5432", ou nem publicados; contêineres do mesmo arquivo se enxergam pelo nome sem precisar de portas. - Não rode como root quando a imagem permitir. Dentro do contêiner, muitos programas rodam como administrador por padrão. Imagens bem mantidas aceitam a opção
user: "1000:1000"(o número do seu usuário no servidor, obtido comid -u) ou variáveis comoPUIDePGID. Isso faz os arquivos nos volumes pertencerem ao seu usuário e limita o estrago se o serviço tiver uma falha. - Escolha imagens com critério. Prefira a imagem oficial do projeto ou a de mantenedores conhecidos, verifique quando foi atualizada pela última vez e desconfie de imagens sem documentação. A imagem roda com acesso às pastas que você monta nela.
A tentação é grande: "abro a porta 3001 no roteador e vejo meus monitores de qualquer lugar". Fazer isso coloca um serviço, com todas as suas eventuais falhas, diretamente na internet, onde varreduras automáticas o encontram em minutos. Serviços domésticos não foram projetados para isso. O acesso de fora de casa é feito por VPN, como mostra Acesso remoto seguro: VPN, WireGuard, Tailscale e por que não abrir portas, e com ela você usa os mesmos endereços internos de sempre. Vale também para o socket do Docker: nunca monte /var/run/docker.sock em um contêiner que você não entende, pois isso lhe dá controle total do servidor.
Erros comuns
Glossário deste guia
- Contêiner
- Um programa rodando em uma caixa isolada sobre o Linux do servidor, com seus próprios arquivos e processos, sem simular hardware.
- Máquina virtual
- Um computador inteiro simulado, com sistema operacional próprio. Mais pesada que um contêiner; necessária quando o sistema convidado é outro.
- Imagem
- O pacote pronto de um serviço, publicado em um registro como o Docker Hub. Um contêiner é uma imagem em execução.
- Tag
- O rótulo após os dois-pontos no nome da imagem (
:1,:latest). Fixar uma tag evita atualizações surpresa. - Volume
- Pasta do servidor conectada ao contêiner. É onde os dados persistem quando o contêiner é recriado.
- Publicar porta
- Ligar uma porta do servidor a uma porta interna do contêiner, no formato
externa:interna, tornando o serviço acessível na rede. - Compose
- Plugin do Docker que lê um arquivo
compose.yamle cria, atualiza e remove os contêineres descritos nele. - Docker Hub
- O registro público mais usado de imagens. Cada imagem tem uma página com instruções de uso.
Checklist: primeiro serviço no ar?
Marque o que já fez. O progresso fica salvo apenas neste navegador.
Fontes e leituras complementares
- Docker, Install Docker Engine on Ubuntu: procedimento oficial de instalação pelo repositório e observações sobre o script de conveniência.
- Docker, Docker Compose documentation: referência do arquivo compose.yaml e dos comandos do plugin.
- Uptime Kuma, repositório oficial: instruções de instalação em Docker e nome da imagem usada no exemplo.
- Jellyfin, documentação oficial: instalação em contêiner do servidor de mídia citado como segundo exemplo.
Sobre este conteúdo. Guia escrito e revisado pela equipe editorial do ServersDesktop com base em documentação oficial dos projetos citados e na experiência de uso doméstico. Não há patrocínio, links de afiliado nem indicação de produto específico. Encontrou um erro? Avise pelo contato; correções são registradas na data de atualização.
Leia também a política editorial.
