Pre-requisites: Docker installed on your machine.
โจ Introduction
Running PostgreSQL on Docker is a game-changer for both beginners and experienced developers. It's a cutting-edge solution that brings convenience, flexibility, security and efficiency to your database setup.
Easy Setup and Portability: Docker allows you to effortlessly set up PostgreSQL with just a few simple commands. Say goodbye to complex installations and compatibility issues! With Docker, your PostgreSQL environment becomes portable, meaning you can run it consistently across different machines and environments.
Isolation and Security: Docker containers provide an isolated environment for PostgreSQL, ensuring that your database operates independently of the host system as it enhances security, preventing interference or unintended changes from other applications or processes.
Version Management Made Simple: Have multiple PostgreSQL projects with different versions? You can have multiple PostgreSQL instances running simultaneously, each with its specific version, without any conflicts.
Scalability at Your Fingertips: As your database needs grow, Docker effortlessly scales up your PostgreSQL setup. You can easily replicate containers, distribute the load, and manage resources, ensuring smooth and efficient database performance.
Data Persistence with Volumes: Docker volumes enable data persistence, so your precious PostgreSQL data remains intact even if containers are stopped or updated. This ensures your valuable information is always available when you need it.
๐ Postgres and Docker Setup
Start the Docker installed on your machine, and follow the steps below.
๐งฐ Pull the image
To run the Postgres database, we first need to pull the postgres
image on our docker. Run this command in your terminal:
docker pull postgres
This command will download the postgres image on your docker.
๐ Start the Postgres Container
Now let's write a command that we need to run the image to create a container that will start the Postgres Database Server.
docker run --name test-postgres \
-e "POSTGRES_USER=john" \
-e "POSTGRES_PASSWORD=mysecretpassword" \
-e "POSTGRES_DB=mydb" \
-p 5432:5432 -d \
-v postgres_volume:/var/lib/postgresql/data \
postgres
--name
is the flag that is used to set a name for the container. Here the name istest-postgres
.-e
is used to pass the env variables. Here the env variables arePOSTGRES_USER
,POSTGRES_PASSWORD
andPOSTGRES_DB
.-p 5432:5432
means mapping the Docker Host port to Container Port, and here both the ports are the same.-d
means running the container in detached mode.postgres
is the image name.-v postgres_volume:/var/lib/postgres/data
will be explained in the next section
๐๏ธ Docker Volume
Volumes are managed by Docker and are essential for preserving data even if containers are stopped, restarted, or removed.
-v
is used to create a volume in the path /var/lib/postgresql/data
, which is the default path, will contain the data required for the containers.
postgres_volume
is the named volume present in that directory.
There are also anonymous volumes.
An anonymous volume in Docker is a volume that is created without a specified name. When you create an anonymous volume, Docker assigns it a random name that is guaranteed to be unique within the scope of the host.
The name of an anonymous volume is a long string of letters and numbers, such as 83a3275e889506f3e8ff12cd50f7d5b501c1ace95672334597f9a071df439493
You can view the list of volumes, including anonymous volumes, on your host by running the command docker volume ls
.
๐ Connect to PostgreSQL using psql
To connect to the PostgreSQL container, use the following command:
docker exec -it test-postgres psql -U john -d mydb
Let's look at the breakdown of the command:
docker exec
: This command is used to execute a command in a running container.-it
flag is used when running thedocker exec
command. It is a combination of two separate flags:-i
and-t
, which serve different purposes.-i
(or--interactive
): It enables you to interact with the container's process by providing input through the command line.-t
(or--tty
): This flag allocates a pseudo-TTY (Teletypewriter) for the container. It allows you to see the output of the command and provides a terminal-like interface, making the interaction with the container more user-friendly.
test-postgres
: This specifies the name of the container in which the command will be executed.psql
: This is the command that will be executed inside the container. It stands for PostgreSQL interactive terminal.-U john
: The-U
flag stands for user and specifies the name of the user to connect as. In this case, it is connecting as userjohn
.-d mydb
: The-d
flag is used to state the database you are going to use.
After the running the above command, the psql
terminal will open. Now you can interact with your postgres database by running your SQL commands.
๐ ๏ธ Basic psql
commands
Here are some basic commands to help you interact with your PostgreSQL database using psql
:
To execute an SQL query, simply type it at the prompt followed by a semicolon (
;
), and hit enter. For example:mydb=> SELECT * FROM mytable;
mydb
is the name of the database.To quit
psql
, type\q
and hit enter:mydb=> \q
To list all databases in your PostgreSQL server, use the
\l
command:mydb=> \l
To switch to another database, use the
\c
command followed by the database name:mydb=> \c anotherdb
To list all tables in the current database, use the
\dt
command:mydb=> \dt
To get information about a specific table, use the
\d
command followed by the table name:mydb=> \d mytable
๐ก Shortcut: Docker-Compose
Create a yaml file 'docker-compose.yml' and write down this code for postgres and volume setup.
version: '3.9'
services:
postgres:
image: postgres:latest
container_name: test-postgres
environment:
POSTGRES_USER: john
POSTGRES_PASSWORD: mysecretpassword
POSTGRES_DB: mydb
ports:
- "5432:5432"
volumes:
- postgres_volume:/var/lib/postgresql/data
volumes:
postgres_volume:
driver: local
Breakdown of the docker-compose yml file
version: '3.9'
: This specifies the version of the Docker Compose file syntax being used. In this case, version 3.9 is used.services
: This section defines the services (containers) that will be created and managed by Docker Compose.postgres
: This is the service name for the postgres container.image: postgres:latest
: This line specifies the Docker image to be used for the PostgreSQL service.container_name: test-postgres
: This option sets the name of the container to "test-postgres".environment
: This section allows you to set environment variables within the postgres container. The specified environment variables arePOSTGRES_USER
,POSTGRES_PASSWORD
, andPOSTGRES_DB
.ports
: This option maps the host machine's port 5432 to the container's port 5432, allowing access to the postgres service inside the container using port 5432 on your host machine.Here the host machine is Docker Host. To know more, follow this guide.
volumes
: This section defines the volumes to be used by the containers.- postgres_volume:/var/lib/postgresql/data
: This line creates a named volume called "postgres_volume" and mounts it to the/var/lib/postgresql/data
directory inside the PostgreSQL container. This allows the PostgreSQL data to be persisted even if the container is removed.volumes
: This section defines the named volume "postgres_volume".driver: local
: This line specifies the volume driver to be used for the named volume. In this case, it uses the local driver, which means it will be managed by Docker on the local filesystem.
Then run this command:
docker-compose up -d
The above command will create a container from the postgres image and also volume for this container.
The End... :)
Comment about the next concept or topic you would like to know.
โ Follow for more such content.
๐ Like if you found this article useful :)
๐ฌ Feedback would be appreciated.
๐ Share if possible :D