- When a docker container is deleted, relaunching it from the image will start a fresh new container without any of the changes made in the previously running container
- This happens because when we create a new container from an image, we add a new writable layer on top of the underlying stack of layers present in the base docker image.

- All changes made to the running container, such as creating new tables, inserting data etc are written to the writable container layer
- This writable layer does not persist after the container is deleted, therefore if you launch a postgreSQL container and create database and delete the container all the data will also get lost.
- In order to save or persist the data even after a container is deleted , you should use volumes.
- volumes are directories (or files) that are outside of the container and exist as normal directories and files on the host filesystem
- Idea is to launch the container but mount the volume on host file system so that even if the container is deleted , data can continue to persist in the host file system.
- I will explain it by mounting volume to a postgreSQL container and also initializing the database with some initialization scripts to create table and load data
- create a docker-compose.yml file
services:
db:
container_name: docker_pg
environment:
POSTGRES_DB: northwind
POSTGRES_PASSWORD: changeme
image: "postgres:12"
ports:
- "5432:5432"
volumes:
- /Users/nola/docker/postgres/docker-pg-vol/data:/var/lib/postgresql/data
- /Users/nola/docker/postgres/init/initData.sql:/docker-entrypoint-initdb.d/
version: "3"
volumes:
pg-data:
driver: local
- volumes: Users/nola/docker/postgres/docker-pg-vol/data:/var/lib/postgresql/data means mount the localhost data directory Users/nola/docker/postgres/docker-pg-vol/data to containers data directory /var/lib/postgresql/data. Write to data will happen now in this host location
- Initialize database: To initialize database i have created the initial scripts in my local at /Users/nola/docker/postgres/init/initData.sql and mounted that to /docker-entrypoint-initdb.d/ location of the container
- Rest of the entries in docker compose files are straight forward it has container name, database name, password, ports of container mapped to local host port and image name
- With this when you execute
docker compose up
- This will bring the new container up with data file mounted to host computer and initialization scripts

- docker compose file and data initialization is located at
- https://github.com/rajeshsgr/postgres-docker-compose
Thank you !