7 mins

Como executar o PostgreSQL no Docker com Docker Compose e persistência de dados

Neste artigo, vamos explorar como usar o Docker Compose para configurar um ambiente completo do PostgreSQL com persistência de dados em poucos passos. Este guia é destinado a pessoas que já possuem alguma experiência com o Docker e o PostgreSQL.

1. Introdução

O Docker Compose é uma ferramenta que nos permite definir e executar aplicativos Docker multi-container com facilidade. Com ele, podemos criar, executar e gerenciar aplicativos Docker de maneira fácil e eficiente. O PostgreSQL, por sua vez, é um dos bancos de dados relacionais mais populares do mundo. Ele oferece confiabilidade, escalabilidade e segurança, além de uma ampla variedade de recursos para gerenciamento de dados.

2. Instalação do Docker e Docker Compose

Antes de iniciar a configuração do PostgreSQL, é necessário ter o Docker e o Docker Compose instalados na máquina host. Ambos são necessários para criar e gerenciar o container PostgreSQL que armazenará os dados. Verifique a documentação do Docker e do Docker Compose para obter instruções de instalação específicas para o seu sistema operacional.

Se estiver utilizando o Ubuntu 22.04 voce pode seguir as instruções neste outro post, onde eu explico detalhadamente como realizar a instalação do Docker e Docker Compose.

3. Configuração do arquivo docker-compose.yml

O arquivo docker-compose.yml é o arquivo de configuração principal do Docker Compose. Ele define todos os serviços que serão executados e suas configurações. Para configurar o serviço PostgreSQL, abra um editor de texto e crie um arquivo chamado docker-compose.yml. Em seguida, adicione o seguinte código:

version: '3.9'
services:
  postgresql:
    container_name: postgresql-dev
    image: postgres:15-alpine
    restart: always
    user: postgres
    volumes:
      - pgdata:/var/lib/postgresql/data
    command:
      - 'postgres'
      # persist logs inside /var/lib/postgresql/data/log
      # - '-c'
      # - 'logging_collector=on'
      # log all statement execution
      - '-c'
      - 'log_statement=all'
    environment:
      - LC_ALL=C.UTF-8
      - POSTGRES_USER=$POSTGRES_USER
      - POSTGRES_PASSWORD=$POSTGRES_PASSWORD
      - POSTGRES_DB=$POSTGRES_DB
    logging:
      options:
        max-size: 10m
        max-file: '3'
    ports:
      - '15432:5432'
    networks:
      - postgres-dev
  pgadmin:
    container_name: pgadmin-dev
    image: dpage/pgadmin4
    restart: unless-stopped
    volumes:
      - pgadmin:/var/lib/pgadmin
    environment:
      PGADMIN_DEFAULT_EMAIL: $PGADMIN_DEFAULT_EMAIL
      PGADMIN_DEFAULT_PASSWORD: $PGADMIN_DEFAULT_PASSWORD
      PGADMIN_CONFIG_SERVER_MODE: 'False'
    ports:
      - 5050:80
    networks:
      - postgres-dev
volumes:
  pgdata:
    driver: local
    driver_opts:
      o: bind
      type: none
      device: /home/dukefs/docker-volumes/postgresql/dev/data
  pgadmin:
    driver: local
    driver_opts:
      o: bind
      type: none
      device: /home/dukefs/docker-volumes/pgadmin/dev
networks:
  postgres-dev:
    driver: bridge

Neste arquivo, definimos um serviço chamado postgresql que utiliza a imagem oficial do PostgreSQL. O serviço é reiniciado sempre que o Docker é iniciado e configurado com um usuário, senha e banco de dados personalizados. Por fim, definimos um volume para persistir os dados do PostgreSQL na pasta /var/lib/postgresql/data mapeado fisicamente para a máquina host definido pelo volume pgdata.

Perceba que criamos um segundo serviço chamado pgadmin, que é um serviço de gerenciamento de dados para o PostgreSQL. Este serviço que iremos utilizar para testar a conexão com o PostgreSQL mais à frente.

4. Criação dos serviços PostgreSQL e PgAdmin com Docker Compose

Agora que o arquivo docker-compose.yml está configurado, podemos criar os serviços com o seguinte comando:

$ docker compose up -d

Este comando irá baixar as imagens necessárias, criar um container para cada serviço com base na imagem e iniciar os serviços.

