Usando PostgreSQL e pgAdmin com Docker

Hermando Thiago
7 min readDec 17, 2022

--

Geralmente, quando estamos desenvolvendo uma nova aplicação, ou precisamos rodar a aplicação de outra pessoa na nossa máquina, precisamos configurar todo o ambiente para aplicação, configurar as dependências, criar e configurar o banco de dados localmente e etc. Fazer isso uma vez é tranquilo, mas quando vamos trabalhar com diversas aplicações e com diversos bancos de dados, isso se torna uma tarefa bem mais complicada e desgastante. E nem comentei sobre os casos em que precisamos configurar o banco de dados em mais de uma máquina.

Para resolver esses e outros dilemas, foi desenvolvido o docker, uma ferramenta de conteinerização que se tornou essencial no dia a dia dos desenvolvedores, permitindo criar imagens de diversas tecnologias, fazendo com que não precisemos instalar nada diretamente na nossa máquina e nos livrando dos problemas de configuração e compatibilidade.

Neste artigo vou mostrar como executar o PostgreSQL e o pgAdmin através de conteiners, usando o docker e o docker-compose.

Primeiramente precisamos ter instalado na nossa máquina o docker e o docker-compose. Para instalar o docker no windows e no Mac, é necessário apenas baixar o software Docker Desktop. No linux a série de comando é um pouco extensa, então vou deixar aqui um link de um artigo da Digital Ocean com todo o passo a passo da instalação em distros baseadas em Ubuntu:

Docker instalado, vamos partir para o postgres.

Docker

As imagens do postgres e do pgadmin estão disponíveis no docker hub, para puxa-las para a nossa máquina vamos executar os seguintes comando:

docker pull postgres
docker pull dpage/pgadmin4

Comando executado, as imagens ja devem estar disponíveis na nossa máquina, para conferir as imagens, execute o comando docker images, o resultado deve ser parecido com esse:

Criando container do postgres:

Para criar o container do nosso banco de dados, vamos executar o seguinte comando no terminal:

docker run --name postgres_medium -e POSTGRES_PASSWORD=docker -e POSTGRES_DB=teste -p 5432:5432 -d postgres

Agora vou explicar parte por parte do comando:

  • o docker run serve para criar o container.
  • O parâmetro — name especifica o nome do container que vai ser gerado (no nosso caso postgres_medium).
  • O parâmetro -e é usado para definir variáveis de ambiente do postgres, o POSTGRES_PASSWORD define a senha do postgres e POSTGRES_DB define o nome do banco de dados que vai ser criado.
  • -p define a porta em que o nosso banco estará disponível, 5432:5432, a primeira porta é a que estará disponível na nossa máquina, a segunda é a porta que rodará dentro do nosso container (A primeira porta pode ser alterada, mas a segunda como é a porta padrão do postgres, deve ser 5432 como padrão).
  • O -d determina que o container será executado como tarefa em background (não ocupando o terminal).
  • Por último o postgres indica qual imagem será usada para criar o container.

Com o comando docker ps, conseguimos ver que o container foi criado e ja está em execução:

Criando container do pdAdmin4:

Agoras iremos criar o container do pgAdmin, o sistema web para gerenciarmos nosso banco de dados postgres, execute os seguintes comandos:

docker run --name pgdmin_medium -e PGADMIN_DEFAULT_EMAIL=admin@docker.com -e PGADMIN_DEFAULT_PASSWORD=docker -p 8000:80 -d dpage/pgadmin4

O comando segue a mesma lógica de quando criamos o container do Postgres, então aqui irei explicar somente as variáveis de ambiente:

  • PGADMIN_DEFAULT_EMAIL: definimos o email que usaremos para acessar o painel de controle do pgadmin.
  • PGADMIN_DEFAULT_PASSWORD: definimos a senha a ser usada paara acessar o painel de controle.

Se tudo tiver corrido bem, conseguiremos ver os dois containers rodando usando o comando docker ps:

Agora vamos conectar o pgAdmin com o nosso container do postgres.

Acesse o localhost:8000, e insira o email e a senha que foram usados na criação do container do pgAdmin:

Feito o login, teremos esta tela:

Clique em Add New Server, insira qual será o nome da conexão e caso queira, uma descrição do server:

