Part 1 - Files
At the end of this section, your project folder should have these files:
-rw-rw-r-- 1 docker-compose.yml
-rwxrwxr-x 1 docker-entrypoint.sh
-rw-rw-r-- 1 Dockerfile
-rw-rw-r-- 1 .envDocker Files
Download your docker files from the GitHub Repo. Locate the specific Postgres version you want and copy Dockerfile and docker-entrypoint.sh files. Give the shell script an execute permission by running chmod +x ./docker-entrypoint.sh.
Set the Environment Variables
Create a .env file with the following configuration. It will allow you to easily set these values when switching host environments. The host machine will override these values if the same variable names exist:
POSTGRES_HOST_PORT=9999
POSTGRES_PASSWORD=password
POSTGRES_USER=username
POSTGRES_DB=database_nameDocker Compose Files
Create a docker-compose.yml file with the following instructions. The environment variables are picked up from the previous step. You can run docker-compose config to see how your configuration file will be interpreted and to verify that the values are correctly set.
version: '2'
services:
postgres9_6:
build:
context: .
container_name: some_postgres
ports:
- "${POSTGRES_HOST_PORT}:5432"
environment:
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_DB=${POSTGRES_DB}Part 2 - Commands
Start by running docker-compose up to build your image from the configuration files. If you open a new terminal window and run docker ps, you will see the details of your running Postgres container.
Docker Compose Network
By default, Docker Compose creates a single network for your application, naming it based on where your project folder is. You will need the network name to interact with the Postgres instance. Run docker network ls to get it.
Connecting to Postgres
Run this to log in to your Postgres database:
docker run -it --rm --link some_postgres:pghost \
--net postgres_default \
postgres_postgres9_6 \
psql -h pghost -d dbname -U dbuser --password-itto allow shell interaction--rmremoves the container as soon as you exit or stop it--link some_postgres:pghostlinks your container to a local named aliaspghost--net postgres_defaultis the network name taken fromdocker network lspostgres_postgres9_6is the image namepsql -h pghost -d dbname -U dbuser --passwordis a standardpsqlcommand to connect to a database.pghostis the same local alias name from the--linkargument
Part 3 - Data
Backups Using Volumes
This part assumes that you have done some database changes like table creation and data insertion. Other alternatives to do the same task are using docker exec IMAGENAME pg_dump ..., Data Volume Containers and running docker commit post database operations. Personally, I find that the simplest approach is to use volume mounting.
# host terminal
# creates an interactive session with the postgres container
docker run -it --rm --link some_postgres:pghost \
--net postgres_default \
-v $(pwd)/data:/backups \
postgres_postgres9_6 \
/bin/bash
# ---------------------------------
# container connection established
# ---------------------------------
# container terminal
# postgres commands are executed here
# works the same for database restores
pg_dump -h pghost -U dbuser --format=p dbname > /backups/backup.txtWhere
-v $(pwd)/data:/backupsmounts the host'sdatafolder onto the container'sbackupsfolderpg_dump ...is the native postgres command to backup a database