4.2 KiB
- title
- PostgreSQL service How-To
- description
- Running and installing a PostgreSQL service
- keywords
- docker, example, package installation, postgresql
PostgreSQL Service
Note
A shorter version of this blog post.
Note
As of version 0.5.2, docker requires root privileges to run. You have to either manually adjust your system configuration (permissions on /var/run/docker.sock or sudo config), or prefix docker with sudo. Check this thread for details.
Installing PostgreSQL on Docker
For clarity I won't be showing commands output.
Run an interactive shell in Docker container.
sudo docker run -i -t ubuntu /bin/bashUpdate its dependencies.
apt-get updateInstall python-software-properies.
apt-get install python-software-properties
apt-get install software-properties-commonAdd Pitti's PostgreSQL repository. It contains the most recent stable
release of PostgreSQL i.e. 9.2.
add-apt-repository ppa:pitti/postgresql
apt-get updateFinally, install PostgreSQL 9.2
apt-get -y install postgresql-9.2 postgresql-client-9.2 postgresql-contrib-9.2Now, create a PostgreSQL superuser role that can create databases and other roles. Following Vagrant's convention the role will be named docker with docker password assigned to it.
sudo -u postgres createuser -P -d -r -s dockerCreate a test database also named docker owned by
previously created docker role.
sudo -u postgres createdb -O docker dockerAdjust PostgreSQL configuration so that remote connections to the
database are possible. Make sure that inside
/etc/postgresql/9.2/main/pg_hba.conf you have following
line:
host all all 0.0.0.0/0 md5Additionaly, inside
/etc/postgresql/9.2/main/postgresql.conf uncomment
listen_addresses so it is as follows:
listen_addresses='*'Note: this PostgreSQL setup is for development only purposes. Refer to PostgreSQL documentation how to fine-tune these settings so that it is enough secure.
Create an image and assign it a name.
<container_id> is in the Bash prompt; you can also
locate it using docker ps -a.
docker commit <container_id> <your username>/postgresqlFinally, run PostgreSQL server via docker.
CONTAINER=$(sudo docker run -d -p 5432 \
-t <your username>/postgresql \
/bin/su postgres -c '/usr/lib/postgresql/9.2/bin/postgres \
-D /var/lib/postgresql/9.2/main \
-c config_file=/etc/postgresql/9.2/main/postgresql.conf')Connect the PostgreSQL server using psql.
CONTAINER_IP=$(sudo docker inspect $CONTAINER | grep IPAddress | awk '{ print $2 }' | tr -d ',"')
psql -h $CONTAINER_IP -p 5432 -d docker -U docker -WAs before, create roles or databases if needed.
psql (9.2.4)
Type "help" for help.
docker=# CREATE DATABASE foo OWNER=docker;
CREATE DATABASEAdditionally, publish there your newly created image on Docker Index.
sudo docker login
Username: <your username>
[...]sudo docker push <your username>/postgresqlPostgreSQL service auto-launch
Running our image seems complicated. We have to specify the whole
command with docker run. Let's simplify it so the service
starts automatically when the container starts.
sudo docker commit <container_id> <your username>/postgresql -run='{"Cmd": \
["/bin/su", "postgres", "-c", "/usr/lib/postgresql/9.2/bin/postgres -D \
/var/lib/postgresql/9.2/main -c \
config_file=/etc/postgresql/9.2/main/postgresql.conf"], PortSpecs": ["5432"]}From now on, just type
docker run <your username>/postgresql and PostgreSQL
should automatically start.