Introdução
Durante o desenvolvimento de um projeto utilizando DevContainer, surgiu a necessidade de acessar o banco de dados PostgreSQL que estava rodando dentro do contêiner, diretamente do meu sistema local (host). Foi nesse contexto que descobri o uso da propriedade "forwardPorts"
no arquivo devcontainer.json
, que permite tornar portas específicas acessíveis fora do contêiner de forma simples e eficaz.
- Primeiro passo
A configuração é bem simples: basta adicionar a propriedade "forwardPorts"
ao arquivo devcontainer.json
# .devcontainer/devcontainer.json
{
"name": "Ruby on Rails & Postgres",
"dockerComposeFile": "docker-compose.yml",
"service": "app",
"workspaceFolder": "https://dev.to/workspaces/task_control/rails_app",
"forwardPorts": [
5435
]
}
Neste exemplo, utilizei a porta 5435
em vez da 5432
, pois a porta 5432
já está sendo usada pelo PostgreSQL instalado na minha máquina. Essa mudança evita conflitos entre os serviços locais e o banco de dados que está rodando dentro do container.
- Segundo passo
Mapeando as portas com Docker Compose
Agora precisamos mapear a porta 5432
(porta padrão do PostgreSQL dentro do contêiner) para a porta 5435
no host. Para isso, vamos configurar o arquivo docker-compose.yml
da seguinte forma:
db:
image: postgres:latest
restart: unless-stopped
volumes:
- postgres-data:/var/lib/postgresql/data
- ./create-db-user.sql:/docker-entrypoint-initdb.d/create-db-
user.sql
environment:
POSTGRES_USER: postgres
POSTGRES_DB: postgres
POSTGRES_PASSWORD: postgres
ports:
- 5435:5432
Com essa configuração, sempre que você acessar 127.0.0.1:5435
no seu host, estará se comunicando com o PostgreSQL rodando na porta 5432
dentro do container. Isso garante que não haja conflito com o PostgreSQL local (caso você já tenha um instalado e ativo na porta padrão 5432).
- Terceiro passo
Depois de ajustar as configurações no devcontainer.json
e no docker-compose.yml
, basta reabrir o DevContainer e fazer o build novamente para aplicar as alterações.
- Quarto passo
Acessando o banco de dados com o DBeaver
Para se conectar ao banco de dados utilizando o DBeaver, siga o passos abaixo:
- Abra o DBeaver
- No meu superior, vá em Database -> New Database Connection
- Selecione a opção PostgreSQL e clicar em Next.
Agora, basta preencher os campos de conexão com as informações configuradas no contêiner:
-
Host:
127.0.0.1
-
Port:
5435
(a porta mapeada nodocker-compose.yml
) -
Database:
postgres
-
Username:
postgres
-
Password:
******
Agora é só testar a conexão. Se tudo estiver configurado corretamente, uma caixa de diálogo será exibida confirmando que a conexão foi estabelecida com sucesso.
Após isso, você poderá visualizar as tabelas do banco de dados diretamente no DBeaver, facilitando a navegação, consultas e até alterações na estrutura dos dados.
Conclusão
Utilizar o forwardPorts
em conjunto com o mapeamento de portas no docker-compose.yml
é uma solução simples e eficaz para expor serviços do DevContainer ao seu ambiente local. Essa abordagem facilita o desenvolvimento, permitindo o uso de ferramentas externas, testes e conexões diretas com o banco de dados sem complicações.