Docker Management · 13 min read · Sep 22, 2025

Como Instalar e Usar o Portainer para Gerenciamento de Docker com Nginx Proxy Manager

Portainer é uma solução de gerenciamento de contêineres de código aberto para Docker, Kubernetes e Nomad que simplifica o início, a criação e a execução de contêineres de maneira fácil. Ele fornece um painel baseado na web para gerenciar contêineres, imagens, redes e volumes.

Neste tutorial, você aprenderá a instalar e configurar a solução de gerenciamento de contêineres Portainer em um servidor Linux e usá-la para criar e gerenciar contêineres Docker para executar diferentes aplicativos. Você também aprenderá a colocar esses contêineres atrás do Nginx usando o gerenciador de proxy Nginx.

Pré-requisitos

  • Um servidor Linux executando Ubuntu / Debian / Cent OS / Rocky Linux 8 / Alma Linux.
  • Um usuário não-root com privilégios sudo.
  • Um Nome de Domínio Totalmente Qualificado (FQDN) apontando para o servidor para Portainer ( portrainer.example.com) e Nginx Proxy Manager ( npm.example.com).

Passo 1 - Configurar o Firewall

Cent OS/Rocky Linux/Alma Linux

Você deve ter o firewall Firewalld instalado. Verifique o status do firewall.

$ sudo firewall-cmd --state
running

Abra as portas 80, 9443 e 443. O Portainer usa a porta 9443 para expor sua interface web via HTTPS. O Nginx Proxy Manager usa a porta 81 para sua interface.

$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=https
$ sudo firewall-cmd --permanent --add-port=9443/tcp
$ sudo firewall-cmd --permanent --add-port=81/tcp

Recarregue o firewall para habilitar as alterações.

$ sudo firewall-cmd --reload

Ubuntu/Debian

Os sistemas Ubuntu e Debian usam ufw (Uncomplicated Firewall) por padrão.

Verifique se o firewall está em execução.

$ sudo ufw status

Se estiver em execução, abra as portas 80, 9443 e 443.

$ sudo ufw allow 80
$ sudo ufw allow 443
$ sudo ufw allow 9443
$ sudo ufw allow 81

Abra a porta SSH se o firewall não estiver em execução.

$ sudo ufw allow "OpenSSH"

Habilite o firewall se ele não estiver em execução.

$ sudo ufw enable

Se estiver em execução, recarregue-o para aplicar as alterações.

$ sudo ufw reload

Passo 2 - Instalar o Docker

Cent OS/Rocky Linux/Alma Linux

Execute o seguinte comando para instalar o Docker.

$ sudo yum install -y yum-utils
$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
$ sudo yum install docker-ce docker-ce-cli containerd.io

Ubuntu

$ sudo apt install ca-certificates curl gnupg lsb-release
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt update
$ sudo apt install docker-ce docker-ce-cli containerd.io

Debian

$ sudo apt install ca-certificates curl gnupg lsb-release
$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt update
$ sudo apt install docker-ce docker-ce-cli containerd.io

Habilite e inicie o serviço Docker.

$ sudo systemctl start docker --now

Adicione seu nome de usuário ao grupo Docker.

$ sudo usermod -aG docker $USER

Saia do sistema e faça login novamente para aplicar a alteração.

Passo 3 - Instalar o Docker Compose

Baixe e instale o binário do Docker Compose.

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

Aplique permissão executável ao binário.

$ sudo chmod +x /usr/local/bin/docker-compose

Passo 4 - Instalar o Portainer

Crie um diretório para o Portainer.

$ mkdir ~/portainer

Mude para o diretório.

$ cd ~/portainer

Crie e abra o arquivo Docker Compose para edição.

$ nano docker-compose.yaml

Cole o seguinte código nele.

version: "3.3"
services:
    portainer:
      image: portainer/portainer-ce:latest
      container_name: portainer
      restart: always
      privileged: true
      volumes:
        - ./data:/data:Z
        - /var/run/docker.sock:/var/run/docker.sock:Z
      ports:
        - 9443:9443

Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.