5. Configuração de variáveis de ambiente para o serviço PostgreSQL

É importante definir variáveis de ambiente para configurar os serviços que possam utilizar de dados sensíveis como as senhas do PostgreSQL e do PgAdmin. Para fazer isso, vamos criar uma pasta chamada config ao lado do nosso arquivo docker-compose.yml.

$ mkdir config

Agora dentro da pasta configvamos criar o arquivo .env.dev com as variáveis de ambiente. Abra o arquivo .env.dev e adicione as seguintes variáveis:

POSTGRES_USER=dukescode
POSTGRES_PASSWORD=1234567890
POSTGRES_DB=dukescode
PGADMIN_DEFAULT_EMAIL=admin@dukescode.com
PGADMIN_DEFAULT_PASSWORD=dukescode

DICA: Lembre-se de sempre utilizar senhas fortes mesmo para ambientes de desenvolvimento.

Agora para utilizamos as variáveis de ambiente definidas durante a criaçãos dos serviços basta executar o seguinte comando:

$ docker compose --env-file ./config/.env.dev up -d

6. Persistência de dados usando volumes Docker

Para garantir a persistência dos dados do PostgreSQL, definimos o volume pgdata no arquivo docker-compose.yml. Este volume esta criando um mapeamento entre a pasta /var/lib/postgresql/data do container com a pasta /home/dukefs/docker-volumes/postgresql/dev/data do host.

Dessa forma, todos os dados do PostgreSQL são salvos na máquina host onde podemos definir nossa política de backup, esse mapeamento também garante que os dados serão mantidos mesmo que o container seja reiniciado ou removido.

7. Exposição do serviço PostgreSQL para outras aplicações

Por padrão, o serviço PostgreSQL é executado na porta 5432. Para acessar o banco de dados a partir de outras aplicações, é necessário expor essa porta. Fizemos isso ao adicionar a seguinte linha ao arquivo docker-compose.yml:

  .
  .
  .
  ports:
    - '15432:5432'
  .
  .
  .

Esta linha expõe a porta 5432 do container PostgreSQL para a porta 15432 da máquina host.

8. Teste da configuração do PostgreSQL com Docker Compose

Para testar se o serviço PostgreSQL está funcionando corretamente, abra o navegador e acesse a url do PgAdmin em http://localhost:5050.

Você verá a tela a seguir.

pgadmin-home

imagem 1 - home do pgadmin

Agora vamos selecionar Add New Server e preencher o Name da connection na aba General.

pgadmin-connection-name

imagem 2 - nome da conexão

Em seguida vamos selecionar a aba Connection e preencher as informações de conexão conforme informado no arquivo .env.dev e clicar em Save.

pgadmin-connection-details

imagem 3 - detalhes da conexão

Ao preencher todas as informações corretamente, você tera acesso aos dados de estatísticas do servidor PostgreSQL conforme a seguir.

pgadmin-server-statistics

imagem 4 - estatísticas do servidor postgresql

Conclusão e possíveis próximos passos

Neste artigo, aprendemos como configurar o PostgreSQL com persistência de dados usando Docker Compose. Com a configuração correta do arquivo docker-compose.yml, podemos criar um ambiente PostgreSQL completo com persistência de dados em questão de minutos. A partir daqui, é possível explorar recursos adicionais do PostgreSQL, como backups, replicação, segurança avançada, entre outros.

Para finalizar, é importante ressaltar que a configuração de um ambiente de produção seguro e escalável envolve muitos outros fatores além do que foi abordado neste artigo. Recomendamos que você aprofunde seus conhecimentos em Docker e PostgreSQL antes de utilizar em ambientes de produção.


E é isso por hoje, pessoal!

Chegamos ao final de mais um artigo, espero que tenha sido útil e que você tenha aprendido algo novo.

Caso tenha alguma dúvida, comentário ou tenha encontrado algum erro, por favor, envie-me um email. Ficarei feliz em ouvir de você.

Se desejar receber novos artigos diretamente em seu e-mail, por favor, assine a nossa Newsletter. E se você já é um assinante, muito obrigado!

Aproveito e deixo um convite para nos conectarmos no Twitter e LinkedIn.

👋 Obrigado por ler até o final e até o próximo artigo !!!

Turbine a sua caixa de entrada

Junte-se a mais de 0 desenvolvedores inscritos

Talvez você possa curtir