Poupe até 53% em Servidores VPS, escolha agora. Oferta limitada.

Guia Docker + Portainer no mesmo servidor: conflitos e soluções

17 min de leitura  ·  Guia técnico

Docker com Portainer no mesmo servidor é a combinação mais comum para gerenciar containers via interface web, mas gera conflitos de porta, permissões de socket e sobreposição de redes que travam a operação. Para colocar os dois funcionando juntos sem problemas, siga estes passos:

  1. Instale o Docker Engine no servidor (Ubuntu 24.04, Debian 12 ou Rocky Linux 9)
  2. Crie o volume persistente portainer_data antes de subir o container
  3. Suba o Portainer mapeando o socket /var/run/docker.sock e a porta correta
  4. Ajuste o firewall para liberar apenas as portas 9443 (HTTPS) e 8000 (agente)
  5. Acesse a interface web, defina a senha de admin e conecte o endpoint local
  6. Valide que containers criados via CLI aparecem automaticamente no painel

Pré-requisitos para rodar Docker e Portainer no mesmo servidor

  • Acesso root ou usuário com sudo no servidor
  • Ubuntu 24.04 LTS, Debian 12 ou Rocky Linux 9 (exemplos deste guia cobrem os três)
  • Docker Engine 26.x ou superior instalado (não Docker Desktop)
  • Porta 9443 e 9000 livres — verifique com ss -tlnp | grep LISTEN
  • Mínimo de 512 MB de RAM disponível além do que as aplicações já consomem
  • Firewall UFW ou firewalld configurado (não desativado)
  • Conhecimento básico de linha de comando SSH — veja como acessar servidores VPS Linux da AviraHost se precisar de ajuda com a conexão inicial

Instalando o Docker Engine no Ubuntu 24.04 e Debian 12

O gerenciamento de containers com Docker começa pela instalação correta do daemon. Evite instalar o pacote docker.io dos repositórios padrão do sistema — ele costuma estar desatualizado. Use o repositório oficial da Docker Inc.

  1. Remova versões antigas, se existirem:
sudo apt remove docker docker-engine docker.io containerd runc -y
  1. Adicione o repositório oficial:
sudo apt update
sudo apt install ca-certificates curl gnupg -y
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
  1. Instale o Docker Engine:
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
  1. Verifique a instalação:
docker --version
sudo systemctl status docker
Docker version 26.1.4, build 5650f9b
● docker.service - Docker Application Container Engine
   Active: active (running)

Para Rocky Linux 9, substitua o repositório pelo equivalente para RHEL:

sudo dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo
sudo dnf install docker-ce docker-ce-cli containerd.io docker-compose-plugin -y
sudo systemctl enable --now docker

Adicione seu usuário ao grupo docker para evitar usar sudo em cada comando:

sudo usermod -aG docker $USER
newgrp docker

Instalando o Portainer CE e resolvendo conflitos de porta

O Portainer para gerenciar containers Docker é distribuído como imagem oficial e deve ser executado como container. O ponto mais comum de conflito é a porta 9000, usada por padrão pelo Portainer e frequentemente ocupada por outras aplicações como Prometheus, Grafana ou painéis de hospedagem.

Antes de criar o container, verifique as portas em uso:

ss -tlnp | grep LISTEN
LISTEN  0  128  0.0.0.0:9000  0.0.0.0:*  users:(("node",pid=1234,fd=12))

Se a porta 9000 estiver ocupada, mapeie o Portainer para outra porta externa. O exemplo abaixo usa 9443 para HTTPS (recomendado para produção) e redireciona a porta interna 9000 para 8080 externamente:

  1. Crie o volume persistente:
docker volume create portainer_data
  1. Suba o container do Portainer com HTTPS na porta 9443:
docker run -d \
  -p 8000:8000 \
  -p 9443:9443 \
  --name portainer \
  --restart=always \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer_data:/data \
  portainer/portainer-ce:latest
Unable to find image 'portainer/portainer-ce:latest' locally
latest: Pulling from portainer/portainer-ce
...
Status: Downloaded newer image for portainer/portainer-ce:latest
a3f9c2d1e8b7...
  1. Confirme que o container está rodando:
