【问题标题】:Using Docker-compose, how to access the container database via the same port in container and in host使用 Docker-compose,如何通过容器和主机的相同端口访问容器数据库
【发布时间】:2019-06-04 16:05:16
【问题描述】:

我正在为 postgresql 运行 docker-compose 容器。容器中的 postgresql 数据库在标准端口 5432 上运行,我将该端口发布到主机上的端口 5444(因为正在使用主机的 postgresql 默认端口)。

我在主机和容器中使用相同的配置(一个为 cli 命令和整个应用程序提供配置设置的 .env 文件)。不幸的是,无论我选择哪个端口,一个系统都会失去访问权限。例如,我无法运行:

[k@host]$ pgsql -p 5444 # Connects

在主机中并且在容器内仍然有工作:

[k@db-container]$ pgsql -p 5444 # Errors in container

容器的 postgresql-server 正在 5432 上运行:

[k@db-container]$ pgsql -p 5432 # Connects successfully in container

并且端口是通过 docker-compose.yml 发布的: - 端口: - “5444:5432”

所以目前我不知道如何简单地通过 docker-compose.yml 配置相同的端口! expose 命令公开端口但不允许重新映射,ports 转发主机容器,但不重新映射内部端口。我曾想过在 postgresql 容器配置中重新映射 postgresql 默认端口,但是通过 docker-compose 在每个 docker-compose up 上完全重新配置 postgresql 似乎并非易事。

如何重新映射容器内的端口,以便可以在主机和容器中的任何地方使用端口 5444?

【问题讨论】:

    标签: postgresql docker docker-compose docker-networking


    【解决方案1】:

    您不能在主机上使用相同的端口。

    如果它们具有不同的 IP 地址,没有什么可以阻止您运行多个实例。

    psql -p 5444
    

    默认为psql --host=127.0.0.1 -p 5444。如果您想要多个实例 - 显然您必须以某种方式使它们不同。

    【讨论】:

      【解决方案2】:

      标准 PostgreSQL 客户端库支持several environment variables,它告诉它服务器在哪里。与使用$PGHOST 配置主机一样​​,也可以使用$PGPORT 配置端口。

      在 Docker Compose 上下文中,设置这些应该很简单:

      version: '3'
      services:
        postgres:
          image: postgres:11
          ports: ['5444:5432']
          volumes: ['./postgres:/var/lib/postgresql/data']
        myapp:
          build: .
          ports: ['8888:8888']
          env:
            PGHOST: postgres
            # default PGPORT=5432 will work fine
      

      同样,如果你在宿主机上的开发环境中运行应用程序,你可以设置

      PGHOST=localhost PGPORT=5444 ./myapp
      

      【讨论】:

      • 行得通,我可以在本地开发中修改命令(通过传递 ENV 变量),我会这样做,谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 2018-06-02
      • 1970-01-01
      • 2016-06-20
      • 2016-12-23
      相关资源
      最近更新 更多