Como instalar o PostgreSQL no Docker

Introdução

Se você busca uma maneira eficiente e flexível de configurar o PostgreSQL, especialmente em ambientes de desenvolvimento, teste ou produção com alta portabilidade, a utilização do Docker oferece uma solução poderosa e escalável. Em vez de lidar com instalações tradicionais que demandam configurações específicas de sistema operacional e dependências, o Docker permite encapsular o PostgreSQL em um container virtualizado, garantindo consistência e facilitando o processo de distribuição e execução em diferentes plataformas.

Neste artigo, vamos explorar passo a passo como instalar e configurar o PostgreSQL utilizando Docker, abordando os comandos básicos para criação do container.

Roteiro:

  • Instalação Docker
  • Instalação PostgreSQL
    • Vantagens de usar o PostgreSQL dentro de um container
    • Desvantagens de usar o PostgreSQL dentro de um container
  • Gerenciamento de recursos no Docker
    • CPU e memória
    • Armazenamento de disco
    • Monitoramento de uso de recursos
    • Exemplo de container com gerenciamento de recursos

Instalação Docker

Vamos começar nosso processo instalando o Docker, e caso você já o tenha na máquina, basta pular para o próximo tópico.

Neste caso, optamos por utilizar o usuário root para facilitar a instalação.

Primeiro, vamos atualizar a lista de pacotes:

Debian shell: atualizando a lista de pacotes
# apt-get update
Get:1 file:/etc/apt/mirrors/debian.list Mirrorlist [39 B]
Get:5 file:/etc/apt/mirrors/debian-security.list Mirrorlist [27 B]
Hit:6 http://security.debian.org bookworm-security InRelease
Hit:2 http://mirrors.digitalocean.com/debian bookworm InRelease
...

Agora, vamos instalar os pacotes necessários:

Debian shell: instalando pacotes necessários para instalação do Docker
# apt-get install apt-transport-https ca-certificates curl gnupg lsb-release
Reading package lists... Done
Building dependency tree... Done
...

Após isso, vamos baixar a chave GPG do repositório Docker, que verifica a autenticidade e integridade dos pacotes Docker que iremos instalar:

Debian shell: baixando chave GPG
# curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

Na sequência, vamos configurar o repositório Docker, criando uma nova entrada ao arquivo de repositórios do APT:

Debian shell: configurando repositório Docker
# echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null

E mais uma vez iremos atualizar a lista de pacotes, agora com o novo repositório no sistema:

Debian shell: atualizando a lista pacotes para inclusão do repositório Docker
# apt-get update
Get:1 file:/etc/apt/mirrors/debian.list Mirrorlist [39 B]
Get:5 file:/etc/apt/mirrors/debian-security.list Mirrorlist [27 B]
Hit:7 https://repos-droplet.digitalocean.com/apt/droplet-agent main InRelease
Hit:6 http://security.debian.org bookworm-security InRelease
...

Por fim, vamos instalar a última versão do Docker Engine e do Docker Compose, sendo o primeiro a tecnologia responsável por criar e gerenciar containers, e o segundo, uma ferramenta para definir e gerenciar aplicativos que rodam em vários containers:

Debian shell: instalando Docker Engine e Docker Compose
# apt-get install -y docker-ce docker-ce-cli containerd.io
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
docker-ce is already the newest version (5:27.1.0-1~debian.12~bookworm).
...

Pronto! O Docker foi instalado na sua máquina. Para facilitar o uso, aqui estão alguns comandos básicos:

  • dpkg - l | grep docker: busca pacotes Docker instalados;
  • docker images: lista de imagens (adicione -a para forçar a listagem de todas, independente do estado, que pode ser em execução ou parado);
  • docker container ls: lista de containers (adicione -a para forçar a listagem de todos, independente do estado, que pode ser em execução ou parado);
  • docker container start <nome_container>: inicia um container;
  • docker container stop <nome_container>: para um container;
  • docker container restart <nome_container>: reinicia um container;
  • docker rm <nome_container>: remove um container;
  • docker rmi <nome_imagem>: remove uma imagem;
  • docker exec -it <nome_container> sh: executa o container de modo interativo, para mexer no shell;
  • exit: sai do shell interativo do container.

