簡體   English   中英

如何讓 postgres 監聽容器的新暴露端口(不是 5432)?

[英]How to make postgres listen on the container's new exposed port (not 5432)?

我嘗試用 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:alpine
EXPOSE 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)

這個評論:

簡單地公開 docker 圖像上的端口不會做任何事情,除非 postgres 實際上配置為偵聽該端口。 – 超級 5 分鍾前

教我標題(如何在 postgres:alpine 圖像上公開一個新端口(不是 5432)?)不是重點,所以我更新了標題。

如何讓 postgres 監聽容器的新暴露端口(不是 5432)?

您可以擁有多個在內部偵聽同一端口的容器,只要它們映射到主機上的不同端口(如果它們已發布)。 在您的示例中,您可以設置

url_db:
  image: postgres:latest
  environment:
    POSTGRES_USER: gorm
    et: cetera
  ports:
    - 5433:5432

來自 Docker 外部的連接到達重新映射的端口,位於<host ip>:5433 Docker 容器之間的連接使用url_db:5432上的標准服務端口。 這些連接忽略(並且不需要) ports: .

現代 Docker 中的“暴露”幾乎沒有任何意義; 它作為圖像中的文檔最有價值,顯示服務通常使用的端口。 理論上您可以要求 Compose expose:額外的端口而不修改圖像,但這樣做沒有實際效果。

您有多種選擇:

選項 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

Postgres 在容器內的/usr/share/postgresql/postgresql.conf.sample有一個示例配置。

要運行配置:

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

對於 Docker 假設我們要將端口更改為 5433

另一種方法是在 docker-compose.yml 文件中執行以下操作

  1. 在這種情況下,您可以將 postgres 數據掛載到目錄中的卷中。/db
  postgres:
    image: postgres:10.14-alpine
    environment:
      POSTGRES_DB: iam
    ports:
      - 5433:5433
    volumes:
      - ./db:/var/lib/postgresql/data
  1. 找到postgresql.conf文件,然后搜索port
  2. 將端口更改為
port = 5433             # (change requires restart)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM