#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
И сейчас все работает