A quick guide demonstrating how to get PostgreSQL up & running in minutes under Linux using Docker. We’ll create local persistent data storage using a Docker volume and connect from localhost with psql.
Table of Contents
Preparing local data storage
By default, running PostgreSQL with Docker would store all the data within the container, meaning it would not survive a rebuild of the container. To overcome that, let’s create a local directory that will be mounted as a Docker volume where PostgreSQL can save all of the data to be persistent regardless of container rebuilds etc.
As a best practice, let’s first create a new user called postgres
to manage the permissions for all local directories mounted as a volume by the PostgreSQL Docker container. To do so, run the following commands with root privileges.
$ useradd -M postgres
$ usermod -L postgres
This creates a new user postgres
having no home directory and a locked password preventing unwanted use. Next, we create a directory (I prefer something under /var/db) for the PostgreSQL data volume and assign it to the newly created user.
$ cd /var/db
$ mkdir postgres
$ chown -R postgres:postgres /var/db/postgres
That’s it for the local preparation. Now let’s move on to start PostgreSQL with Docker. All following steps can be done without having root privileges.
Running PostgreSQL with Docker
To run PostgreSQL with docker, we’ll first download the offical Postgres docker image.
$ docker pull postgres:16.2
Before starting the database, we need to figure out the user ID of the postgres
user for passing it to Docker. This will ensure the running container has sufficient rights to access the local data directory mounted as a volume.
$ id -u postgres
1002
Now we are ready to run Postgres with Docker using the following command:
$ docker run -d \
--name mypostgres \
--user 1002 \
-e POSTGRES_PASSWORD=Test123$ \
-e PGDATA=/var/lib/postgresql/data/pgdata \
-v /var/db/postgres:/var/lib/postgresql/data:Z \
-p 5432:5432 \
postgres:16.2
Let’s break down the options of the docker run command in detail.
docker run option | Description |
---|---|
-d | Run the container in background mode. |
--name mypostgres | [optional] Name the container mypostgres . |
--user 1002 | Set the user ID the container is running with to ensure appropriate rights for accessing the mounted volumes. |
-e POSTGRES_PASSWORD=Test123$ | Set the environment variable for the Postgres admin password. |
-e PGDATA=/var/lib/postgresql/data/pgdata | Set the environment variable for the Postgres data directory. |
-v /var/db/postgres:/var/lib/postgresql/data:Z | Mount local directory /var/db/postgres as a volume to container directory /var/lib/postgresql/data for persistent data storage on your localhost. |
-p 5432:5432 | Map the Postgres container port 5432 to local port 5432. |
postgres:16.2 | The container image to run. |
Note here that the PGDATA
variable must be set to something different then /var/lib/postgresql
to support mounting to a local persistent directory. For details refere to the corresponding Postgres docker image documentation.
Also you may need the “:Z” option for the volume mounts depending on your SELinux configuration. For an in-depth explanation refer to the Docker MongoDB guide.
Now let’s check if the container is up & running.
$ docker ps | grep postgres
b020097a3a6f postgres:16.2 "docker-entrypoint.sā¦" 2 days ago Up 9 seconds 0.0.0.0:5432->5432/tcp, :::5432->5432/tcp mypostgres
Looks good – we’re now ready to connect and use the PostgreSQL Docker instance.
Connecting from localhost with psql
Having the container running, let’s connect with the standard Postgres CLI tool psql. If you haven’t installed it already, you should opt-in for a local installation. This is done by installing the postgresl
package using dnf
with admin rights. If you are on another Linux distribution than Fedora, use your respective package manager.
$ dnf install postgresql
After psql is installed, run the following command as a normal user to connect to the Postgres container from localhost.
$ psql -h localhost -p 5432 -U postgres
Password for user postgres: # enter the password specified in the docker run command
postgres=#
That’s already it – you’re connected to PostgreSQL running with Docker š
If you want to use other database systems with Docker under Linux, also check out the guides for MongoDB and Oracle.