PostgreSQL服务器¶
注解
- This example assumes you have Docker running in daemon mode. For more information please see 检测Docker安装情况.
- If you don’t like sudo then see Giving non-root access
注解
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/bash
Update its dependencies.
apt-get update
Install python-software-properties, software-properties-common, wget and vim.
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.
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
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.
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 md5
Additionaly, inside /etc/postgresql/9.3/main/postgresql.conf uncomment listen_addresses like so:
listen_addresses='*'
注解
This PostgreSQL setup is for development only purposes. Refer to PostgreSQL documentation how to fine-tune these settings so that it is secure enough.
Exit.
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.
sudo docker commit <container_id> <your username>/postgresql
Finally, 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 the postgresql client installed on the machine. For ubuntu, use something like sudo apt-get install postgresql-client).
CONTAINER_IP=$(sudo docker inspect -format='{{.NetworkSettings.IPAddress}}' $CONTAINER)
psql -h $CONTAINER_IP -p 5432 -d docker -U docker -W
As before, create roles or databases if needed.
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.
sudo docker login
Username: <your username>
[...]
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.
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.
