PostgreSQL with Docker: Difference between revisions

From NovaOrdis Knowledge Base
Jump to navigation Jump to search
 
(36 intermediate revisions by the same user not shown)
Line 1: Line 1:
=Internal=
=Internal=


* [[Postgresql#Subjects|Postgresql]]
* [[PostgreSQL#Subjects|PostgreSQL]]


=Overview=
=Overview=


In its simplest form:
This article describes how to stand up and operate a Docker-based PostgreSQL instance. The instance will be accessible on the standard PostgreSQL port on the local host and it will be secured by a conventional user and password. Since the password is visible in the terminal used to create the container image, this approach is not really secure, but it is good enough for development purposes. The container-generated data will be stored on an [[Docker_Storage_Concepts#Anonymous_Volume|anonymous]] [[Docker_Storage_Concepts#Local_Volume_Driver|local]] volume.


<syntaxhighlight lang='bash'>
=Operations=
docker run postgres
</syntaxhighlight >


command starts a transient Posgres container instance that does not expose any port on the local host, it is initialized on the fly to allow access to any user and uses an [[Docker_Storage_Concepts#Anonymous_Volume|anonymous]] [[Docker_Storage_Concepts#Local_Volume_Driver|local]] volume that will '''not''' be reattached to during the next run. To get a usable Postgres instance we can shut down and restart and that regains access to stored data between restarts, we should use create a dedicated [[Docker_Storage_Concepts#Named_Volume|named volume]], initialize the database with a username and a password during the first initialization run and map ports to the local host.
==Create the Container==


=Create a Named Volume=
This is an one-time operation:


Create a
docker run -p 5432:5432/tcp -e POSTGRES_USER=admin -e POSTGRES_PASSWORD=<some-password> --name postgres postgres


=Running a Transient Instance=
If you want to use a local directory for storage, which will be made available to the container with a  [[Docker_Storage_Concepts#Bind_Mount|bind mount]], add the following arguments. Note that this is only necessary if you want to have convenient access to the database files and logs, for troubleshooting and debugging purposes:


Postgres binds by default on port 5432 and this is the port published by the following command:
--mount type=bind,source=<local-directory>,target=/var/lib/postgresql/data


<syntaxhighlight lang='bash'>
==Start the Container==
docker run -p 5432:5432/tcp  postgres
</syntaxhighlight>


The command will implicitly create a [[Docker_Storage_Concepts#Local_Volume_Driver|local]] [[Docker_Storage_Concepts#Anonymous_Volume|anonymous]] volume that will linger around after the container stops. The data on the anonymous local volume can be accessed by starting the stopped container. <font color=red>Test</font>
docker start postgres


You can attach to the container with:
==Stop the Container==


<syntaxhighlight lang='bash'>
docker stop postgres
docker exec -it <container-id> bash
 
</syntaxhighlight>
==Access Container Logs==
 
docker logs -f postgres

Latest revision as of 20:20, 19 October 2018

Internal

Overview

This article describes how to stand up and operate a Docker-based PostgreSQL instance. The instance will be accessible on the standard PostgreSQL port on the local host and it will be secured by a conventional user and password. Since the password is visible in the terminal used to create the container image, this approach is not really secure, but it is good enough for development purposes. The container-generated data will be stored on an anonymous local volume.

Operations

Create the Container

This is an one-time operation:

docker run -p 5432:5432/tcp -e POSTGRES_USER=admin -e POSTGRES_PASSWORD=<some-password> --name postgres postgres

If you want to use a local directory for storage, which will be made available to the container with a bind mount, add the following arguments. Note that this is only necessary if you want to have convenient access to the database files and logs, for troubleshooting and debugging purposes:

--mount type=bind,source=<local-directory>,target=/var/lib/postgresql/data

Start the Container

docker start postgres

Stop the Container

docker stop postgres

Access Container Logs

docker logs -f postgres