Instalação e manutenção

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.

Avançado 15 min de leitura Atualizado em 20 de outubro de 2026
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.
Servidor, contêineres, volumes e portas O servidor Linux hospeda o Docker Engine. Sobre ele rodam contêineres isolados, cada um com seus arquivos internos. Cada contêiner grava dados em um volume, que é uma pasta real do servidor, e expõe uma porta para a rede local, por onde os aparelhos da casa o acessam. Servidor (Ubuntu Server + Docker Engine) Contêiner A uptime-kuma porta interna 3001 arquivos próprios, isolados Contêiner B jellyfin porta interna 8096 não enxerga o contêiner A Contêiner C (o próximo serviço) mesma receita Volume ~/servicos/uptime-kuma/data Volumes config · /mnt/dados/videos dados persistem aqui Rede local 192.168.0.25:3001 e :8096
Cada contêiner é uma caixa isolada sobre o mesmo Linux. Os dados vivem em volumes (pastas reais do servidor) e só as portas que você publica ficam visíveis na rede.

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:

  1. Instalar os pré-requisitossudo apt update && sudo apt install ca-certificates curl. São as ferramentas para baixar e validar a chave do repositório.
  2. 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 ao apt confirmar que os pacotes vêm do Docker e não foram alterados.
  3. Adicionar o repositórioUm comando cria o arquivo /etc/apt/sources.list.d/docker.list apontando para o repositório do Docker correspondente à sua versão do Ubuntu. Depois, sudo apt update.
  4. Instalar os pacotes
    Terminal
    sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
    O docker-ce é o motor; o docker-compose-plugin adiciona o comando docker 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:

Terminal
sudo docker version
sudo docker compose version
sudo docker run --rm hello-world

O ú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.

Usar o Docker sem sudo: entenda o que está concedendo

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.

  1. Criar a pasta e o arquivo
    Terminal
    mkdir -p ~/servicos/uptime-kuma
    cd ~/servicos/uptime-kuma
    nano compose.yaml
  2. 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.yaml
    services:
      uptime-kuma:
        image: louislam/uptime-kuma:1
        container_name: uptime-kuma
        restart: unless-stopped
        ports:
          - "3001:3001"
        volumes:
          - ./data:/app/data
    Linha a linha: image é a imagem oficial do projeto, fixada na linha de versão 1 (sem isso, o Docker usaria latest, que pode mudar de versão principal sem aviso). restart: unless-stopped faz o contêiner voltar sozinho após um reinício do servidor, a menos que você o tenha parado de propósito. ports liga a porta 3001 do servidor à porta 3001 interna do contêiner; o número da esquerda é o que você usa no navegador. volumes conecta a pasta data, ao lado do arquivo, à pasta /app/data dentro do contêiner, onde o programa guarda seu banco de dados; é isso que faz os dados sobreviverem.
  3. Subir o serviço
    Terminal
    docker compose up -d
    O Docker baixa a imagem (só na primeira vez) e inicia o contêiner. O -d ("detached") devolve o terminal em vez de prender a tela com os registros.
  4. 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).

Comandos do Docker Compose para operar um serviço
ComandoO que fazQuando usar
docker compose up -dCria e inicia o serviço (ou aplica mudanças no arquivo)Primeira vez e após editar o compose.yaml
docker compose psMostra o estado dos contêineres do arquivoPara confirmar que está "running" ou "healthy"
docker compose logs -fExibe os registros ao vivo (Ctrl+C sai sem parar o serviço)Quando algo não funciona
docker compose logs --tail 100Só as últimas 100 linhasDiagnóstico rápido
docker compose restartReinicia o serviço sem recriá-loApós mudar uma configuração interna
docker compose pull e docker compose up -dBaixa a imagem mais nova e recria o contêiner com elaPara atualizar o serviço
docker compose downPara e remove o contêiner (os volumes ficam)Para desligar um serviço de vez
docker psLista todos os contêineres em execução no servidorVisão geral, de qualquer pasta
docker image pruneApaga imagens antigas que não estão mais em usoLimpeza mensal; libera gigabytes
docker statsConsumo de CPU e memória por contêiner, ao vivoPara 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.

Backup de um serviço em Docker

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 com id -u) ou variáveis como PUID e PGID. 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.
Nunca encaminhe portas de contêineres no roteador

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

"permission denied while trying to connect to the Docker daemon socket"

Seu usuário não está no grupo docker, ou está mas você não saiu e entrou de novo no SSH depois do usermod. Use sudo na frente do comando ou refaça o login.

"port is already allocated" ou "address already in use"

Outro programa (ou outro contêiner) já usa a porta da esquerda em ports. Descubra quem com sudo ss -tlnp | grep 3001 e mude o número da esquerda para uma porta livre, por exemplo "3002:3001". A porta da direita é interna ao contêiner e não muda.

Atualizei e perdi todas as configurações

O serviço estava gravando em uma pasta interna do contêiner que não tinha volume. Verifique na documentação da imagem quais pastas precisam ser persistidas e adicione cada uma em volumes. Infelizmente os dados do contêiner recriado não voltam; é por isso que o exemplo deste guia já nasce com volume.

O serviço inicia e para em segundos

Leia os registros com docker compose logs --tail 50. Os motivos mais comuns são variável de ambiente obrigatória faltando, erro de permissão na pasta do volume (o usuário do contêiner não consegue gravar nela; ajuste com sudo chown -R 1000:1000 ./data se usou user: "1000:1000") e erro de indentação no compose.yaml.

"docker-compose: command not found"

Você está seguindo um tutorial antigo. Troque docker-compose (com hífen) por docker compose (com espaço). Se também aparecer version: "3" no início do arquivo, pode apagar a linha: ela é ignorada pelo Compose atual.

O disco do sistema encheu

Imagens antigas e registros acumulam. Rode docker system df para ver quanto o Docker ocupa e docker image prune para limpar o que não é usado. Para registros, limite o tamanho por serviço com a opção logging no compose, ou globalmente em /etc/docker/daemon.json, conforme a documentação. E confira se os volumes de dados grandes (vídeos, fotos) estão no disco de dados, não no de sistema.

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.yaml e 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?

0 de 6

Marque o que já fez. O progresso fica salvo apenas neste navegador.

Próximos passos

Serviços no ar pedem rotina de cuidado, endereços fáceis de lembrar e, quando chegar a hora, acesso de fora de casa sem riscos. Leia nesta ordem:

Prefere um caminho montado para o seu caso? Use o navegador de guias por objetivo.

Fontes e leituras complementares

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.