【问题标题】:docker confusion about port码头工人对港口的困惑
【发布时间】:2019-10-02 06:08:41
【问题描述】:

我使用 compose 文件创建了一个 docker postgres 容器:

postgres:
  image: postgres:12-alpine
  volumes:
    - ./init.sql:/docker-entrypoint-initdb.d/init.sql
  ports:
    - "5432:5432"

init.sql:

CREATE USER test WITH PASSWORD '123456';
ALTER USER test WITH SUPERUSER;
CREATE DATABASE test;

我还通过运行创建了一个 pgAdmin4 容器:

docker pull dpage/pgadmin4
docker run -p 5050:80 \
    -e "PGADMIN_DEFAULT_EMAIL=user@domain.com" \
    -e "PGADMIN_DEFAULT_PASSWORD=SuperSecret" \
    -d dpage/pgadmin4

在 pgAdmin 中设置连接时。我需要通过查看 postgres 容器 IPAddress:docker container inspect 02e83f5f39d6 | grep IPAddress 来设置到 172.17.0.2 的服务器连接,使用 localhost 作为连接字符串将在 pgAdmin4 中失败。

但是,当我使用 python sqlalchemy 时,我可以连接到 localhost:5432。

import pandas as pd
from sqlalchemy import create_engine, MetaData

eng = create_engine('postgresql://test:123456@localhost:5432/test', echo=True)
meta = MetaData()
meta.reflect(eng, schema='public')

这令人困惑。为什么 pgAdmin 无法识别端口映射?是因为它是从另一个容器运行的吗?那么正确的设置应该是什么?

【问题讨论】:

    标签: postgresql docker docker-compose


    【解决方案1】:

    localhost 相对于容器/主机。

    对于 pgAdmin 容器,localhost 是它自己。因此,您需要指定 IP 以使 pgAdmin 指向正确的主机。

    对于在您的机器上运行的 python 脚本类似,localhost 是主机(您的 PC)。但是由于您指定了端口映射5432:5432localhost:5432 上的端口由 docker 转发 postgres 容器端口 5432。因此,如果脚本连接到 localhost:5432 - 它由 docker 转发到容器。

    此设置没有任何问题。最好将 pgAdmin 容器作为同一个撰写文件的一部分。有了它,您可以将服务名称用作到容器 IP 的 DNS 映射,以便于管理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-07
      • 1970-01-01
      • 1970-01-01
      • 2020-08-18
      • 2018-02-26
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      相关资源
      最近更新 更多