У меня есть Postgresql на сервере в контейнере докера. Как я могу подключиться к нему извне, то есть с моего локального компьютера? Какую настройку я должен применить, чтобы разрешить это?
Подключение к Postgresql в Docker-контейнере извне
Ответы (16)
Вы можете запустить Postgres следующим образом (сопоставить порт):
docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres
Итак, теперь вы сопоставили порт 5432 вашего контейнера с портом 5432 вашего сервера. -p <host_port>:<container_port>
. Итак, теперь ваш postgres доступен из вашего public-server-ip:5432
Для проверки: запустите базу данных postgres (команда выше)
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
05b3a3471f6f postgres "/docker-entrypoint.s" 1 seconds ago Up 1 seconds 0.0.0.0:5432->5432/tcp some-postgres
Войдите в свой контейнер и создайте базу данных:
docker exec -it 05b3a3471f6f bash
root@05b3a3471f6f:/# psql -U postgres
postgres-# CREATE DATABASE mytest;
postgres-# \q
Перейдите на свой локальный хост (где у вас есть инструмент или клиент psql).
psql -h public-ip-server -p 5432 -U postgres
(пароль mysecretpassword)
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+------------+------------+-----------------------
mytest | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
template0 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres
Итак, вы получаете доступ к базе данных (которая работает в докере на сервере) с вашего локального хоста.
В этом сообщении он раскрыт в деталь.
ifconfig -u | grep 'inet ' | grep -v 127.0.0.1 | cut -d\ -f2 | head -1
- person Paul; 27.08.2017
psql -h some-internal-docker-host -p 5432 -U postgres
?
- person GarouDan; 26.05.2018
docker run --net=host --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres
- person lvthillo; 27.05.2018
docker exec -it 05b3a3471f6f bash
@lvthillo в этой строке, не нужно писать здесь SHA, вы можете заменить его как some-postgres, потому что контейнер назван из приведенной выше команды
- person Aragami1408; 25.06.2019
psql -h docker.for.mac.localhost -p 5432 -U postgres
. Оба эти варианта работают
- person Raphaël; 21.01.2021
Мне удалось запустить его на Linux
запустите docker postgres - убедитесь, что порт опубликован, я использую alpine, потому что он легкий.
docker run --rm -P -p 127.0.0.1:5432:5432 -e POSTGRES_PASSWORD="1234" --name pg postgres:alpine
используя другой терминал, получите доступ к базе данных с хоста, используя postgres uri
psql postgresql://postgres:1234@localhost:5432/postgres
для пользователей Mac замените psql на pgcli
sudo
для запуска вашего контейнера.
- person Russ Bateman; 07.02.2019
Вы также можете получить доступ через команду docker exec:
$ docker exec -it postgres-container bash
# su postgres
$ psql
Or
$ docker exec -it postgres-container psql -U postgres
su postgres
?
- person Breno; 21.05.2020
su postgres
означает: переключить пользователя на пользователя postgres.
- person vab2048; 21.07.2020
Я использую django с postgres в контейнерах Docker. в файле docker-compose добавьте следующее:
db:
image: postgres:10-alpine
environment:
- POSTGRES_DB=app
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=supersecretpassword
**ports:
- "6543:5432"**
который добавит доступный порт на вашем локальном компьютере. для себя подключил к нему DBeaver. это предотвратит конфликты портов между запросом вашего приложения и запросом локального компьютера. сначала я получил сообщение о том, что порт 5432 используется (это приложение django), поэтому я не мог получить доступ с помощью pgAdmin или DBeaver.
Я предполагаю, что вы хотите иметь возможность просматривать данные, присутствующие в вашем контейнере каждый раз, когда вы подключаетесь к нему извне. Для этого вам нужно будет сохранить данные на изображении postgres.
Если у вас нет постоянных данных, вам придется повторить все, что вы делали в первый раз.
Шаги 3, 5, 6, 7 и 8 ответят на ваш вопрос напрямую.
Вот подробный обзор всего процесса, который я выполнял в Windows 10 PowerShell (команды одинаковы в Linux и macOS):
Шаг 1: запустите PowerShell в режиме без прав администратора.
Шаг 2. Загрузите образ докера postgres: docker pull postgres:latest
Шаг 3. Запустите контейнер докеров в автономном режиме и сохраните данные в образе postgres, создав том и привязав его к месту назначения
(Примечание strong >: по умолчанию используется порт по умолчанию 5432; но укажите это явно, чтобы предотвратить ошибки подключения от таких клиентов, как pgadmin, dbeaver и т. д.) docker run --name postgres-test -e POSTGRES_PASSWORD=password -p 5432:5432 -v postgres-data:/var/lib/postgresql/data -d postgres:latest
Шаг 4. Проверьте статус запущенных контейнеров docker ps -a
Шаг 5. Войдите в container_name в интерактивном режиме
(Примечание: здесь можно выполнять такие команды, как ls, pwd и т. д., если вы проверял контейнеры linux при установке) docker exec -it postgres-test psql -U postgres
Шаг 6. Создайте образец данных. На этом этапе вы можете играть с psql
командами следующим образом:
# CREATE DATABASE test;
# \c test
# CREATE TABLE test_table(something int);
# INSERT INTO test_table VALUES (123);
# SELECT * FROM test_table;
# \q
Шаг 7. Откройте клиентское приложение базы данных, например pgadmin
или dbeaver
, и введите в поля подключения следующее:
Host: localhost
Database: test
User: postgres
Password: password
Шаг 8. Введите запрос select * from test_table
в редакторе запросов, и вы должны увидеть результат 123
У меня уже был запущен postgres на хост-машине, и я не хотел разрешать подключения из сети, поэтому я запустил временный экземпляр postgres в контейнере и создал базу данных всего в двух строках:
# Run PostgreSQL
docker run --name postgres-container -e POSTGRES_PASSWORD=password -it -p 5433:5432 postgres
# Create database
docker exec -it postgres-container createdb -U postgres my-db
-e POSTGRES_DB=my-db
для создания my-db вместо postgres
- person framp; 20.04.2020
Я знаю, что это поздно, если вы использовали docker-compose, например @Martin
Это фрагменты, которые помогли мне подключиться к psql внутри контейнера.
docker-compose run db bash
root@de96f9358b70:/# psql -h db -U root -d postgres_db
Я не могу комментировать, потому что у меня нет 50 репутации. Надеюсь, это поможет.
Чтобы подключиться с локального хоста, вам нужно добавить --net host:
docker run --name some-postgres --net host -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres
Вы можете получить доступ к серверу напрямую, не используя exec с вашего локального хоста, используя:
psql -h localhost -p 5432 -U postgres
Почему-то порт 5432 кажется защищенным. Я изменил конфигурацию своего порта с 5432:5432
на 5416:5432
, и следующая команда сработала для подключения к вашей базе данных postgres извне контейнера докеров:
psql -h localhost -p 5416 -U <my-user> -d <my-database>
postgres
на своем хост-компьютере, которая уже привязана к localhost: 5432, что не позволяет вам ее использовать. Сопоставление другого порта хоста с портом по умолчанию 5432 внутри контейнера - хорошее решение этой проблемы; в качестве альтернативы вы можете остановить службу postgres на своем хосте, но, возможно, она используется для чего-то, что вам нужно.
- person Davos; 20.11.2019
Я попытался подключиться с localhost (mac) к контейнеру postgres. Я изменил порт в файле docker-compose с 5432 на 3306 и запустил контейнер. Понятия не имею, зачем я это сделал: |
Затем я попытался подключиться к postgres через PSequel и adminer, но установить соединение не удалось.
После переключения обратно на порт 5432 все работает нормально.
db:
image: postgres
ports:
- 5432:5432
restart: always
volumes:
- "db_sql:/var/lib/mysql"
environment:
POSTGRES_USER: root
POSTGRES_PASSWORD: password
POSTGRES_DB: postgres_db
Это был мой опыт, которым я хотел поделиться. Возможно, кому-то это пригодится.
/var/lib/mysql
?
- person David Tabernero M.; 23.06.2019
сначала откройте образ докера для postgres
docker exec -it <container_name>
тогда вы получите корень --_ 2_ ему нужно соединение с базой данных
psql postgresql://<username>:<databasepassword>@postgres:5432/<database>
В случае, если это серверное приложение django, вы можете сделать что-то вроде этого.
docker exec -it container_id python manage.py dbshell
Здесь есть хорошие ответы, но если вам нравится иметь какой-то интерфейс для управления базой данных postgres, вы можете установить pgAdmin на свой локальный компьютер и подключиться к удаленному компьютеру, используя его IP-адрес и открытый порт postgres (по умолчанию 5432).
После создания моего приложения-шлюз-микросервис у меня возникла та же проблема. Не могу подключиться к contenerized postgresql из Heidisql.
На данный момент я решил это, просто указав пароль postgresql для docker-compose.yml, а также порт.
Итак, вам нужно найти и открыть docker-compose.yml. Затем введите POSTGRES_PASSWORD (не позволяйте ему быть пустым) и указать порт «5432: 5432».
services: microservice33-postgresql: environment: - POSTGRES_USER = microservice33 - POSTGRES_PASSWORD = wwww - POSTGRES_HOST_AUTH_METHOD = порты доверия: - 5432: 5432
ссылка для справки и скриншоты post
docker ps -a
, чтобы получить идентификаторы контейнеров, затем docker exec -it psql -U -W
Это сработало для меня:
PGPASSWORD=postgres psql -h localhost -p 3307 -U postgres -d postgres
Используйте приведенное выше, чтобы загрузить начальный скрипт как:
PGPASSWORD=postgres psql -h localhost -p 3307 -U postgres -d postgres < src/sql/local/blabla.sql
Не то, чтобы я переназначал свои порты как:
docker run -p3307:5432 --name postgres -e POSTGRES_PASSWORD=postgres -d postgres