为了账号安全,请及时绑定邮箱和手机立即绑定

如何让 postgres 监听容器的新暴露端口(不是 5432)?

如何让 postgres 监听容器的新暴露端口(不是 5432)?

Go
斯蒂芬大帝 2022-07-11 17:21:26
我尝试用 Go 初始化一个数据库。我在 postgres:alpine 使用端口 5433,因为 5432 已被另一个微服务应用程序占用。func Init() {    DB, err = gorm.Open(postgres.New(postgres.Config{        DSN: "host=url_db user=gorm password=gorm dbname=gorm port=5433 sslmode=disable TimeZone=Asia/Tokyo",    }), &gorm.Config{})    if err != nil {        panic(err)    }    autoMigration()}  url_db:    build:       context: ./api/services/url/db      dockerfile: Dockerfile    container_name: "url_db"    environment:       POSTGRES_USER: gorm      POSTGRES_PASSWORD: gorm      POSTGRES_DB: gorm      POSTGRES_HOST: url_db    ports:      - 5433:5433您可以确认这里只暴露了 5432 。我试图通过像这样创建一个新的 Dockerfile 来公开 5433。FROM postgres:alpineEXPOSE 5433但我得到了这个错误。failed to initialize database, got error failed to connect to `host=url_db user=gorm database=gorm`: dial error (dial tcp 172.19.0.3:5433: connect: connection refused)这条评论:除非 postgres 实际配置为侦听该端口,否则仅在 docker 映像上公开端口不会做任何事情。– 超级 5 分钟前这教我标题(如何在 postgres:alpine 图像上公开一个新端口(不是 5432)?)不是重点,所以我更新了标题。如何让 postgres 监听容器的新暴露端口(不是 5432)?
查看完整描述

3 回答

?
偶然的你

TA贡献1841条经验 获得超3个赞

您有多种选择:


选项 1:定义自己的 postgresql.conf


  url_db:

    build: 

      context: ./api/services/url/db

      dockerfile: Dockerfile

    container_name: "url_db"

    command: postgres -c "config_file=/etc/postgresql/postgresql.conf"

    environment: 

      POSTGRES_USER: gorm

      POSTGRES_PASSWORD: gorm

      POSTGRES_DB: gorm

      POSTGRES_HOST: url_db

    ports:

      - 5433:5433

    volumes:

      - /path/to/config:/etc/postgresql/postgresql.conf

/usr/share/postgresql/postgresql.conf.samplePostgres在容器中有一个示例配置。


要运行配置:


docker run -i --rm postgres cat /usr/share/postgresql/postgresql.conf.sample > my-postgres.conf

选项 1:覆盖 RUN 命令


  url_db:

    build: 

      context: ./api/services/url/db

      dockerfile: Dockerfile

    container_name: "url_db"

    command: postgres -c port=5433

    environment: 

      POSTGRES_USER: gorm

      POSTGRES_PASSWORD: gorm

      POSTGRES_DB: gorm

      POSTGRES_HOST: url_db

    ports:

      - 5433:5433


查看完整回答
反对 回复 2022-07-11
?
回首忆惘然

TA贡献1847条经验 获得超11个赞

您可以拥有多个在内部侦听同一端口的容器,只要它们映射到主机上的不同端口(如果它们已发布)。在您的示例中,您可以设置


url_db:

  image: postgres:latest

  environment:

    POSTGRES_USER: gorm

    et: cetera

  ports:

    - 5433:5432

来自 Docker 外部的连接到达重新映射的端口,位于<host ip>:5433. Docker 容器之间的连接使用标准服务端口,在url_db:5432. 这些连接忽略(并且不需要)ports:。


现代 Docker 中的“暴露”几乎没有任何意义。它作为图像中的文档最有价值,该图像显示了服务通常使用的端口。理论上,您可以在expose:不修改映像的情况下向 Compose 请求其他端口,但这样做并没有实际效果。


查看完整回答
反对 回复 2022-07-11
?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

对于 Docker Compose,假设我们要将端口更改为 5433


这样做的另一种方法是在 docker-compose.yml 文件中执行以下操作


在这种情况下,您可以将 postgres 数据挂载到目录中的卷中 ./db

  postgres:

    image: postgres:10.14-alpine

    environment:

      POSTGRES_DB: iam

    ports:

      - 5433:5433

    volumes:

      - ./db:/var/lib/postgresql/data

找到 postgresql.conf 文件,然后搜索port

将端口更改为

port = 5433             # (change requires restart)


查看完整回答
反对 回复 2022-07-11
  • 3 回答
  • 0 关注
  • 94 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信