Instalação Postgres

Para começar, vamos baixar a imagem do Postgres. Aqui, temos a opção de baixar a mais recente, sem informar alguma versão específica, ou de acrescentar uma tag para referenciar a versão desejada, acrescentando :<versão> na frente de postgres, por exemplo:

docker pull postgres:15

Como vamos usar a mais recente, rodamos sem a tag:

Debian shell: baixando a imagem do PostgreSQL
# docker pull postgres
Using default tag: latest
latest: Pulling from library/postgres
2cc3ae149d28: Already exists
d1a63825d58e: Pull complete
ed6f372fe58d: Pull complete
35f975e69306: Pull complete
40c4fe86e99d: Pull complete
4795e1a32ff6: Pull complete
bcb5a54ae87d: Pull complete
d3983228bec6: Pull complete
5378bf7229e9: Pull complete
bba3241011a6: Pull complete
5e1d0413d05a: Pull complete
6a489170d05e: Pull complete
440b39aff272: Pull complete
582c79113570: Pull complete
Digest: sha256:46aa2ee5d664b275f05d1a963b30fff60fb422b4b594d509765c42db46d48881
Status: Downloaded newer image for postgres:latest
docker.io/library/postgres:latest

Agora, vamos executar o container:

docker run --name meu_postgres -p 5434:5432 -e POSTGRES_PASSWORD=postgres -d postgres

Nessa série de comandos, fizemos o seguinte:

  • docker run: criamos e rodamos o container;
  • –name: com esse parâmetro, nomeamos esse container com “meu_postgres”;
  • -p 5433:5432: mapeamos as portas entre o host (nossa máquina, onde o Docker está rodando) e o container criado (isso foi necessário porque temos o PostgreSQL instalado direto na máquina, e como é utilizada a porta padrão 5432, foi necessário mapear a 5434 no host para evitar conflito);
  • -e POSTGRES_PASSWORD=postgres: definimos a senha como “postgres”;
  • -d postgres: optamos pela execução do container em segundo plano, para que não ocupe nossa tela com os logs, as saídas e as mensagens da execução do container.

A saída do comando foi a seguinte:

Debian shell: executando o container “meu_postgres”
# docker run --name meu_postgres -p 5434:5432 -e POSTGRES_PASSWORD=postgres -d postgres
856f2b7e2b688baa8fa77da223cad27a898359bac81fadf59a5e6d147a7525ed

Agora, podemos conferir o container, que tem o começo do mesmo ID retornado na saída anterior, o nome da imagem postgres, as portas que configuramos e o nome do container meu_postgres:

Debian shell: listando containers
# docker container ls
CONTAINER ID   IMAGE      COMMAND                  CREATED              STATUS              PORTS                                       NAMES                      
856f2b7e2b68   postgres   "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:5434->5432/tcp, :::5434->5432/tcp   meu_postgres

Para acessar, podemos rodar o comando abaixo, que nos colocará no shell do container :

Debian shell: executando o container “meu_postgres” no modo interativo
# docker exec -it meu_postgres sh
#

Assim, podemos acessar normalmente o psql:

Debian shell: acessando o psql pelo shell do container
# psql -U postgres
psql (16.3 (Debian 16.3-1.pgdg120+1))
Type "help" for help.

postgres=#

Para acesso remoto, é necessário inserir o IP do host e a porta que configuramos, 5434, além de mexer nas configurações de segurança do PostgreSQL (pg_hba.conf).
Para localizar o pg_hba.conf, basta acessar o shell interativo com o comando docker exec it <nome_container> sh, mostrado anteriormente, e navegar até seu diretório, em /var/lib/postgresql/data:

Debian shell: encontrando o arquivo pg_hba.conf
# docker exec -it meu_postgres sh
# cd /var/lib/postgresql/data
# ls -lha
total 136K
drwx------ 19 postgres postgres 4.0K Jul 23 15:31 .
drwxr-xr-x  1 postgres postgres 4.0K Jul 23 07:23 ..
drwx------  5 postgres postgres 4.0K Jul 23 15:31 base
drwx------  2 postgres postgres 4.0K Jul 23 15:33 global
drwx------  2 postgres postgres 4.0K Jul 23 15:31 pg_commit_ts
drwx------  2 postgres postgres 4.0K Jul 23 15:31 pg_dynshmem
-rw-------  1 postgres postgres 5.7K Jul 23 15:31 pg_hba.conf

Pode ser necessário, ainda, instalar um editor de texto para mexer no arquivo, como o vi ou nano.

Vantagens de usar o PostgreSQL dentro de um container

  • Isolamento: o container isola completamente o ambiente do PostgreSQL, garantindo que todas as dependências necessárias (bibliotecas, configurações, versões específicas do PostgreSQL) estejam encapsuladas dentro do container, o que evita conflitos com outros softwares instalados no host;
  • Portabilidade: a imagem Docker é portátil e pode ser facilmente compartilhada entre diferentes máquinas e ambientes, isso simplifica a distribuição do ambiente de desenvolvimento e a colaboração em equipe;
  • Eficiência: os containers Docker são mais leves que as máquinas virtuais tradicionais, o que resulta em uma inicialização mais rápida, menos sobrecarga de recursos e maior eficiência geral;
  • Economia de recursos: com containers, você pode otimizar melhor o uso de recursos de hardware, permitindo que múltiplos containers compartilhem recursos do host de forma eficiente. Isso pode reduzir os custos de infraestrutura em comparação com a virtualização tradicional.

Desvantagens de usar o PostgreSQL dentro de um container

  • Complexidade de gerenciamento: gerenciar e orquestrar múltiplos containers pode ser trabalhoso, especialmente quando há interdependências entre eles. A configuração e o gerenciamento de volumes, redes e outras propriedades podem exigir um entendimento aprofundado da infraestrutura de containers;
  • Desempenho de I/O: pode resultar em latências mais altas no acesso aos discos e menor desempenho em operações de banco de dados, afetando a velocidade das consultas e a eficiência geral, em comparação com a utilização direto com o host;
  • Persistência e backup: embora volumes Docker proporcionem persistência, a configuração incorreta pode levar à perda de dados. Realizar backups e garantir a recuperação de dados pode ser mais complexo e exigir práticas cuidadosas.

Gerenciamento de recursos no Docker

Para garantir uma execução eficiente e estável dos containers, é importante entender como o Docker compartilha os recursos do servidor.  Por isso, aqui veremos alguns comandos que permitem esse gerenciamento. É importante saber que esses parâmetros são inseridos apenas na criação do container, portanto, não é possível alterar recursos de um container já existente.

CPU e memória

O Docker compartilha os recursos de CPU e memória entre todos os containers em execução. Podemos gerenciar esses recursos com alguns comandos que serão demonstrados abaixo.

Limitação de CPU: defina limites de CPU para garantir que os containers não consumam mais do que o necessário. É possível fazer isso com o parâmetro --cpus, que indica a quantidade de núcleos que o container poderá usar (1,5 núcleo de CPU no exemplo):

Debian shell: criando um container e limitando o uso de CPU
docker run --name <nome_container> -p <porta_host>:<porta_container> -e POSTGRES_PASSWORD=<senha> --cpus="1.5" -d postgres

Limitação de memória: defina limites de memória para evitar que um container consuma toda a memória disponível. É possível fazer isso com o parâmetro -m seguido do tanto de memória que se deseja fornecer para o container:

Debian shell: criando um container e limitando o uso de memória
docker run --name meu_postgres -p 5434:5432 -e POSTGRES_PASSWORD=postgres -m 512m -d postgres