Na aba Connection, vamos inserir as informações para nos conectarmos com o nosso container.

Em Host name/address, precisamos colocar o ip do nosso container, para descobrirmos isso, executamos o comando docker ps, pegamos o CONTAINER ID do nosso container postgres, e depois executamos o seguinte comando: docker inspect <CONTAINER ID>| grep IP.

Copiamos o id que aparecer em IPAddress e colamos no Host name/address.

As outras informações seram assim:

  • Port: a porta que colocamos na criação do container (no nosso caso, 5432).
  • Maintenance database: o nome do nosso banco de dados (teste).
  • Username: postgres.
  • Password: senha na criação do container.

Pronto, agora temos os containers do postgres e do pgAdmin rodando na nossa máquina, podendo usar no desenvolvimento das nossas aplicações sem precisarmos nos preocupar em instalar os softwares na nossa máquina.

Mas ainda não estamos extraindo todas as vantagens de usar o docker no desenvolvimento das nossas aplicações, o processo de executar os containers de forma individual não é muito ágil, conseguirmos agilizar bastante se usarmos um arquivo do docker-compose, subindo os containers com apenas um comando com todas as configurações necessárias. E é isso que aprenderemos agora.

Subindo containers com o docker-compose

Para quem ainda não esta familiarizado, docker compose é um orquestrador de containers, e o que isso significa? Com docker compose conseguimos criar um arquivo de configuração para gerenciar todos os recursos dos nossos containers, como variáveis de ambiente, imagens, as portas, locais de armazenamento dos dados e todo o ciclo de vida da aplicação, subindo todos os containers com um único comando, agilizando bastante o dia a dia do desenvolvedor.

Para usarmos esses recursos, criamos um arquivo chamado docker-compose.yaml, é nesse arquivos que vamos configurar todos os serviços e containers que vamos executar.

E é assim que irá ficar o nosso arquivo docker-compose com a configuração do pgadmin e do postgres:

Agora vou explicar o que cada comando significa.

Na primeira linha temos o version, que nada mais é do que a versão do docker-compose que estamos usando.

  • services: é onde serão criados os nossos serviços.
  • image: é a imagem que usaremos para subir o serviço (no nosso caso, postgres e pgadmin).
  • container_name: o nome do container que irá ser criado.
  • tty: esse parâmetro é para conseguirmos ter acesso ao terminal do container.
  • ports: aqui iremos declarar a porta em em que nosso serviço estará disponível, a primeira porta é a externa, a segunda porta é a padrão da imagem (a porta padrão do postgres é a 5432 e do pgadmin é a 80).
  • volumes: aqui definimos a pasta onde ficaram armazenados os dados do nosso postgres, caso a pasta do dbdata não exista, a pasta será criada para armazenar nossos dados.
  • environment: é onde estarão declaradas as variáveis de ambiente que serão usadas pelo container.
  • depends_on: aqui estamos dizendo que esse serviço depende de outro para ser executado, no caso, o serviço do pgadmin só é executado depois que o serviço do postgres for executado.

Arquivo docker-compose criado e explicado o que cada linha do arquivo faz, agora só precisamos executar o comando docker-compose up para subir todos os serviços de uma vez.

Se tudo correu bem, o seu terminal ficará mais ou menos assim:

Agora basta acessar o localhost:8000, e logar no pgadmin com as informações passadas no arquivo do docker-compose. A configuração seguirá os mesmos passos de quando executamos os container separados, a unica diferença será que iremos colocar o nome do serviço do nosso banco no campo de host do pgadmin, ficando assim:

E pronto, temos configurado o nosso pgdmin para gerenciarmos todos os recurso do banco de dados postgres, sem precisar instalar nehum dos dois serviços na nossa máquina, rodando tudo através de containers e subindo com um único comando do docker-compose, podendo usar esse banco de dados no desenvolvimento das nossas aplicações.

Espero que tenham gostado do post e que tudo que foi passado aqui ajude vocês no dia a dia de desenvolvimento, muito obrigado por terem lido e até o próximo post.

Minhas redes sociais:

linkedin: https://www.linkedin.com/in/hermando-thiago/

github: https://github.com/HermandoThiago

email: hermandodev@gmail.com

--

--