Vamos analisar o arquivo Docker Compose.

  • Estamos puxando a versão mais recente da Edição Comunitária do Portainer do Docker Hub. A Edição Comunitária do Portainer é gratuita para uso, enquanto a edição Empresarial requer uma licença paga. Você pode puxar a Edição Empresarial, mas será solicitado a chave de licença para usá-la.
  • Nomeamos nosso contêiner como portainer para fins de identificação e vinculação.
  • A política de reinício está definida como always para que o contêiner permaneça ativo durante a inicialização.
  • A configuração privileged: true é para que o Portainer possa acessar o socket do Docker e executar em um contexto privilegiado, uma vez que estamos usando o SELinux. Se você não estiver usando o SELinux, pode remover essa configuração. Essa configuração dá ao contêiner do Portainer acesso a tudo no sistema host, incluindo acesso ao hardware. Portanto, habilite essa configuração apenas quando souber o que está fazendo.
  • A seção volumes mapeia a pasta no host para as pastas no contêiner usando montagens de Bind. Expondo o diretório ~/portainer/data ao contêiner para armazenar quaisquer dados relevantes e a API do socket do Docker para gerenciamento de contêineres. O rótulo :Z informa ao Docker que estamos executando o SELinux em nosso host. Se você não tiver o SELinux habilitado, deve remover o rótulo.

Inicie o Portainer.

$ docker-compose up -d

Verifique o status do contêiner.

$ docker ps
CONTAINER ID   IMAGE                           COMMAND        CREATED         STATUS         PORTS                                                           NAMES
916411e8d12e   portainer/portainer-ce:latest   "/portainer"   5 seconds ago   Up 4 seconds   8000/tcp, 9000/tcp, 0.0.0.0:9443->9443/tcp, :::9443->9443/tcp   portainer

Passo 5 - Acessar e Configurar o Portainer

Abra a URL https://:9443 em seu navegador, e você verá a seguinte tela.

Tela de Instalação do Portainer

Você será solicitado a criar um novo usuário administrador. Adicione os detalhes do seu usuário. Desmarque a caixa Permitir coleta de estatísticas anônimas se você se preocupa com a privacidade. Clique no botão Criar usuário para iniciar a instalação e criar uma nova conta de administrador.

Em seguida, você será levado à seguinte tela do painel.

Painel do Portainer

Após alguns segundos, ele será atualizado automaticamente e mostrará a seguinte tela.

Página Inicial do Portainer

Ele mostrará o ambiente local no qual o Portainer está sendo executado. Clique no ambiente local para começar.

Página Inicial do Ambiente do Portainer

A maioria das seções é autoexplicativa. A seção Stacks ajuda na criação de contêineres usando arquivos Docker Compose. Você pode implantar contêineres diretamente usando a categoria Containers na barra lateral. Você pode configurar o ambiente Docker atual através da seção Hosts. A seção App Templates vem com arquivos Docker Compose pré-instalados para instalar os aplicativos mais comuns. Você também pode criar modelos personalizados.

A seção Settings permite que você configure várias configurações, como adicionar registros Docker personalizados, adicionar vários hosts para Docker swarm, configurar o acesso do usuário, fazer backup de dados e personalizar o Portainer.

Passo 5 - Colocar o Portainer atrás de um proxy reverso usando o Nginx Proxy Manager (NPM)

Antes de prosseguir, vamos colocar o Portainer atrás de um proxy reverso usando o Nginx Proxy Manager. O Nginx Proxy Manager é um aplicativo Docker que fornece uma interface de gerenciamento web para configurar o Nginx como um host de proxy reverso. Ele também pode ser usado como um host de redirecionamento ou streaming.

Instalar o NPM

O primeiro passo é criar uma rede para o Nginx Proxy Manager (NPM). Abra a seção Networks e clique no botão Add Network para criar uma nova rede.

Lista de Redes do Portainer

Dê um nome à rede e deixe todas as configurações inalteradas. Clique no botão Create the network para finalizar.

Página de Criação de Rede do Portainer

Visite a seção Stacks e crie uma nova pilha usando o botão Add stack.

Página de Stacks do Portainer

Nomeie a pilha como nginx-proxy-manager e cole o seguinte código nela.

