【问题标题】:How to connect to postgres created with docker-compose from outside host如何从外部主机连接到使用 docker-compose 创建的 postgres
【发布时间】:2020-02-21 14:05:28
【问题描述】:

我认为这个问题应该很容易解决,但我正在拉扯我的头发。我有以下 docker-compose:

version: "3"
services:

  pg-db:
    image: postgres:11
    environment:
      POSTGRES_PASSWORD: "postgres"
      POSTGRES_USER: "postgres"
      POSTGRES_DB: "postgres"
    ports:
      - 5432:5432
    #network_mode: host

然后我运行docker-compose up 并启动容器

pg-db_1_78e7ec4a95e6 | 2020-02-21 13:53:53.928 UTC [1] LOG:  database system is ready to accept connections

我可以用 docker exec 连接到它

docker exec -it docker_pg-db-compose_1_78e7ec4a95e6 psql -h pg-db -U postgres postgres

但我无法通过“裸”psql 连接到它:

psql postgresql://postgres:postgres@localhost:5432/postgres

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

psql postgresql://postgres:postgres@pg-dg:5432/postgres
psql: could not translate host name "pg-db" to address: Name or service not known

我已尝试使用 network_mode,但没有帮助。

【问题讨论】:

    标签: postgresql docker docker-compose psql


    【解决方案1】:

    启动docker-compose后,需要通过以下方式获取docker容器ip:

    docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id

    然后你可以做postgresql://postgres:postgres@<container idp>:5432/postgres你应该可以连接到它

    【讨论】:

    • 它适用于该 IP。您是否知道是否可以配置主机名而不必使用 IP?
    • docker 可以管理容器内的主机,但不管理主机 /etc/hosts,所以暂时没有这样做的好方法。
    【解决方案2】:

    我正在使用Postgres DockerHub page 中提供的docker-compose 文件的修改版本。

    version: '3.1'
    services:
      db:
        image: postgres:11
        restart: always
        ports:
          - 5432:5432
        environment:
          POSTGRES_PASSWORD: postgres
    

    当我运行 docker-compose up 时,我会收到一条非常相似的“就绪”消息:

    db_1  | 2020-02-21 14:34:17.826 UTC [1] LOG:  database system is ready to accept connections
    

    此时,我可以使用 psql 连接到 Postgres。

    $ psql -h localhost -U postgres
    Password for user postgres: 
    psql (12.2, server 11.7 (Debian 11.7-1.pgdg90+1))
    Type "help" for help.
    
    postgres=#
    

    我还可以使用您提供的连接字符串和 postico 进行连接:

    差异是微妙的,我不确定restart 政策在这里是否有任何不同,但请尝试一下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-12
      • 1970-01-01
      • 2023-01-19
      • 1970-01-01
      • 2019-04-22
      • 1970-01-01
      • 2021-08-02
      • 1970-01-01
      相关资源
      最近更新 更多