123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- :title: PostgreSQL service How-To
- :description: Running and installing a PostgreSQL service
- :keywords: docker, example, package installation, postgresql
- .. _postgresql_service:
- PostgreSQL Service
- ==================
- .. include:: example_header.inc
- .. note::
- A shorter version of `this blog post`_.
- .. _this blog post: http://zaiste.net/2013/08/docker_postgresql_how_to/
- Installing PostgreSQL on Docker
- -------------------------------
- Run an interactive shell in a Docker container.
- .. code-block:: bash
- sudo docker run -i -t ubuntu /bin/bash
- Update its dependencies.
- .. code-block:: bash
- apt-get update
- Install ``python-software-properties``, ``software-properties-common``, ``wget`` and ``vim``.
- .. code-block:: bash
- apt-get -y install python-software-properties software-properties-common wget vim
- Add PostgreSQL's repository. It contains the most recent stable release
- of PostgreSQL, ``9.3``.
- .. code-block:: bash
- 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 update
- Finally, install PostgreSQL 9.3
- .. code-block:: bash
- apt-get -y install postgresql-9.3 postgresql-client-9.3 postgresql-contrib-9.3
- Now, 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.
- .. code-block:: bash
- su postgres -c "createuser -P -d -r -s docker"
- Create a test database also named ``docker`` owned by previously created ``docker``
- role.
- .. code-block:: bash
- 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:
- .. code-block:: bash
- host all all 0.0.0.0/0 md5
- Additionaly, inside ``/etc/postgresql/9.3/main/postgresql.conf``
- uncomment ``listen_addresses`` like so:
- .. code-block:: bash
- 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.
- .. code-block:: bash
- exit
- Create 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``.
- .. code-block:: bash
- sudo docker commit <container_id> <your username>/postgresql
- Finally, run the PostgreSQL server via ``docker``.
- .. code-block:: bash
- 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``).
- .. code-block:: bash
- CONTAINER_IP=$(sudo docker inspect $CONTAINER | grep IPAddress | awk '{ print $2 }' | tr -d ',"')
- psql -h $CONTAINER_IP -p 5432 -d docker -U docker -W
- As before, create roles or databases if needed.
- .. code-block:: bash
- psql (9.3.1)
- Type "help" for help.
- docker=# CREATE DATABASE foo OWNER=docker;
- CREATE DATABASE
- Additionally, publish your newly created image on the Docker Index.
- .. code-block:: bash
- sudo docker login
- Username: <your username>
- [...]
- .. code-block:: bash
- sudo docker push <your username>/postgresql
- PostgreSQL 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.
- .. code-block:: bash
- 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>/postgresql
- From now on, just type ``docker run <your username>/postgresql`` and
- PostgreSQL should automatically start.
|