Rodando o Postgres em Docker
Esse post visa apresentar como rodar o Postgres localmente na sua máquina usando o Docker, para que você consiga testá-lo sem precisar instalá-lo. A imagem oficial do Postgres permite selecionar qual versão do Postgres você deseja rodar, por meio das suas tags.
Baixando a imagem
Esse passo não é realmente necessário, mas vamos executá-lo para que você veja como baixar a imagem sem precisar instanciar um container.
Para isso, vamos baixar a versão mais recente disponível hoje (08/04/2020), ou seja, a tag 12.2.
sudo docker pull postgres:12.2
Se você adicionou seu usuario no grupo docker conforme essa página, não precisa do sudo no comando.
Se tudo der certo no download da imagem, você terá um resultado mais ou menos assim no terminal:
12.2: Pulling from library/postgres
c499e6d256d6: Pull complete
67a768c93810: Pull complete
3befaea70a64: Pull complete
b72dde2f70c9: Pull complete
9af5f5958937: Pull complete
79f4f06e2acc: Pull complete
bc35aa1d8687: Pull complete
276504d44bd7: Pull complete
56cfad4df2a4: Pull complete
28bfa2f917aa: Pull complete
bbbebba2bc39: Pull complete
d2407cea5efb: Pull complete
92dae474b380: Pull complete
c71da770d20d: Pull complete
Digest: sha256:d480b197ab8e01edced54cbbbba9707373473f42006468b60be04da07ce97823
Status: Downloaded newer image for postgres:12.2
docker.io/library/postgres:12.2
Esse comando baixa a imagem, e deixa ela disponível no seu registro local (tipo um repositório de imagens Docker). Para ver informações da imagem execute:
sudo docker images
A saída desse comando deve mostrar a imagem do Postgres:
REPOSITORY TAG IMAGE ID CREATED SIZE
postgres 12.2 9907cacf0c01 9 days ago 314MB
Para rodar de fato o Postgres, precisaremos definir no mínimo a senha do usuário postgres. Após definida qual será a senha, podemos rodar um container da imagem do postgres com o seguinte comando:
sudo docker run --name meu-postgres -e POSTGRES_PASSWORD=SENHA_DO_USUÁRIO_POSTGRES -d postgres:12.2
Lembre-se de substituir SENHA_DO_USUÁRIO_POSTGRES pela senha que você definiu.
Esse comando inicia um container do Postgres utilizando a imagem que baixamos. Note que o comando docker run serve para iniciar containers, e o último parâmetro (postgres:12.2 é o nome da imagem que queremos utilizar como base do container). Também estamos definindo que o nome do container é meu-postgres (pode ser qualquer nome que você quiser) e a variável de ambiente POSTGRES_PASSWORD.
Por último, mas não menos importante, temos o -d, que serve para rodar o container em modo daemon, ou seja, em background, sem travar o terminal.
Para termos certeza que o container está rodando podemos executar o comando ps do Docker:
sudo docker ps
Ele é utilizado para mostrar os containers que estão rodando. No meu caso, somente o container do Postgres:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ff0caad37f2c postgres:12.2 "docker-entrypoint.s…" 4 seconds ago Up 3 seconds 5432/tcp meu-postgres
Para executar comandos nesse container, como por exemplo criar uma nova base, temos o comando exec:
sudo docker exec meu-postgres psql -c "CREATE DATABASE teste" -U postgres
Com ele, especificamos o container no qual queremos rodar um comando (meu-postgres) e na sequencia o comando em si (psql -c "CREATE DATABASE teste" -U postgres
).
Como esse comando é executado dentro do container, o usuário postgres consegue logar mesmo sem senha.
No entanto, se quisermos acessar o banco do Postgres sem utilizar o Docker, devemos mapear a porta do container na qual roda o banco para uma porta da nossa máquina.
É importante entender que cada container é como se fosse uma nova máquina, rodando dentro do seu computador, e por isso possui um IP próprio e portas próprias. Por isso é necessário realizar esse mapeamento.
Na documentação da imagem do Postgres temos a informação de que a porta do container na qual sobe o Postgres é a 5432, por isso, podemos mapeá-la para uma porta qualquer (que esteja disponível) da nossa máquina.
Vamos primeiro matar o container atual com o comando rm, para posteriormente subir um container com a porta mapeada:
sudo docker rm -f meu-postgres
Esse comando aceita como parâmetro o nome (ou ID) do container e o parâmetro -f informa que queremos forçar a remoção do *container.
Após remover o container, podemos subir um novo container com a porta 5432 mapeada para a porta 7777 da nossa máquina:
sudo docker run --name meu-postgres -p7777:5432 -e POSTGRES_PASSWORD=SENHA_DO_USUÁRIO_POSTGRES -d postgres:12.2
Esse procedimento é realizado usando o comando docker run novamente, mas agora acrescido do parâmetro -p, o qual informamos dois valores separados por :. O primeiro valor é a porta da nossa máquina na qual queremos mapear a porta do container, já o segundo é a porta do container que vamos mapear.
Com isso, agora você pode usar o comando psql do seguinte modo:
psql -h localhost -p 7777 -U postgres -W
Para quem não conhece o comando psql, com o parâmetro -h informamos o host do banco, no caso localhost, ou seja, nossa própria máquina. Já o parâmetro -p serve para definir a porta na qual está rodando o banco (7777). O parâmetro -U informa o usuário do banco que usaremos para conectar e o parâmetro -W serve para indicar que vamos digitar a senha.
A senha então será requisitada. Nesse caso basta você digitar a mesma senha que definiu no comando docker run.
Pronto, com isso agora você terá acesso ao banco do Docker assim como se estivesse acessando qualquer outra instância do Postgres.
Simples e fácil! Esse é um dos motivos pelos quais uso Docker. Você não precisa se preocupar com difíceis configurações. Na maioria das vezes basta passar um ou poucos parâmetros, e a aplicação que você deseja testar já fica disponível para você.
Se você for utilizar o banco por mais tempo, e quiser que ele fique disponível como serviço, provavelmente vai querer também mapear os dados do banco em um diretório local da sua máquina, para que, caso seja necessário reinicializar o container, as informações salvas no banco não sejam perdidas. É possível atingir esses dois objetivos (rodar como serviço e persistir as informações na sua máquina) usando o comando a seguir:
sudo docker run --name meu-postgres --restart alway -v $HOME/banco-postgres:/var/lib/postgresql/data -p7777:5432 -e POSTGRES_PASSWORD=SENHA_DO_USUÁRIO_POSTGRES -d postgres:12.2
O parâmetro --restart define a política de reinicialização do container, e quando definimos que ela é always, informamos ao Docker que queremos que o container seja reiniciado sempre, independente do status de saída do comando principal, já o parâmetro -v faz um mapeamento de um diretório local da nossa máquina, no exemplo $HOME/banco-postgres para um diretório do container, no caso /var/lib/postgresql/data, que é o diretório padrão no qual o Postgres salva as bases de dados. Note que o parâmetro -v segue a mesma lógica do parâmetro -p, portanto é informado primeiro o diretório da nossa máquina, e depois o diretório no container.
Com esse comando, seu banco estará sempre disponível na porta 7777 da sua máquina, e com os dados preservados!
Outra coisa interessante, é sempre ler a documentação da imagem para conhecer outras variáveis de ambiente que podem ser passadas como parâmetro para personalizar ainda mais seu banco, como POSTGRES_DB, que permite que você defina o nome da base de dados criada.
Por hoje é só, espero que tenham gostado. Até a próxima!