docker ps --filter name=portainer
CONTAINER ID   IMAGE                    COMMAND        CREATED         STATUS         PORTS
a3f9c2d1e8b7   portainer/portainer-ce   "/portainer"   2 minutes ago   Up 2 minutes   0.0.0.0:8000->8000/tcp, 0.0.0.0:9443->9443/tcp
  1. Acesse a interface web em https://IP_DO_SERVIDOR:9443 e defina a senha do administrador na primeira visita.

Atenção: o certificado TLS gerado automaticamente pelo Portainer é autoassinado. O navegador exibirá aviso de segurança — isso é esperado. Para produção, substitua pelo certificado Let's Encrypt montando-o como volume.

Configurando o firewall para Docker e Portainer sem expor o socket

Um ponto crítico na coexistência de Docker e Portainer é o comportamento do Docker com iptables. O Docker manipula regras de iptables diretamente, o que pode contornar regras do UFW e expor portas de containers para a internet sem que o administrador perceba.

Para verificar se o Docker está sobrescrevendo regras do UFW:

sudo iptables -L DOCKER -n --line-numbers

Se você ver regras ACCEPT para portas que não liberou explicitamente, o Docker está abrindo essas portas. A solução é configurar o Docker para não manipular iptables diretamente ou usar a interface de rede 127.0.0.1 no bind das portas:

docker run -d \
  -p 127.0.0.1:9443:9443 \
  -p 127.0.0.1:8000:8000 \
  --name portainer \
  --restart=always \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer_data:/data \
  portainer/portainer-ce:latest

Com esse bind, o Portainer só aceita conexões locais. Para acesso externo, use um proxy reverso Nginx com SSL. Libere apenas as portas necessárias no UFW:

sudo ufw allow 9443/tcp comment "Portainer HTTPS"
sudo ufw allow 8000/tcp comment "Portainer Agent"
sudo ufw reload
sudo ufw status verbose
Status: active
To                         Action      From
--                         ------      ----
9443/tcp                   ALLOW IN    Anywhere
8000/tcp                   ALLOW IN    Anywhere

Para ambientes com múltiplos serviços Docker, considere criar redes isoladas por projeto. Isso evita que containers de projetos diferentes se comuniquem acidentalmente:

docker network create --driver bridge rede_projeto_a
docker network create --driver bridge rede_projeto_b

Consulte também o artigo Dicas de Otimização de Servidores Linux para ajustes complementares de kernel que melhoram o desempenho de redes Docker em produção.

Gerenciando containers Docker pelo Portainer: operações essenciais

Com o Portainer instalado e acessível, o gerenciamento de containers via interface web cobre as operações que antes exigiam CLI. Qualquer container criado manualmente via docker run aparece automaticamente no painel — o Portainer lê o estado do daemon em tempo real.

Operações disponíveis na interface do Portainer CE:

  • Containers: criar, iniciar, parar, reiniciar, remover, inspecionar logs e acessar terminal interativo
  • Imagens: listar, puxar do Docker Hub, remover imagens não utilizadas
  • Volumes: criar, inspecionar e remover volumes persistentes
  • Redes: criar redes bridge, overlay e macvlan; conectar e desconectar containers
  • Stacks: implantar aplicações multi-container via Docker Compose diretamente pela interface
  • Registries: conectar registros privados (Docker Hub, GitHub Container Registry, registros próprios)

Para implantar uma stack via Portainer, vá em Stacks → Add Stack, cole o conteúdo do docker-compose.yml e clique em Deploy the stack. O Portainer executa o equivalente a docker compose up -d internamente.

Exemplo de stack para WordPress com MySQL gerenciada pelo Portainer:

version: "3.8"
services:
  db:
    image: mysql:8.0
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: senha_segura
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wp_user
      MYSQL_PASSWORD: wp_senha
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - wp_net

  wordpress:
    image: wordpress:6.5-php8.3-apache
    restart: always
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wp_user
      WORDPRESS_DB_PASSWORD: wp_senha
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - wp_data:/var/www/html
    networks:
      - wp_net

volumes:
  db_data:
  wp_data:

networks:
  wp_net:
    driver: bridge

Atualizando o Portainer sem perder stacks e configurações

