Postgres到Ubuntu的Docker容器链接不工作

[编辑]:我能够重现这个没有我自己的自定义代码。 我刚刚创build了一个运行Ubuntu 14.04的新Linode镜像,并根据Docker网站上的步骤安装了Docker。

然后我跑了:

docker run -d --name db postgres 

并可以看到它正在运行:

 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9d335e8fc70b postgres "/docker-entrypoint. 7 minutes ago Up 7 minutes 5432/tcp db 

然后,我启动一个交互式的Ubuntu容器,链接到db,并尝试通过nc和curltesting链接:

 $docker run -it --link db ubuntu /bin/bash root@eb02f4e7b89e:/# apt-get install curl ... root@eb02f4e7b89e:/# curl http://$DB_PORT_5432_TCP_ADDR:$DB_PORT_5432_TCP_PORT/ curl: (7) Failed to connect to 172.17.0.2 port 5432: Connection timed out 

我错过了什么?


我试图链接一个postgres容器与运行Django的应用程序容器,但它似乎没有正确链接。

启动容器的命令是:

 $ docker run -d --name db postgres $ docker run -d --name web --link db -p 8000:80 test_image 

这两个容器似乎运行良好:

 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5838047eb14c test_image "/test/.docker/st 40 minutes ago Up 40 minutes 0.0.0.0:8000->80/tcp web d2d6754430a2 postgres "/docker-entrypoint. 44 minutes ago Up 44 minutes 5432/tcp db 

似乎是正确的联系:

 $ docker inspect -f "{{ .HostConfig.Links }}" web [/db:/web/db] 

但是,当我尝试在web容器中运行“python manage.py migrate”时,它似乎无法连接到postgres容器:

 # python manage.py migrate Traceback (most recent call last): File "manage.py", line 10, in <module> execute_from_command_line(sys.argv) File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 338, in execute_from_command_line utility.execute() File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 330, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 390, in run_from_argv self.execute(*args, **cmd_options) File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 441, in execute output = self.handle(*args, **options) File "/usr/local/lib/python2.7/dist-packages/django/core/management/commands/migrate.py", line 93, in handle executor = MigrationExecutor(connection, self.migration_progress_callback) File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/executor.py", line 19, in __init__ self.loader = MigrationLoader(self.connection) File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/loader.py", line 47, in __init__ self.build_graph() File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/loader.py", line 180, in build_graph self.applied_migrations = recorder.applied_migrations() File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/recorder.py", line 59, in applied_migrations self.ensure_schema() File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/recorder.py", line 49, in ensure_schema if self.Migration._meta.db_table in self.connection.introspection.table_names(self.connection.cursor()): File "/usr/local/lib/python2.7/dist-packages/django/db/backends/base/base.py", line 164, in cursor cursor = self.make_cursor(self._cursor()) File "/usr/local/lib/python2.7/dist-packages/django/db/backends/base/base.py", line 135, in _cursor self.ensure_connection() File "/usr/local/lib/python2.7/dist-packages/django/db/backends/base/base.py", line 130, in ensure_connection self.connect() File "/usr/local/lib/python2.7/dist-packages/django/db/utils.py", line 97, in __exit__ six.reraise(dj_exc_type, dj_exc_value, traceback) File "/usr/local/lib/python2.7/dist-packages/django/db/backends/base/base.py", line 130, in ensure_connection self.connect() File "/usr/local/lib/python2.7/dist-packages/django/db/backends/base/base.py", line 119, in connect self.connection = self.get_new_connection(conn_params) File "/usr/local/lib/python2.7/dist-packages/django/db/backends/postgresql_psycopg2/base.py", line 172, in get_new_connection connection = Database.connect(**conn_params) File "/usr/lib/python2.7/dist-packages/psycopg2/__init__.py", line 179, in connect connection_factory=connection_factory, async=async) django.db.utils.OperationalError: could not connect to server: Connection timed out Is the server running on host "db" (172.17.0.42) and accepting TCP/IP connections on port 5432? 

我可以直接连接到postgres容器:

 $ docker exec -it db bash root@d2d6754430a2:/# cat /etc/hosts 172.17.0.42 d2d6754430a2 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters root@d2d6754430a2:/# su postgres $ psql psql (9.4.4) Type "help" for help. postgres=# 

但不是从Web容器内部:

 # curl http://$DB_PORT_5432_TCP_ADDR:$DB_PORT_5432_TCP_PORT/ curl: (7) Failed to connect to 172.17.0.42 port 5432: Connection timed out 

我的主机运行Ubuntu 14.04。

任何想法我失踪?

检查你的postgresql.conf是否有listen_addresses = '*'

默认是listen_addresses = 'localhost' ,它会按照你描述的方式行事。

编辑:

这对我有用,它对你有用吗?

 $ docker pull postgres $ docker pull django $ docker run -d --name db -d postgres $ docker run -it --link db:db django bash root@11c767bd3d09:/# psql -h db -U postgres psql (9.4.3, server 9.4.4) Type "help" for help. postgres=# 

编辑(Docker 1.7.1输出)

 $ docker rm $(docker ps -a -q) $ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE django latest 29755dd6751b 3 days ago 434.5 MB postgres latest f33438ff9aef 3 days ago 265.5 MB $ docker -v Docker version 1.7.1, build 786b29d $ docker run -d --name db -d postgres $ docker run -it --link db:db django bash root@11c767bd3d09:/# psql -h db -U postgres psql (9.4.3, server 9.4.4) Type "help" for help. postgres=#