Докер и Postgres — сервер неожиданно закрыли соединение из-за ошибки при использовании порта, отличного от 5432

#postgresql #docker #docker-compose #psql

Вопрос:

У меня возникла эта странная ошибка при использовании Postgres с докером. Итак, у меня есть две службы в моем файле docker-compose:

 version: '3'
services:
  db:
    image: postgres
    restart: always
    ports:
      - '5432:5432'
    environment:
      POSTGRES_PASSWORD: pass123

  test-db:
    image: postgres
    restart: always
    ports:
      - '5433:5433'
    environment:
      POSTGRES_PASSWORD: pass123
 

Итак, когда я запускаю «docker-compose up-d», оба контейнера монтируются. Команда «docker ps» дает мне:

 CONTAINER ID   IMAGE      COMMAND                  CREATED         STATUS         PORTS                                                 NAMES
a76fcc56f928   postgres   "docker-entrypoint.s…"   6 seconds ago   Up 5 seconds   0.0.0.0:5432->5432/tcp, :::5432->5432/tcp             nodejs-nest_iluvcoffe_db_1
9ab54557063f   postgres   "docker-entrypoint.s…"   6 seconds ago   Up 5 seconds   5432/tcp, 0.0.0.0:5433->5433/tcp, :::5433->5433/tcp   nodejs-nest_iluvcoffe_test-db_1
 

Когда я пытаюсь подключиться к контейнеру, отображающему порт 5432->5432, все хорошо. Но когда я пытаюсь подключиться к контейнеру, отображающему порт 5433->5433, я получаю ошибку:

 server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request.
 

Но, если я сопоставлю порты, как:

 version: '3'
services:
  db:
    image: postgres
    restart: always
    ports:
      - '5432:5432'
    environment:
      POSTGRES_PASSWORD: pass123

  test-db:
    image: postgres
    restart: always
    ports:
      - '5433:5432'
    environment:
      POSTGRES_PASSWORD: pass123
 

Тогда у меня будет в моем «докере ps»:

 CONTAINER ID   IMAGE      COMMAND                  CREATED         STATUS         PORTS                                       NAMES
5228461a2cff   postgres   "docker-entrypoint.s…"   6 seconds ago   Up 5 seconds   0.0.0.0:5432->5432/tcp, :::5432->5432/tcp   nodejs-nest_iluvcoffe_db_1
39353d05004c   postgres   "docker-entrypoint.s…"   6 seconds ago   Up 5 seconds   0.0.0.0:5433->5432/tcp, :::5433->5432/tcp   nodejs-nest_iluvcoffe_test-db_1
 

И я могу подключиться к обоим контейнерам/postgres-серверам. Кто-нибудь знает, почему это? почему я не могу использовать сопоставление портов 5433->5433?

Ответ №1:

  • Postgresql служба прослушивает порт 5432 в вашем контейнере.
  • ports раздел со 5433->5432 средствами map host port 5433 to listening container port 5432

    В результате сопоставление 5433 на 5433 невозможно без изменения прослушивания портов внутри контейнера postgresql.

  • Каждый контейнер подобен одному хосту, изменение порта прослушивания внутри posgresql container не должно быть необходимым.

Пожалуйста, ознакомьтесь с этой документацией для получения дополнительной информации о настройках postgresql по умолчанию : https://www.postgresql.org/docs/current/runtime-config-connection.html

Ответ №2:

Мне кажется, я понял, что происходит. Внутри контейнера по умолчанию postgres будет работать на порту 5432, даже если я сопоставлю его с директивой ports:

 ports:
      - '5433:5433'
 

Чтобы указать postgres, какой порт запускать внутри контейнера, я использовал приведенную ниже настройку:

 version: '3'
services:
  db:
    image: postgres
    restart: always
    ports:
      - '5432:5432'
    environment:
      POSTGRES_PASSWORD: pass123

  test-db:
    image: postgres
    restart: always
    ports:
      - '5433:5433'
    environment:
      POSTGRES_PASSWORD: pass123
    command: -p 5433
 

И сейчас все работает