Para uma melhor experiência com caixas de código, experimente ver o site em um Desktop.
No post anterior, instalamos o Docker CE no Oracle Linux 9. Agora vamos instalar o Portainer CE, uma interface web que mostra e gerencia containers, imagens, volumes e redes sem precisar decorar cada comando do Docker. Ele não substitui a linha de comando, mas ajuda muito no dia a dia e para quem ainda está se acostumando com containers.
O que o Portainer oferece:
Visão centralizada: todos os containers, com status, logs, consumo e console, em uma única tela.
Stacks: aplicações com vários containers definidas em um único arquivo no formato do Docker Compose.
Vários ambientes: um mesmo Portainer pode gerenciar outros servidores Docker, Docker Swarm e Kubernetes.
Controle de acesso: usuários e equipes com permissões diferentes (alguns recursos só existem na edição Business).
Vamos usar o modo Docker Standalone: o Portainer roda como um container no mesmo servidor que ele gerencia, e toda a configuração depois da instalação é feita pelo navegador.
Oracle Linux 9 (ou Rocky Linux 9) com o Docker CE instalado e rodando, como no post anterior
Acesso SSH ao servidor com um usuário que tenha sudo
Um computador na mesma rede, com navegador, para acessar a interface
Os comandos usam sudo. Se o seu usuário faz parte do grupo docker, pode omitir o sudo nos comandos do Docker.
Conecte no servidor via SSH e crie o volume onde o Portainer guarda a configuração, os usuários e as definições de stacks:
sudo docker volume create portainer_data
Depois, crie o container do Portainer:
sudo docker run -d -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:lts
O que cada opção faz:
-p 9443:9443: publica a interface web com HTTPS na porta 9443.
--restart=always: o container volta sozinho depois de um reboot ou de uma falha.
-v /var/run/docker.sock: dá ao Portainer acesso ao Docker do servidor. É isso que permite gerenciar os outros containers.
-v portainer_data:/data: guarda os dados do Portainer no volume, então eles sobrevivem a uma atualização ou recriação do container.
portainer-ce:lts: a versão de suporte estendido, recomendada para servidores. A tag latest recebe as versões novas primeiro.
A documentação oficial também publica a porta 8000. Ela só é usada pelo Edge Agent, para gerenciar servidores remotos que não aceitam conexão de entrada. Se não for o seu caso, deixe essa porta fechada.
O acesso ao docker.sock equivale a acesso de root no servidor. Quem entra no Portainer como administrador controla o host inteiro, então use uma senha forte e não exponha a porta 9443 para a internet.
Confira se o container está rodando. A coluna STATUS deve mostrar Up:
sudo docker ps --filter name=portainer
O navegador vai acessar o servidor pela rede, então a porta 9443 precisa estar liberada. No Oracle Linux 9 e no Rocky Linux 9, o firewalld bloqueia a porta por padrão:
sudo firewall-cmd --permanent --add-port=9443/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --list-ports
Se o servidor for Debian com o ufw ativo, o equivalente é:
sudo ufw allow 9443/tcp
Para desfazer, troque --add-port por --remove-port no firewalld (ou use ufw delete allow 9443/tcp) e recarregue.
Para descobrir o IP do servidor:
ip -4 addr show
No navegador do seu computador, acesse:
https://IP-DO-SERVIDOR:9443
O endereço https://localhost:9443 só funciona se o navegador estiver no próprio servidor, o que não é o caso quando você administra por SSH.
O Portainer usa um certificado autoassinado, então o navegador mostra um aviso de conexão não segura. Isso é esperado: clique em Avançado e continue para o endereço. Em produção, o certificado pode ser trocado depois em Settings, na opção SSL certificate.
Na primeira tela, crie o usuário administrador:
Username: o padrão é admin. Troque por um nome próprio, o que dificulta tentativas de acesso.
Password: no mínimo 12 caracteres.
Clique em Create user.
Por segurança, o Portainer só espera 5 minutos pela criação do administrador. Se o prazo passar, a página mostra um aviso de tempo esgotado e não deixa continuar. Reinicie o container e acesse de novo:
sudo docker restart portainer
Depois de criar o usuário, o assistente pergunta qual ambiente gerenciar. Clique em Get Started para usar o ambiente local, que é o próprio Docker do servidor. Ele aparece na tela inicial com o nome local.
Clique em local para abrir o painel. No menu da esquerda ficam as seções que você vai usar no dia a dia:
Containers: iniciar, parar, reiniciar, ver logs, estatísticas e abrir um console dentro do container.
Images: baixar e remover imagens.
Volumes e Networks: criar e remover volumes e redes.
Stacks: criar aplicações com vários containers, como mostrado a seguir.
Um stack é um conjunto de containers definido em um arquivo no formato do Docker Compose. Em vez de criar cada container à mão, você descreve a aplicação inteira e o Portainer cria tudo de uma vez.
No exemplo, um servidor web (Nginx) e um banco (MariaDB) ficam em uma rede interna. Só o Nginx publica uma porta. O banco fica acessível apenas para os containers do stack, pelo nome db, e não aparece na rede do servidor.
Em Stacks, clique em Add stack, dê o nome app e cole no Web editor:
# Portainer: Stacks > Add stack > Web editor
services:
db:
image: mariadb:11
restart: unless-stopped
environment:
MARIADB_ROOT_PASSWORD: troque-esta-senha-root
MARIADB_DATABASE: app_db
MARIADB_USER: app
MARIADB_PASSWORD: troque-esta-senha
volumes:
- db_data:/var/lib/mysql
networks:
- interna
web:
image: nginx:stable
restart: unless-stopped
ports:
- "8080:80"
networks:
- interna
networks:
interna:
volumes:
db_data:
Clique em Deploy the stack. Em alguns segundos os dois containers aparecem em Containers, com o prefixo app.
Para acessar o Nginx pela rede, libere também a porta 8080 no firewall, como na seção anterior, e abra http://IP-DO-SERVIDOR:8080.
As senhas no exemplo ficam visíveis no arquivo do stack. Em um ambiente real, use a seção Environment variables, logo abaixo do editor, e referencie as variáveis no arquivo.
Para remover o stack, abra-o em Stacks e clique em Delete this stack. O volume db_data continua existindo, com os dados do banco, até ser removido em Volumes.
Remover o container não afeta os outros containers do servidor:
sudo docker rm -f portainer
Com o volume portainer_data mantido, basta rodar de novo o docker run da instalação para voltar com os mesmos usuários e configurações. Para apagar tudo de vez, remova também o volume e feche a porta no firewall:
sudo docker volume rm portainer_data
sudo firewall-cmd --permanent --remove-port=9443/tcp
sudo firewall-cmd --reload
Container portainer com STATUS Up e --restart=always
Porta 9443 liberada só para a rede interna, nunca para a internet
Usuário administrador com nome próprio e senha de 12 caracteres ou mais
Porta 8000 publicada apenas se o Edge Agent for usado
Senhas de stacks em variáveis de ambiente, não no arquivo
Com o Portainer, o Docker do servidor passa a ter uma interface web para o dia a dia: containers, logs, volumes, redes e stacks em poucos cliques. A linha de comando continua sendo a base, e tudo o que você faz pelo Portainer também pode ser feito com os comandos do post anterior.
No próximo post, vamos usar esse ambiente para subir um servidor do RustDesk, uma alternativa open source para acesso remoto.
Esta série tem quatro posts. Siga na ordem para ir da instalação do Docker até aplicações rodando em containers.
Gerencie Docker containers com Portainer CE (você está aqui)