在Docker中无法连接到PostgreSQL服务器。

18

我在Docker中启动了一个PostgreSQL服务器,并通过sudo docker run -it -p 5432:5432 9c421f1a239c bash命令公开了5432端口,然后手动在Docker容器中启动了PostgreSQL服务器。但是使用命令psql -h 172.17.0.63 -U venti无法连接到它。其中172.17.0.63是正确的IP地址,而venti是我的pg用户名。但是出现了错误:

psql: could not connect to server: Connection refused
    Is the server running on host "172.17.0.63" and accepting
    TCP/IP connections on port 5432?

我的pg_hba.conf文件长这样:

local   all             postgres                                peer
host all all 0.0.0.0/0 trust
local all all trust

连接到容器内的pg服务器成功运行。

Dockerfile:

FROM ubuntu:12.04
RUN apt-get update

RUN apt-get install -y gcc libc-dev-bin libc6 libc6-dev libssl-dev libkrb5-dev comerr-dev

RUN apt-get install -y postgresql-common libpq-dev postgresql-9.1-postgis --fix-missing
RUN apt-get install -y postgresql postgresql-client

USER postgres

ENV PGDATA /etc/postgresql/9.1/main
ENV LOGDIR  /etc/postgresql/9.1/main/postgresql.log

WORKDIR /usr/lib/postgresql/9.1/bin
USER root
RUN apt-get install -y vim
USER postgres
RUN sed -e '90d' -i /etc/postgresql/9.1/main/pg_hba.conf
RUN sed -e '91d' -i /etc/postgresql/9.1/main/pg_hba.conf

RUN echo "host all all 0.0.0.0/0 trust" >> '/etc/postgresql/9.1/main/pg_hba.conf'
RUN echo "local all all trust" >> '/etc/postgresql/9.1/main/pg_hba.conf'

RUN ./pg_ctl start && sleep 8 && ./createdb pg && ./createdb bloodstone \
    && createuser -Upostgres -s venti \
    && createdb -Uventi -Oventi venti

# ENTRYPOINT ./pg_ctl start && bash -c "while true; do echo "" > /dev/null; sleep 1; done" 

VOLUME $PGDATA
EXPOSE 5432

如果这不是一个打字错误,那么您在命令中缺少-p(端口参数)在5432:5432之前。 - Chandan Nayak
你在退出运行中的容器后,你的容器是否仍然在运行?因为你没有使用-d参数来启动它。 - Chandan Nayak
@ChandanNayak 在调试时,我没有退出容器,所以它至少现在还在运行。 - Kane Blueriver
@ChandanNayak 已更新 - Kane Blueriver
2
@ChandanNayak 看起来我没有将postgresql的listen_addresses设置为public。所以我添加了这一行:RUN sed -e "s/[#]\?listen_addresses = .*/listen_addresses = '*'/g" -i '/etc/postgresql/9.1/main/postgresql.conf'。看起来问题已经解决了,还是谢谢! - Kane Blueriver
显示剩余3条评论
3个回答

5

这只是一个错误的配置。我应该让pg监听公共地址或进行端口映射。我通过使用sed编辑pg配置文件来修复了这个问题:

 RUN sed -e "s/[#]\?listen_addresses = .*/listen_addresses = '*'/g" -i '/etc/postgresql/9.1/main/postgresql.conf'

将以下内容添加到 Dockerfile 的适当位置,即可正常运行。


1
要解决PostgreSQL认证问题,请查看PostgreSQL日志/标准错误以查看失败的详细原因。(我看到您的问题已得到解决,但如果有人遇到类似的问题)
要查找PostgreSQL日志位置:“show log_destination;”如果您有一个工作的psql(例如在PostgreSQL服务器框上本地运行)
我看到您的设置为“/etc/postgresql/9.1/main/postgresql.log”。您可以连接到容器以使用“docker exec -it container_name bash”查看日志。
或者,如果容器直接运行postgres,“docker attach db_container_name”将查看postgres stderr消息。
请注意,默认情况下,用户postgres没有密码并且仅使用身份验证。

-1

我也遇到了类似的问题。尝试运行两次docker-compose up。

原因是,在我的docker-compose.yml文件中,DB服务在Web服务之下,而它正在尝试连接到尚不存在的DB。

**

version: '2'  
services:
 nginx:
    image: nginx:latest
    container_name: ng01
    ports:
      - "8000:8000"
    volumes:
      - ./src:/src
      - ./config/nginx:/etc/nginx/conf.d
      - /static:/static  <--- HERE
    depends_on:
      - web  
 web:
    build: .
    container_name: dg01
    command: bash -c "python /src/IMS/manage.py makemigrations && python /src/IMS/manage.py migrate && gunicorn IMS.wsgi -b
0.0.0.0:8000"
    depends_on:
      - db
    volumes:
      - ./src:/src
      - /static:/static 
    expose:
      - "8000"  
 db:
    image: postgres:latest
    container_name: ps01**

6
如果您使用了depends_on,那么不应该发生这种情况。 - gdvalderrama

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