version: "3.3"
services:
  npm-app:
    image: 'jc21/nginx-proxy-manager:latest'
    container_name: npm-app
    restart: unless-stopped
    ports:
      - '80:80' # Porta HTTP Pública
      - '443:443' # Porta HTTPS Pública
      - '81:81' # Porta Web Admin
      # Adicione qualquer outra porta de Stream que você deseja expor
      # - '21:21' # FTP
    environment:
      DB_MYSQL_HOST: "npm-db"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: ${DB_MYSQL_PASSWORD}
      DB_MYSQL_NAME: "npm"
      # Descomente a linha abaixo se o IPv6 não estiver habilitado em seu host
      # DISABLE_IPV6: 'true'
    volumes:
      - ./npm-data:/data:Z
      - ./letsencrypt:/etc/letsencrypt:Z
    depends_on:
      - npm-db
    networks:
      - npm-network
      - npm-internal

  npm-db:
    image: 'mariadb:latest'
    container_name: npm-db
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: 'npm'
      MYSQL_USER: 'npm'
      MYSQL_PASSWORD: ${DB_MYSQL_PASSWORD}
    volumes:
      - ./npm-data/mysql:/var/lib/mysql:Z
    networks:
      - npm-internal

networks:
  npm-internal:
  npm-network:
    external: true

Página de Adição de Stack do Portainer

Definimos duas variáveis de ambiente para definir as senhas do banco de dados e do root MySQL. O Portainer pode ser usado para definir segredos usando variáveis de ambiente. Role para baixo na página e clique no botão Add environment variable para adicionar senhas fortes.

Variáveis de Ambiente da Stack do Portainer

Clique no botão Deploy the stack para criar e iniciar o contêiner NPM.

Acessar o NPM

Abra a URL https://:81 em seu navegador, e você verá a seguinte tela. Insira as seguintes credenciais padrão para fazer login.

Endereço de e-mail: [email protected] Senha: changeme

Em seguida, você será solicitado a definir um nome e um endereço de e-mail. Clique no botão Save, e você será solicitado a criar uma nova senha. Clique no botão Save novamente para começar.

Painel do Nginx Proxy Manager

Visite Hosts >> Proxy Hosts e clique no botão Add Proxy Host.

Adicionar Portainer como Proxy Host

Insira o nome do domínio como portainer.example.com. Escolha o esquema como https. Insira o nome do contêiner como Forward Hostname e 9443 como Forward port. Marque as opções Block Common Exploits e Websockets Support.

Opções SSL do Portainer NPM

Mude para a aba SSL e selecione Request a new SSL Certificate no menu suspenso. Marque as opções Force SSL e HTTP/2 Support para proteger e otimizar sua conexão SSL. Insira o endereço de e-mail para receber notificações de renovação e concorde com os termos de serviço. Clique no botão Save para finalizar a configuração do Proxy Host para o Portainer.

Conectar o Portainer ao Contêiner NPM

Configuramos o Proxy host, mas o contêiner ainda não está conectado à rede NPM. Volte ao painel do Portainer, visite a seção Containers e selecione o contêiner portainer.

Selecione npm-network no menu suspenso na seção Connected networks e clique no botão Join network para adicionar o contêiner Portainer à rede do gerenciador de proxy.

Redes Conectadas do Portainer

Você pode receber um erro, mas atualize a página e você deve ver o contêiner adicionado à rede NPM.

Portainer Conectado ao NPM

Você deve ser capaz de acessar o Portainer usando a URL https://portainer.example.com em seu navegador.

Você pode seguir um procedimento semelhante para colocar o NPM atrás de uma URL publicamente acessível como https://npm.example.com, conforme discutido em nosso tutorial do Nginx Proxy Manager.

Agora que você configurou uma URL pública para o Portainer, pode remover a porta 9443 exposta. Para fazer isso, volte ao Terminal e mude para o diretório do portainer.

$ cd ~/portainer

Abra o arquivo Docker Compose para edição.

$ nano docker-compose.yaml

Remova a seção de portas comentando-a, conforme mostrado abaixo.

version: "3.3"
services:
    portainer:
      image: portainer/portainer-ce:latest
      container_name: portainer
      restart: always
      privileged: true
      volumes:
        - ./data:/data:Z
        - /var/run/docker.sock:/var/run/docker.sock:Z
      #ports:
      #  - 9443:9443
      networks:
        - npm-network

