使用docker-compose时无法连接到postgres

7

我是docker的新手,仍在学习如何使用它, 我正在尝试使用docker-compose同时运行Django和Postgres,它们可以完美地运行,并且迁移完成了,但是我无法使用pgAdmin4连接数据库来查看数据库 这是我的setting.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'slack',
        'USER': 'username',
        'PASSWORD': 'password',
        'HOST': 'db',
        'PORT': 5432,
    }
}

以下是我的docker-compose.yml配置文件

version: '3'

services:
  db:
    image: postgres
    environment:
        POSTGRES_DB: slack
        POSTGRES_USER: username
        POSTGRES_PASSWORD: password
  web:
    build: .
    command: python3 manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/slack_code
    ports:
      - "8000:8000"
    depends_on:
      - db

一切似乎都正常运作:

sudo docker-compose up
slackwebapp_db_1 is up-to-date
Creating slackwebapp_web_1 ... done
Attaching to slackwebapp_db_1, slackwebapp_web_1
db_1   | The files belonging to this database system will be owned by user "postgres".
db_1   | This user must also own the server process.
db_1   | 
db_1   | The database cluster will be initialized with locale "en_US.utf8".
db_1   | The default database encoding has accordingly been set to "UTF8".
db_1   | The default text search configuration will be set to "english".
db_1   | 
db_1   | Data page checksums are disabled.
db_1   | 
db_1   | fixing permissions on existing directory /var/lib/postgresql/data ... ok
db_1   | creating subdirectories ... ok
db_1   | selecting default max_connections ... 100
db_1   | selecting default shared_buffers ... 128MB
db_1   | selecting dynamic shared memory implementation ... posix
db_1   | creating configuration files ... ok
db_1   | running bootstrap script ... ok
db_1   | performing post-bootstrap initialization ... ok
db_1   | syncing data to disk ... ok
db_1   | 
db_1   | Success. You can now start the database server using:
db_1   | 
db_1   |     pg_ctl -D /var/lib/postgresql/data -l logfile start
db_1   | 
db_1   | 
db_1   | WARNING: enabling "trust" authentication for local connections
db_1   | You can change this by editing pg_hba.conf or using the option -A, or
db_1   | --auth-local and --auth-host, the next time you run initdb.
db_1   | waiting for server to start....2018-01-18 19:46:43.851 UTC [38] LOG:  listening on IPv4 address "127.0.0.1", port 5432
db_1   | 2018-01-18 19:46:43.851 UTC [38] LOG:  could not bind IPv6 address "::1": Cannot assign requested address
db_1   | 2018-01-18 19:46:43.851 UTC [38] HINT:  Is another postmaster already running on port 5432? If not, wait a few seconds and retry.
db_1   | 2018-01-18 19:46:43.853 UTC [38] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
db_1   | 2018-01-18 19:46:43.864 UTC [39] LOG:  database system was shut down at 2018-01-18 19:46:43 UTC
db_1   | 2018-01-18 19:46:43.867 UTC [38] LOG:  database system is ready to accept connections
db_1   |  done
db_1   | server started
db_1   | CREATE DATABASE
db_1   | 
db_1   | CREATE ROLE
db_1   | 
db_1   | 
db_1   | /usr/local/bin/docker-entrypoint.sh: ignoring /docker-entrypoint-initdb.d/*
db_1   | 
db_1   | 2018-01-18 19:46:44.388 UTC [38] LOG:  received fast shutdown request
db_1   | waiting for server to shut down....2018-01-18 19:46:44.389 UTC [38] LOG:  aborting any active transactions
db_1   | 2018-01-18 19:46:44.390 UTC [38] LOG:  worker process: logical replication launcher (PID 45) exited with exit code 1
db_1   | 2018-01-18 19:46:44.391 UTC [40] LOG:  shutting down
db_1   | 2018-01-18 19:46:44.402 UTC [38] LOG:  database system is shut down
db_1   |  done
db_1   | server stopped
db_1   | 
db_1   | PostgreSQL init process complete; ready for start up.
db_1   | 
db_1   | 2018-01-18 19:46:44.501 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
db_1   | 2018-01-18 19:46:44.501 UTC [1] LOG:  listening on IPv6 address "::", port 5432
db_1   | 2018-01-18 19:46:44.502 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
db_1   | 2018-01-18 19:46:44.514 UTC [65] LOG:  database system was shut down at 2018-01-18 19:46:44 UTC
db_1   | 2018-01-18 19:46:44.518 UTC [1] LOG:  database system is ready to accept connections
web_1  | Performing system checks...
web_1  | 
web_1  | System check identified no issues (0 silenced).
web_1  | 
web_1  | You have 14 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
web_1  | Run 'python manage.py migrate' to apply them.
web_1  | January 18, 2018 - 19:48:49
web_1  | Django version 2.0.1, using settings 'slack_webapp.settings'
web_1  | Starting development server at http://0.0.0.0:8000/
web_1  | Quit the server with CONTROL-C.
web_1  | [18/Jan/2018 19:56:03] "GET / HTTP/1.1" 200 16559
web_1  | [18/Jan/2018 19:56:03] "GET /static/admin/css/fonts.css HTTP/1.1" 200 423
web_1  | [18/Jan/2018 19:56:04] "GET /static/admin/fonts/Roboto-Bold-webfont.woff HTTP/1.1" 200 82564
web_1  | [18/Jan/2018 19:56:04] "GET /static/admin/fonts/Roboto-Regular-webfont.woff HTTP/1.1" 200 80304
web_1  | [18/Jan/2018 19:56:04] "GET /static/admin/fonts/Roboto-Light-webfont.woff HTTP/1.1" 200 81348
web_1  | [18/Jan/2018 19:56:08] "GET /admin/ HTTP/1.1" 302 0
web_1  | [18/Jan/2018 19:56:09] "GET /admin/login/?next=/admin/ HTTP/1.1" 200 1855
web_1  | [18/Jan/2018 19:56:09] "GET /static/admin/css/base.css HTTP/1.1" 200 16106
web_1  | [18/Jan/2018 19:56:09] "GET /static/admin/css/responsive.css HTTP/1.1" 200 17894
web_1  | [18/Jan/2018 19:56:09] "GET /static/admin/css/login.css HTTP/1.1" 200 1203
web_1  | [18/Jan/2018 19:58:58] "POST /admin/login/?next=/admin/ HTTP/1.1" 302 0
web_1  | [18/Jan/2018 19:58:58] "GET /admin/ HTTP/1.1" 200 2988
web_1  | [18/Jan/2018 19:58:58] "GET /static/admin/css/base.css HTTP/1.1" 304 0
web_1  | [18/Jan/2018 19:58:58] "GET /static/admin/css/dashboard.css HTTP/1.1" 200 412
web_1  | [18/Jan/2018 19:58:58] "GET /static/admin/css/responsive.css HTTP/1.1" 304 0
web_1  | [18/Jan/2018 19:58:58] "GET /static/admin/css/fonts.css HTTP/1.1" 304 0
web_1  | [18/Jan/2018 19:58:58] "GET /static/admin/fonts/Roboto-Bold-webfont.woff HTTP/1.1" 304 0
web_1  | [18/Jan/2018 19:58:58] "GET /static/admin/fonts/Roboto-Light-webfont.woff HTTP/1.1" 304 0
web_1  | [18/Jan/2018 19:58:58] "GET /static/admin/fonts/Roboto-Regular-webfont.woff HTTP/1.1" 304 0
web_1  | [18/Jan/2018 19:58:58] "GET /static/admin/img/icon-addlink.svg HTTP/1.1" 200 331
web_1  | [18/Jan/2018 19:58:58] "GET /static/admin/img/icon-changelink.svg HTTP/1.1" 200 380
web_1  | [18/Jan/2018 19:59:05] "GET /admin/ HTTP/1.1" 200 2988
web_1  | [18/Jan/2018 19:59:07] "GET /admin/ HTTP/1.1" 200 2988
web_1  | [18/Jan/2018 19:59:11] "GET /admin/ HTTP/1.1" 200 2988
^CGracefully stopping... (press Ctrl+C again to force)
Stopping slackwebapp_web_1 ... done
Stopping slackwebapp_db_1  ... done

但我仍然无法连接,也不知道如何为Postgres默认用户设置密码,就像我们在其他数据库中做的那样。

sudo docker run --name test -e POSTGRES_PASSWORD=password -d postgres

因为我想我不能用docker-compose做到同样的事情,谢谢您提前的帮助。

以下回答解决了我的问题:https://dev59.com/jajja4cB1Zd3GeqP9FWo#62230446 - 将主机名更改为“db”,即数据库服务的名称。 - mattyb
5个回答

34

主机名应该是在docker-compose.yml中定义的服务名称

这是因为您在docker网络中

您不能在此处使用localhost或127.0.0.1,因为pgadmin在容器中,而此处的localhost表示“pgadmin容器”。

让我们考虑您的情况:

version: '3'

services:
  db:
    image: postgres
    ports:
      - 5432:5432
    environment:
        POSTGRES_DB: slack
        POSTGRES_USER: snowflake
        POSTGRES_PASSWORD: 1Stepclose

  pgadmin:
    image: chorss/docker-pgadmin4
    ports:
      - 5050:5050

在这种情况下,

主机名:db

端口号:5432

用户:snowflake

密码:1Stepclose

希望这可以帮到你 :)


将主机名更改为db对我有用,哇,这是一个微妙的问题。非常感谢!! - mattyb

3
为了从外部程序访问postgres数据库,您需要将由postgres服务暴露的端口5432挂载到主机上的一个端口。 通过对docker-compose.yml文件进行以下更改,您应该能够使用pgadmin(在localhost:5432上)连接到数据库,并让postgres为您创建用户。
db:
  image: postgres
  ports:
  - "5432:5432"
  environment:
    - POSTGRES_DB=slack
    - POSTGRES_USER=snowflake
    - POSTGRES_PASSWORD=1Stepclose

编辑: 我没有意识到您正试图连接运行在另一个docker容器中的pgadmin4。最简单的设置方法是将pgadmin4容器作为服务添加到您的docker-compose.yml文件中,以允许pgadmin4容器与postgres容器通信。更新您的docker-compose.yml文件以包含以下配置:

version: '3'

services:
  db:
    image: postgres
    ports:
      - 5432:5432
    environment:
        POSTGRES_DB: slack
        POSTGRES_USER: snowflake
        POSTGRES_PASSWORD: 1Stepclose

  pgadmin:
    image: chorss/docker-pgadmin4
    ports:
      - 5050:5050

  web:
    build: .
    command: python3 manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/slack_code
    ports:
      - "8000:8000"
    depends_on:
      - db

浏览到 localhost:5050 > 点击添加新服务器 > 输入任意名称 > 点击连接选项卡 > 在主机名/地址中输入db > 在用户名中输入snowflake > 在密码中输入1Stepclose > 点击保存。

我尝试了你的方法,仍然不起作用,可能是因为docker-compose的问题! - Snowflake
在主机上运行 sudo apt-get install postgresql-client(当 docker-compose up 正在运行时),然后从终端运行以下命令 psql -U snowflake -h localhost -p 5432 -d slack,如果可以正常运行,则说明您的 pgadmin4 程序配置不正确。 - Dovid Gefen
顺便提一下,当您设置POSTGRES_USER和POSTGRES_PASSWORD变量时,您正在创建一个新的postgres用户,并且不是设置默认postgres用户的密码,只有当您仅设置POSTGRES_PASSWORD变量时,它才将其设置为默认用户的密码。 - Dovid Gefen
我已经更新了我的答案。如果它有效,请将我的答案标记为正确的。 - Dovid Gefen
抱歉,伙计,还是没有运气 :( 无法连接到服务器(#1) - 'dasda'。 错误:无法将主机名“db”翻译为地址:名称无法解析。 - Snowflake
显示剩余2条评论

0
在你的setting.py文件中,你将数据库主机称为“db”,但在compose输出中它似乎被称为“slackwebapp_db_1”。尝试将setting.py更改为完整名称。

"slackw3bapp_db_1" 是容器名称,伙计,它是由docker-compose自动生成的,此外Django和postgres之间的通信良好,我只想使用第三方应用程序查看数据库以了解我正在做什么。 - Snowflake

0

我使用Pycharm控制我的项目,并且在Pycharm中内置的数据库管理系统已经成功连接,可能是pgadmin4出了问题,因为我正在使用chorss/docker-pgadmin4镜像作为pgAdmin4,因为我是Linux,所以可能是镜像或其他方面出了问题。感谢大家的努力。


-1

我看了一下postgres,从中找到了git repository(根据你的docker-compose文件,你使用的是最新标签)。看起来默认的用户名和密码“postgres”是硬编码的。你可以尝试在settings.py中使用“postgres”作为用户名和密码,看看是否有效。


我尝试了,但不幸的是它也不起作用,奇怪的是当我使用以下命令加载posgress容器时:"sudo docker run --name test -e POSTGRES_PASSWORD=1Stepcloser -d postgres" 它可以工作,但是当使用docker-compose时我无法连接。 - Snowflake
抱歉我之前的回答没什么意义。我尝试了类似的方法,这应该可以工作。其中一个区别是我没有在docker-compose.yml中启动runserver命令。我使用“-d”启动了docker-compose,然后连接到db容器检查环境变量是否存在。接下来我连接到web容器并运行了迁移命令。我注意到数据库slack是在db容器中创建的,因此连接应该可行。我发现在您的日志输出中有一个投诉,说您也应该执行迁移命令。或许你应该试试... - Chun-Yen Wang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接