4.3 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.
Installing PostgreSQL on Docker
Run an interactive shell in a Docker container.
sudo docker run -i -t ubuntu /bin/bashUpdate its dependencies.
apt-get updateInstall python-software-properties,
software-properties-common, wget and
vim.
apt-get -y install python-software-properties software-properties-common wget vimAdd PostgreSQL's repository. It contains the most recent stable
release of PostgreSQL, 9.3.
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -
echo "deb http://apt.postgresql.org/pub/repos/apt/ precise-pgdg main" > /etc/apt/sources.list.d/pgdg.list
apt-get updateFinally, install PostgreSQL 9.3
apt-get -y install postgresql-9.3 postgresql-client-9.3 postgresql-contrib-9.3Now, 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.
su postgres -c "createuser -P -d -r -s docker"Create a test database also named docker owned by
previously created docker role.
su postgres -c "createdb -O docker docker"Adjust PostgreSQL configuration so that remote connections to the
database are possible. Make sure that inside
/etc/postgresql/9.3/main/pg_hba.conf you have following
line:
host all all 0.0.0.0/0 md5Additionaly, inside
/etc/postgresql/9.3/main/postgresql.conf uncomment
listen_addresses like so:
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.
Exit.
exitCreate an image from our container and assign it a name. The
<container_id> is in the Bash prompt; you can also
locate it using docker ps -a.
sudo docker commit <container_id> <your username>/postgresqlFinally, run the PostgreSQL server via docker.
CONTAINER=$(sudo docker run -d -p 5432 \
-t <your username>/postgresql \
/bin/su postgres -c '/usr/lib/postgresql/9.3/bin/postgres \
-D /var/lib/postgresql/9.3/main \
-c config_file=/etc/postgresql/9.3/main/postgresql.conf')Connect the PostgreSQL server using psql (You will need
PostgreSQL installed on the machine. For Ubuntu, use something like
sudo apt-get install postgresql).
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.3.1)
Type "help" for help.
docker=# CREATE DATABASE foo OWNER=docker;
CREATE DATABASEAdditionally, publish your newly created image on the 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 -run='{"Cmd": \
["/bin/su", "postgres", "-c", "/usr/lib/postgresql/9.3/bin/postgres -D \
/var/lib/postgresql/9.3/main -c \
config_file=/etc/postgresql/9.3/main/postgresql.conf"], "PortSpecs": ["5432"]}' \
<container_id> <your username>/postgresqlFrom now on, just type
docker run <your username>/postgresql and PostgreSQL
should automatically start.