networks:
  npm-network:
    external: true

Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.

Aqui, adicionamos os detalhes da rede NPM porque precisaremos reiniciar o contêiner Portainer.

Pare o contêiner Portainer.

$ docker-compose down --remove-orphans

Inicie o contêiner novamente com a configuração atualizada.

$ docker-compose up -d

Passo 6 - Implantar um contêiner usando o Modelo de Aplicativo

O Portainer fornece vários modelos pré-definidos para lançar aplicativos diretamente com configuração mínima.

Modelos de Aplicativo do Portainer

Visite a seção App Templates e selecione qualquer modelo. Dê um nome a ele e selecione a rede para uso. Use a seção de opções avançadas para implantar portas, redes e montagens de volume personalizadas.

Clique no botão Deploy the container para finalizar a implantação do seu aplicativo. Aqui estamos implantando o contêiner Redis.

Implantação do Aplicativo Redis do Portainer

Passo 7 - Gerenciar Contêineres

Vamos gerenciar um contêiner existente. Abra a página de contêineres e você verá todos os contêineres em execução.

Lista de Contêineres do Portainer

Clique no contêiner hw-redis recém-criado para prosseguir.

Ações do Contêiner do Portainer

Na parte superior, você pode ver uma lista de ações que pode realizar em um contêiner em execução. Você pode parar e matar o contêiner. Recriar criará o contêiner do zero. A opção Duplicate/Edit permitirá que você crie outro contêiner idêntico, permitindo que você altere as configurações antes de lançá-lo.

O status do contêiner mostra o tempo de execução, endereço IP e outros detalhes sobre o contêiner.

A opção Logs mostra a saída do comando docker logs. Como a saída do comando não é armazenada em cache, toda vez que você atualiza a página, o comando é executado do zero.

Logs do Contêiner do Portainer

A opção Inspect executa o comando docker inspect no contêiner e mostra sua saída.

Inspecionar Contêiner do Portainer

A opção Stats mostra o uso do contêiner em tempo real.

Estatísticas do Contêiner do Portainer

Você pode iniciar o console do Contêiner usando a opção Console. Você será solicitado a fornecer o comando e o usuário do sistema para executar.

Configuração do Console do Contêiner do Portainer

Pressione o botão Connect para iniciar o console.

Shell do Console do Contêiner do Portainer

A opção Attach executa o comando docker attach.

Existem outras opções na página de detalhes do Contêiner. Você pode criar uma imagem usando um contêiner existente. Outras opções incluem alterar a política de reinício de um contêiner e conectar ou desconectar uma rede a um contêiner existente.

Anexar um contêiner externo ao Portainer

Criar qualquer contêiner fora do Portainer aparecerá dentro dele, desde que seja criado no mesmo sistema em que o Portainer está sendo executado. Isso é possível porque o Portainer está conectado ao Docker usando o websocket.

Vamos testar executando o contêiner Hello World do Docker.

$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:10d7d58d5ebd2a652f4d93fdd86da8f265f5318c6a73cc5b6a9798ff6d2b2e67
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

Verifique a lista de contêineres no terminal. Estamos usando a flag -a para mostrar a lista de todos os contêineres, incluindo os parados. Você pode ver o nome do contêiner como sad_williamson.

$ docker ps -a
CONTAINER ID   IMAGE                             COMMAND                  CREATED         STATUS                     PORTS                                                                                  NAMES
5fa46b85d594   hello-world                       "/hello"                 3 minutes ago   Exited (0) 3 minutes ago                                                                                          sad_williamson
.....

Agora, verifique a página de Contêineres do Portainer, e o contêiner hello world aparecerá como parado na lista com o mesmo nome.

Contêiner Hello World do Portainer

Conclusão

Isso conclui nosso tutorial sobre como instalar e usar o Portainer para gerenciamento de Docker e Nginx Proxy Manager. Vamos explorar a construção de imagens Docker, criação de contêineres personalizados e uso do Portainer com Docker swarm em um próximo tutorial. Se você tiver alguma dúvida, poste nos comentários abaixo.

Share: X/Twitter LinkedIn

Receba novas postagens na sua caixa de entrada

Sem spam. Cancele a assinatura a qualquer momento.