A atualização do Portainer CE exige atenção para não apagar o volume portainer_data, onde ficam armazenados usuários, endpoints, stacks e configurações. O processo correto é parar e remover apenas o container, mantendo o volume intacto.

Atenção: nunca execute docker rm -v portainer — a flag -v remove o volume junto com o container, apagando todas as configurações.

  1. Pare e remova o container (sem remover o volume):
docker stop portainer
docker rm portainer
  1. Puxe a versão mais recente da imagem:
docker pull portainer/portainer-ce:latest
latest: Pulling from portainer/portainer-ce
Digest: sha256:abc123...
Status: Image is up to date for portainer/portainer-ce:latest
  1. Recrie o container com o mesmo volume:
docker run -d \
  -p 8000:8000 \
  -p 9443:9443 \
  --name portainer \
  --restart=always \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer_data:/data \
  portainer/portainer-ce:latest
  1. Confirme que o volume foi preservado:
docker volume inspect portainer_data
[
    {
        "Name": "portainer_data",
        "Driver": "local",
        "Mountpoint": "/var/lib/docker/volumes/portainer_data/_data",
        ...
    }
]

Ao acessar https://IP_DO_SERVIDOR:9443 após a atualização, todas as stacks, usuários e endpoints estarão preservados.

Problemas comuns e como resolver

Sintoma: Portainer não inicia — erro "permission denied" ao acessar o socket

Causa: o socket /var/run/docker.sock pertence ao grupo docker e o usuário que executa o container não tem permissão de leitura/escrita. Isso ocorre especialmente em sistemas com SELinux ou AppArmor ativos.
Solução: verifique as permissões do socket com ls -la /var/run/docker.sock. O output esperado é srw-rw---- 1 root docker. Se o grupo estiver errado, corrija com sudo chown root:docker /var/run/docker.sock. Em sistemas com SELinux (Rocky Linux 9, AlmaLinux 9), adicione a opção :z ao montar o volume: -v /var/run/docker.sock:/var/run/docker.sock:z.

Sintoma: porta 9443 ou 9000 já está em uso ao subir o Portainer

Causa: outra aplicação — como Prometheus, Grafana, Cockpit ou um painel de hospedagem — está escutando na mesma porta.
Solução: identifique o processo com ss -tlnp | grep 9443 ou ss -tlnp | grep 9000. Se não quiser parar a outra aplicação, remapeie a porta do Portainer: substitua -p 9443:9443 por -p 9444:9443 (ou qualquer porta livre acima de 1024). Atualize as regras de firewall correspondentes.

Sintoma: containers criados via CLI não aparecem no Portainer

Causa: o Portainer está conectado a um endpoint diferente do daemon local, ou o container do Portainer foi iniciado sem o socket montado.
Solução: verifique se o socket está montado com docker inspect portainer | grep -A5 Mounts. Se o socket não aparecer nos mounts, o container foi criado sem o parâmetro -v /var/run/docker.sock:/var/run/docker.sock. Pare, remova e recrie o container com o parâmetro correto. No painel do Portainer, vá em Environments e confirme que o endpoint local está com status Up.

Sintoma: Docker sobrescreve regras do UFW e expõe portas de containers

Causa: o Docker manipula iptables diretamente e insere regras na chain DOCKER que têm precedência sobre as regras do UFW.
Solução: faça o bind das portas apenas no loopback (127.0.0.1) ao criar containers que não devem ser acessados externamente. Para serviços que precisam de acesso externo, use um proxy reverso Nginx na frente e libere apenas as portas 80 e 443 no UFW. Alternativamente, edite /etc/docker/daemon.json e adicione "iptables": false — mas isso exige que você gerencie todas as regras de iptables manualmente.

Sintoma: Portainer exibe "Your Portainer instance timed out for security purposes"

Causa: o Portainer tem um timeout de segurança de 5 minutos na tela de configuração inicial. Se a senha de admin não for definida nesse período, o container precisa ser reiniciado.
Solução: execute docker restart portainer e acesse a interface imediatamente para definir a senha. Em ambientes com latência alta, considere aumentar o timeout via variável de ambiente --env PORTAINER_TIMEOUT=600 ao criar o container.

