Ir para o conteúdo

PostgreSQL com Docker

De Wikiversidade

A forma mais fácil de começar a usar PostgreSQL é através de contêineres. Aqui irei demonstrar como usar Postgres através de um contêiner Docker.

Instalando Docker

[editar | editar código]

Primeiramente, você precisa de instalar Docker na sua máquina. Vale apenas destacar as duas principais formas de se instalar Docker: Docker Desktop e Docker Engine.

Docker Engine é a ferramenta usada para gerenciar contêineres e imagens Docker e só pode ser usada pelo terminal. Docker Desktop vai te dar acesso à Docker Engine e também a uma interface gráfica que pode ser mais amigável para começar.

Acesse a página oficial para baixar Docker Desktop. Ou então a documentação oficial para instalar apenas a Docker Engine. Ao instalar o Docker Desktop a Docker Engine é instalada automaticamente.

Após instalar o Docker, certifique-se que seu usuário foi adicionado ao grupo docker com o comando groups. Se não tiver sido adicionado, execute:

sudo usermod -aG docker $USER

Para modificar seu usuário (usermod) adicionando (a) ao grupo (G) docker. Independentemente de você ter sido adicionado ao grupo automatica ou manualmente, você vai ter que reiniciar seu computador. Caso contrário você verá erros de permissão ao tentar usar qualquer comando do Docker.

Básicos de Docker

[editar | editar código]

Vamos passar rapidamente pelos conceitos básicos de Docker:

Contêiner

[editar | editar código]

Um contêiner é um sistema isolado. Imagine algo similar a uma máquina virtual em que os dados do contêiner, programas e bibliotecas instaladas e processos sendo executados estão separados dos dados do sistema hospedeiro (o seu computador).

Com isso podemos executar aplicações que tenham dependências conflitantes com o que está instalado na sua máquina sem maiores problemas.

Cada contêiner é identificado por um nome e um id

Uma imagem é uma descrição do estado inicial do contêiner. Nela está descrito quais arquivos estão presentes no contêiner, programas instalados, processos que devem iniciar assim que o contêiner é criado dentre outras coisas.

Imagens são identificadas por um nome, uma tag (indicando uma variação da imagem) e um id.

Contêiner PostgreSQL

[editar | editar código]

O projeto Postgres disponibiliza uma imagem oficial postgres no Docker Hub (um repositório de imagens Docker). Essa imagem está pronta para uso e pode ser usada através de um comando simples:

docker create -itd --env POSTGRES_PASSWORD=sua_senha --env POSTGRES_USER=seu_usuario --env POSTGRES_DB=seu_banco_de_dados --name nome_do_conteiner -p 5432:5432 postgres:17

Vamos destrinchar o que cada parte do comando significa:

  1. docker create: comando usado para criar um novo contêiner
  2. -itd: vai criar um container interativo (i) com um terminal (t) desanexado do terminal atual (d). Assim podemos interagir com um shell dentro do contêiner caso seja necessário
  3. --env POSTGRES_PASSWORD=sua_senha: define uma variável de ambiente com a senha do banco de dados (obrigatório)
  4. --env POSTGRES_USER=seu_usuario: define o nome do usuário do banco de dados (opcional, o valor padrão é postgres)
  5. --env POSTGRES_DB=seu_banco_de_dados: define o nome do banco de dados em si (opcional, o valor padrão é o valor de POSTGRES_USER)
  6. --name nome_do_container: define o nome do contêiner (opcional, a Docker Engine dará um nome aleatório caso você não indique um nome)
  7. -p 5432:5432: faz um mapeamento de portas, conectando a porta 5432 do seu computador à porta 5432 do contêiner (porta onde o banco de dados vai aguardar conexões dentro do contêiner) (ex.: -p 54321:5432 iria conectar a porta 54321 do seu computador à porta 5432 do contêiner)
  8. postgres:17: indica que queremos usar a imagem do PostgreSQL versão 17 para criar o contêiner

A ordem dos itens 2 a 6 não importa, mas não confunda o nome do contêiner (--name) e o nome do banco (--env POSTGRES_DB), eles podem ser iguais, mas nomeiam coisas diferentes. A senha, usuário e nome do banco usados são os que você irá usar para se conectar ao banco.

Ao executar o comando, você talvez veja a mensagem Unable to find image 'postgres:17' locally o que é normal, em alguns instantes o Docker vai começar a baixar a imagem.

Usando o Contêiner

[editar | editar código]

Uma vez que seu contêiner foi criado, você pode ver ele pela interface do Docker Desktop ou usando o comando docker ps -a. Ele deve ter o status de Created e o nome que você indicou com --name ou um nome aleatório, caso você não tenha dado um nome.

Você pode manipular seu contêiner com os seguintes comandos:

  • docker start nome_do_conteiner: vai iniciar o contêiner
  • docker stop nome_do_contêiner: vai parar o contêiner graciosamente
  • docker kill nome_do_contêiner: vai parar o contêiner abruptamente
  • docker exec -it nome_do_contêiner /bin/bash: abre um shell dentro do contêiner
  • docker rm nome_do_contêiner: apaga o contêiner (deve ser parado antes)

Note que parar o contêiner seria similar a desligar um computador, seus dados serão preservados. Porém, ao apagar o contêiner, qualquer dado contido nele será perdido.

Vamos criar o seguinte contêiner:

docker create -itd --env POSTGRES_PASSWORD=1234 --env POSTGRES_USER=harrisonn --env POSTGRES_DB=meu_banco --name dbprojeto -p 54321:5432 postgres:17

Em seguida podemos iniciar ele

docker start dbprojeto

Agora, posso me conectar a ele com a connection string: postgres://harrisonn:1234@localhost:54321/meu_banco a partir do meu projeto, um programa externo como DBeaver ou então usando o psql dentro do próprio contêiner.

docker exec dbprojeto psql postgres://harrisonn:1234@localhost:5432/meu_banco

Note que aqui usamos a porta 5432 ao invés de 54321. Isso pois o comando psql vai ser executado dentro do contêiner, e lá dentro o banco está na porta 5432. Para qualquer aplicação fora do contêiner você usaria a porta 54321.

Lembrando que nada impede que você use -p 5432:5432 na hora de criar o seu contêiner (a menos que você já tenha algum outro programa usando a porta 5432 no seu computador). Estou apenas usando número diferentes para deixar claro o significado de cada valor.

Depois que eu terminar de usar o contêiner, posso parar ele com docker stop dbprojeto. Caso contrário, o contêiner continuará executando e consumindo recursos da minha máquina, mesmo depois de reiniciar o computador.

Quando esse contêiner e seus dados não forem mais úteis para mim (ex.: quero apagar todo conteúdo do banco de dados), posso parar ele e então apagar com docker rm dbprojeto

Referências Úteis

[editar | editar código]

Verifique os links abaixo para obter mais informações sobre Docker no geral e sobre a imagem de Postgres para Docker