In How to use PostGIS in a docker container I explained how to start two docker containers, with PostGIS and with PgAdmin4, with docker run and how to use them.
There is another way: we can set up a configuration file compose.yaml and build and start both containers with docker compose.
This way
- It is easy to recreate containers with the same settings
- Networking between the containers will be easier
Update 24/07/2025: Things are much easier if you use podman instead of docker: How to use PostGIS in Podman
The following compose.yaml creates almost the same containers as in my old blog post (see there for information about most of the options):
name: dockerpostgis
services:
db:
image: postgis/postgis
restart: always
ports:
- "5432:5432"
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: mypassword
POSTGRES_DB: postgres # default database
volumes:
- pg_data:/var/lib/postgresql/data
pgadmin4:
image: dpage/pgadmin4
restart: always
ports:
- "80:80"
environment:
PGADMIN_DEFAULT_EMAIL: user@domain.com
PGADMIN_DEFAULT_PASSWORD: supersecred
volumes:
- pgadmin_data:/var/lib/pgadmin
volumes:
pg_data:
pgadmin_data:
This will start two services, running one container each. A “service” is defined in the config file by the image and some runtime arguments. The service db will be a container running PostGIS, the container name will most likely be “db-1”. Note that docker compose will add “dockerpostgis-db-1” and “db” to the list of DNS names, so we can use “db” as the hostname in pgAdmin.
Also note that the volumes are managed within the “dockerpostgis” scope defined by the yaml file. They will be listed as dockerpostgis_pg_data and dockerpostgis_pgadmin_data and any volumes created with docker run will be ignored. To reuse existing volumes, you can try to change the last lines of compose.yaml to:
volumes:
pg_data:
external: true
pgadmin_data:
external: true
To start (and build) the containers, run in the folder with your compose.yaml:
docker compose up
Or send the process into the background (detached):
docker compose up -d
In the first case, you can stop the containers with “Strg + C”, in the second case, stop it with:
docker compose stop
To stop and remove the containers, run:
docker compose down