Armazenamento de disco

Containers Docker usam o sistema de arquivos do host, mas cada container tem seu próprio sistema de arquivos isolado, chamado de volumes. É possível definir um volume para persistir seus dados, com o parâmetro -v:

Debian shell: criando um container e definindo um volume
docker run --name <nome_container> -p <porta_host>:<porta_container> -e POSTGRES_PASSWORD=<senha> -v <nome_volume> -d postgres

Os volumes criados por padrão são armazenados em /var/lib/docker/volumes/, na máquina hospedeira, e em /var/lib/postgresql/data no container, que, neste caso, é o diretório padrão do Postgres.

Os dados do volume são persistidos e, mesmo que o container seja parado ou removido, eles permanecem lá e podem ser usados por um novo container, basta utilizar o mesmo nome e endereço do volume em questão. Monitore o espaço em disco para evitar problemas.

Confira alguns comandos úteis para gerenciar seus volumes:

  • docker volume ls: lista os volumes;
  • docker volume inspect <nome_volume>: inspeciona um volume específico e traz detalhes sobre ele;
  • docker volume rm <nome_volume>: remove um volume específico (garante que os dados não são mais necessários).

Monitoramento de uso de recursos

É possível usar ferramentas como docker stats para monitorar o uso de CPU, memória e disco pelos containers em tempo real:

Debian shell: monitorando uso de recursos pelo container
# docker stats
CONTAINER ID   NAME           CPU %     MEM USAGE / LIMIT   MEM %     NET I/O       BLOCK I/O       PIDS
be1838d3bf17   meu_postgres   0.00%     33.89MiB / 961MiB   3.53%     2.38kB / 0B   5.98MB / 48MB   6

Exemplo de container com gerenciamento de recursos

Agora que aprendemos mais sobre nossos recursos, vamos recriar o container com uma melhor distribuição deles. Primeiro, vamos começar parando e removendo o container meu_postgres:

Debian shell: parando e removendo o container
# docker container stop meu_postgres
meu_postgres
# docker rm meu_postgres
meu_postgres

Agora, vamos recriá-lo com todos os parâmetros vistos:

Debian shell: recriando o container com configurações de recursos
# docker run --name meu_postgres -p 5434:5432 -e POSTGRES_PASSWORD=postgres --cpus="1.0" -m 2g -v meu_volume:/var/lib/postgresql/data -d postgres
51434c5572aafc4ecb9f30d13b8ecb7a6b214cd01018ab86a6b50129d78ecdda

Checando a pasta de volumes, podemos encontrar o container recém-criado:

Debian shell: verificando o diretório do volume recém-criado
# cd /var/lib/docker/volumes/
# ls -lha
total 44K
drwx-----x  5 root root   4.0K Jul 23 15:51 .
drwx--x--- 12 root root   4.0K Jul 23 12:30 ..
drwx-----x  3 root root   4.0K Jul 23 12:53 
brw-------  1 root root 254, 1 Jul 23 12:30 backingFsBlockDev
-rw-------  1 root root    32K Jul 23 15:51 metadata.db
drwx-----x  3 root root   4.0K Jul 23 15:51 meu_volume

Conclusão

Ao adotar o PostgreSQL em containers Docker, empresas e desenvolvedores beneficiam-se de uma infraestrutura mais ágil e adaptável, capaz de suportar desde ambientes de desenvolvimento até sistemas complexos de produção. Essa abordagem não só otimiza recursos de hardware, mas também acelera o ciclo de desenvolvimento e melhora a segurança dos dados, promovendo uma arquitetura de software mais robusta e moderna.


Comentários

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Sobre a Savepoint

A Savepoint é uma empresa especializada em PostgreSQL, oferecendo consultoria e mentoria personalizada, com foco em soluções eficientes, parceria de longo prazo e capacitação de equipes.



plugins premium WordPress