【问题标题】:Postgres to Ubuntu Docker container linking not workingPostgres 到 Ubuntu Docker 容器的链接不起作用
【发布时间】:2015-10-07 12:16:51
【问题描述】:

[编辑]:我可以在没有任何我自己的自定义代码的情况下重现它。我刚刚创建了一个运行 Ubuntu 14.04 的全新 Linode 映像,并按照Docker's website 上的步骤安装了 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 和 curl 测试链接:

$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=# 

但不是来自网络容器内部:

# 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。

任何想法我缺少什么?

【问题讨论】:

    标签: django postgresql docker


    【解决方案1】:

    检查您的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=#
    

    【讨论】:

    • 看起来不错:root@bc772503cb1e:/# cat /var/lib/postgresql/data/postgresql.conf | grep listen_addresses listen_addresses = '*' # 要监听的 IP 地址;
    • 看来您使用的是自定义 Postgres 容器,而不是来自 Docker Hub 的容器,对吧?你能发布你的 pg_hba.conf 吗?
    • 不,我使用的是 DockerHub 中的那个并且没有对其进行任何更改,它是在我执行运行命令时下载的。 pg_hba.conf 中唯一未注释的行是:host all all 0.0.0.0/0 trust
    • 一切正常,直到Django容器中的最终命令,postgres超时:root@e03db6d124ee:/# psql -h db -U postgres psql:无法连接到服务器:连接超时是服务器在主机“db”(172.17.0.26)上运行并接受端口 5432 上的 TCP/IP 连接?
    • 很奇怪。也许 1.7.1 在 Ubuntu 14.04 上运行不佳?现在我降级了它对我有用,所以我要继续前进。
    猜你喜欢
    • 2020-02-19
    • 2019-12-17
    • 2023-04-11
    • 2016-07-20
    • 2022-11-05
    • 1970-01-01
    • 2016-06-14
    • 2018-10-28
    • 2020-03-08
    相关资源
    最近更新 更多