Como instalar Portainer para gerenciamento Docker com Nginx Proxy Manager no Ubuntu

Este post também está disponível em: English (Inglês)

O Portainer é uma solução de gerenciamento de contêineres de código aberto para Docker, Kubernetes e Nomad que simplifica iniciar, criar e executar contêineres de maneira fácil. Portainer fornece um painel de controle baseado na Web para gerenciar contêineres, imagens, redes e volumes. Inclui ainda uma seleção de templates(apps)

Neste tutorial, vamos instalar e configurar o Portainer em um servidor Linux com Ubuntu 20.04 LTS e usá-la para criar e gerenciar contêineres Docker para executar diferentes aplicativos. Vamos ainda aprender a colocar o portainer atrás do gerenciador de proxy reverso Nginx proxy.

1- Configure o Firewall

Verifique se o Firewall está ativo e habilite se necessário.

ufw status
ufw enable

Abra as portas 80, 443, 9443, 81, 22

ufw allow 80
ufw allow 443
ufw allow 9443
ufw allow 81
ufw allow 22

reload no firewall

ufw reload

2- Instalação do Docker

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
apt update
apt install docker-ce docker-ce-cli containerd.io -y

Habilite o serviço do Docker

systemctl start docker --now

3 – Instale o Docker Compose

curl -L https://github.com/docker/compose/releases/download/v$(curl -Ls https://www.servercow.de/docker-compose/latest.php)/docker-compose-$(uname -s)-$(uname -m) > /usr/local/bin/docker-compose

Aplique permissão executável ao binário

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

3 – Instalação do Portainer

Crie um diretório para o portainer e acesse a seguir

mkdir ~/portainer
cd ~/portainer

Crie o arquivo abaixo para o docker-compose

nano docker-compose.yaml

Cole o código abaixo no arquivo

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.

Inicie o portainer

docker-compose up -d

4 – Acesse e configure Portainer

Abra a URL https://<ipdoseuservidor>:9443

Você verá a seguinte tela abaixo. Crie o usuário admin , senha e clique “Create User”

Você será direcionado a tela abaixo. Clique no menu Home

Em Home você verá “local” no qual o Portainer está sendo executado. Clique em local para começar.

A maioria das seções são autoexplicativas. A Stacks ajuda na criação de contêineres usando arquivos de composição do Docker. Você pode implantar contêineres diretamente usando a Contêineres na barra lateral. Você pode configurar o ambiente do docker atual por meio da Hosts . App Templates vem com arquivos de composição do Docker pré-instalados para instalar os aplicativos mais comuns. Você também pode criar modelos personalizados ou utilizar uma lista de Templates externos como por exemplo Templates App .

A seção Configurações(Settings) permite definir várias configurações, como adicionar registros personalizados do Docker, adicionar vários hosts para o Docker swarm, configurar o acesso do usuário, fazer backup de dados , personalizar o Portainer, Adicionar nova lista de Templates.

5 – Portainer atrás de um proxy reverso utilizando Nginx Proxy Manager

Precisaremos de um subdomínio apontando para o IP do servidor. Ex portainer.dominio.xx .O Nginx Proxy Manager é um aplicativo Docker que fornece uma interface do usuário de gerenciamento da Web para configurar o Nginx como um host de proxy reverso. Ele também pode ser usado como um redirecionamento ou um host de streaming.

Instalar NPM
A primeira etapa é criar uma rede para o Nginx Proxy Manager (NPM). Abra a Networks e clique no botão Add Network para criar uma nova rede. Dê um nome, mantenha os outros campos sem alteração.

Clique em Create the Network

Clique em Stacks e crie uma nova Stack utilizando Add Stack botão com nome nginx-proxy-manager. Em Web Editor cole o código abaixo:

version: "3.3"
services:
  npm-app:
    image: 'jc21/nginx-proxy-manager:latest'
    container_name: npm-app
    restart: unless-stopped
    ports:
      - '80:80' # Public HTTP Port
      - '443:443' # Public HTTPS Port
      - '81:81' # Admin Web Port
      # Add any other Stream port you want to expose
      # - '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"
      # Uncomment the line below if IPv6 is not enabled on your 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

Vamos adicionar 2 variáveis neste Stack, uma para usuário mysql e outra para root mysql. Role a página e clique no botão “Add an environment variable” 2 vezes.
O primeiro campo preencha com DB_MYSQL_PASSWORD e a frente em value , defina uma senha segura.
O segundo campo preencha com MYSQL_ROOT_PASSWORD e a frente em value, defina uma senha segura.

Clique em Deploy the stack para criar e iniciar NPM Container.

Acesse a URL http://<ipdoservidor>:81
Usuário: admin@example.com
Senha: changeme

Após o login altere seu usuário e senha para sua segurança.

No Nginx Proxy Manager

Visite Host >> Proxy Hosts e clique no botão Add Proxy Host .
Neste ponto iremos utilizar o subdomínio apontando para o ip do servidor.

Digite o nome de domínio como portainer.seudominio.com.
Escolha o esquema como https.
Digite o nome do contêiner como o host de encaminhamento e 9443 como a porta de encaminhamento . Habilite as opções Block Common Exploits e Websockets Support.
Alterne para a aba SSL

Em SSL Certificate altere para “Request a new SSL Certificate”.
Habilite Force SSL e HTTP/2 Support. Em e-mail informe seu e-mail .
Para finalizar habilite I Agree to the Let´s Encrypt Terms of Service.
Clique em Save

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

Localize a opção Connected networks e a frente de Join a network selecione npm-network. Clique no botão Join Network

Neste ponto você conseguirá acessar o portainer com https://portainer.seudominio.com

Portainer possui muitos outros recursos que facilitam o trabalho com Docker, Kubernetes , Nomad com bastante documentação . Espero que tenha gostado desta iniciação.