Perguntas frequentes sobre Docker e Portainer no mesmo servidor

Portainer e Docker precisam estar no mesmo servidor para funcionar?

Sim, o Portainer é executado como um container Docker e depende do daemon do Docker para funcionar. Ele se conecta ao socket Unix /var/run/docker.sock para gerenciar containers, imagens e volumes. Sem o Docker instalado e em execução, o Portainer não inicializa. Para gerenciar servidores remotos, use o Portainer Agent instalado no servidor remoto e conecte-o ao Portainer central via endpoint.

O Portainer ocupa a porta 9000 e conflita com outra aplicação. Como resolver?

Você pode remapear a porta do Portainer ao criar o container, substituindo -p 9000:9000 por -p 8080:9000 (ou qualquer porta livre). Para verificar quais portas estão em uso, execute ss -tlnp | grep LISTEN antes de subir o container. A porta interna do container (9000) não muda — apenas o mapeamento externo é alterado.

É seguro montar o socket /var/run/docker.sock no Portainer?

Montar o socket concede ao Portainer acesso total ao daemon Docker, o que equivale a privilégios de root no host. Em ambientes de produção, restrinja o acesso ao Portainer com autenticação forte, limite o acesso à porta 9443 por firewall e considere usar o Portainer Agent em vez do socket direto para ambientes multi-nó. Nunca exponha a porta do Portainer diretamente para a internet sem autenticação e HTTPS.

Como atualizar o Portainer sem perder configurações e stacks?

Pare e remova o container atual com docker stop portainer && docker rm portainer, mas mantenha o volume portainer_data intacto — nunca use a flag -v no docker rm. Em seguida, puxe a nova imagem com docker pull portainer/portainer-ce e recrie o container com o mesmo volume montado. Todas as configurações, usuários e stacks são preservados no volume.

Portainer consegue gerenciar containers criados manualmente via CLI do Docker?

Sim. O Portainer lê o estado atual do daemon Docker em tempo real, então qualquer container criado via CLI aparece automaticamente na interface web. Você pode inspecionar, parar, reiniciar e remover esses containers pelo Portainer sem nenhuma configuração adicional. A sincronização é imediata — não há necessidade de atualizar manualmente a lista de containers.

Conclusão

  • Instale o Docker Engine pelo repositório oficial e suba o Portainer CE com o volume portainer_data e o socket /var/run/docker.sock montados corretamente para evitar os conflitos mais comuns.
  • Gerencie portas com cuidado: use ss -tlnp antes de criar containers, faça bind em 127.0.0.1 para serviços internos e use proxy reverso Nginx para expor serviços com HTTPS.
  • Atualize o Portainer sem perder dados: sempre preserve o volume portainer_data ao recriar o container — ele contém todas as stacks, usuários e configurações de endpoints.

Leia também

Precisa de ajuda com Docker e Portainer no seu servidor?

Configurar Docker com Portainer em produção envolve decisões de segurança, rede e persistência que impactam diretamente a estabilidade das suas aplicações. Um VPS com recursos adequados e suporte técnico especializado faz diferença quando os conflitos aparecem.

Conheça os planos de VPS da AviraHost e hospede seus containers com performance e suporte real

  • 0 Os usuários acharam isso útil
  • Docker, Portainer, containers, Ubuntu, AviraHost
Esta resposta foi útil?

Artigos Relacionados

Otimizar cache Redis para aplicações PHP no Ubuntu 22.04

Para otimizar o cache Redis para aplicações PHP no Ubuntu 22.04, instale e configure o Redis,...

Configurar Alertas Automáticos com Zabbix no Ubuntu

Para configurar alertas automáticos com Zabbix no Ubuntu, instale o Zabbix Server, configure...

Otimizar MySQL: como reduzir uso de memória e acelerar consultas

Otimizar MySQL é o processo de ajustar configurações e consultas para reduzir o consumo de...

Entenda o que é Swap no Linux: como funciona e quando usar

Swap no Linux é um espaço em disco usado como extensão da memória RAM quando esta se esgota. O...

Guia Definitivo: Configurar Nginx como Proxy Reverso

Para configurar o Nginx como proxy reverso, instale o Nginx, crie um arquivo de configuração de...