Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 如何从主机连接到Docker Postgres容器_Postgresql_Docker_Rails Postgresql_Remote Connection - Fatal编程技术网

Postgresql 如何从主机连接到Docker Postgres容器

Postgresql 如何从主机连接到Docker Postgres容器,postgresql,docker,rails-postgresql,remote-connection,Postgresql,Docker,Rails Postgresql,Remote Connection,我按照 它可以工作,但我无法从主机连接到Postgres服务器。我在管理macOS High Sierra。当我运行docker container ls时,我看到5432/tcp作为Postgres容器的端口。请注意,5432前面没有列出IP。当我运行docker network inspect时,我得到了172.18.0.2作为IP 但是当我运行psql-h172.18.0.2-p5432-uppostgres时 xpsql: could not connect to server: Op

我按照

它可以工作,但我无法从主机连接到Postgres服务器。我在管理macOS High Sierra。当我运行
docker container ls
时,我看到
5432/tcp
作为Postgres容器的端口。请注意,5432前面没有列出IP。当我运行
docker network inspect
时,我得到了172.18.0.2作为IP

但是当我运行psql-h172.18.0.2-p5432-uppostgres时

xpsql: could not connect to server: Operation timed out
  Is the server running on host "172.18.0.2" and accepting
  TCP/IP connections on port 5432?

我做错了什么?

使用Docker实际运行的虚拟机的IP。您可以通过运行以下命令找到此IP:

docker-machine ip default

通过查看您的详细信息5432/tcp,我觉得您似乎没有导出端口号5432

如果您已经导出了端口,那么它应该如下所示

 0.0.0.0:5432->5432/tcp
然后通过使用主机IP地址(您的本地mac机器IP),您应该能够连接,如果仍然无法工作,请共享您的docker命令-您如何运行容器

Docker编写文件

version: '3'
services:
  db:
    image: postgres
    ports:
     - "5432:5432"
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/airbnb
    ports:
      - "3000:3000"
    depends_on:
      - db
在docker compose文件中,您没有公开端口号5432,因此无法从外部连接Postgres DB

尝试在docker compose文件中添加端口:-“5432:5432”。 然后通过使用您的计算机IP地址,您应该能够连接数据库。

默认情况下。这只会将端口暴露给同一Docker网络中的其他容器,即compose文件中的所有其他容器。这是因为默认情况下,对于compose文件中的所有容器

有几个选项可用于从主机连接到容器:

  • 使用
    HOST:CONTAINER
    格式,使容器的端口在
    HOST
    IP上可用。例如,使用
    127.0.0.1:5432
    ,以便可以访问主机上该地址的端口
  • 使用Docker网络的网关IP作为接口/源地址。例如,如果容器是
    172.18.0.2
    ,那么网关很可能是
    172.18.0.1
    。对于postgres和socket库,通常有一种方法可以做到这一点,但不幸的是,我没有看到使用
    psql
    实现这一点的方法
  • 设置IP表,以便您的主机可以访问Docker网络

  • 另一个选项是从Docker网络中的容器访问它。您可以执行
    docker compose run--rm db psql-h db-U postgres
    ,它将运行一个一次性容器,该容器与
    db
    容器具有相同的docker映像,并且位于同一网络中。

    我认为它不会在docker机器上运行。运行docker machine ls返回一个空结果您能详细说明主机IP是什么意思吗?我尝试了本地IP地址(在本地wifi网络上识别笔记本电脑的IP)和公共IP。他们都告诉我psql:无法连接到服务器:连接被拒绝服务器是否在主机“”上运行并在端口5432上接受TCP/IP连接?您知道GUI Postgres客户端将使用TCP/IP over SSH进行连接吗?然后我可以通过Rails容器连接。你能分享docker运行命令吗,你是如何运行Postgres容器的?我按照到的说明操作。因此,我通过运行
    docker compose up
    来启动容器。这回答了你的问题吗?好的,那么你能分享你的docker compose文件吗。我想看看您是否正在公开端口号5432?如果您使用5433:5432,它将不会公开5433端口,并且您将获得拒绝连接。一旦您将其更改为“5433:5432”,它就会工作。与官方博士后测试:13.2图像(以及13)。