У меня есть Postgresql на сервере в контейнере докера. Как я могу подключиться к нему извне, то есть с моего локального компьютера? Какие настройки я должен применить, чтобы разрешить это?
У меня есть Postgresql на сервере в контейнере докера. Как я могу подключиться к нему извне, то есть с моего локального компьютера? Какие настройки я должен применить, чтобы разрешить это?
Ответы:
Вы можете запустить 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
Итак, вы получаете доступ к базе данных (которая работает в докере на сервере) с вашего локального хоста.
В этом посте он expained подробно.
ifconfig -u | grep 'inet ' | grep -v 127.0.0.1 | cut -d\ -f2 | head -1
docker run --net=host --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres
Мне удалось запустить его на Linux
запустите docker postgres - убедитесь, что порт опубликован, я использую alpine, потому что он легкий.
sudo 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
для запуска вашего контейнера.
Вы также можете получить доступ с помощью команды docker exec:
$ docker exec -it postgres-container bash
# su postgres
$ psql
Или
$ docker exec -it postgres-container psql -U postgres
su postgres
делать?
su postgres
означает: переключить пользователя на пользователя postgres.
У меня уже был запущен 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
Я использую 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, создав том и привязывая его к месту назначения
( Примечание : по умолчанию используется порт по умолчанию 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
Для подключения с локального хоста вам нужно добавить --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
Я знаю, что это поздно, если вы использовали docker-compose, например @Martin
Это фрагменты, которые помогли мне подключиться к psql внутри контейнера.
docker-compose run db bash
root@de96f9358b70:/# psql -h db -U root -d postgres_db
Я не могу комментировать, потому что у меня нет 50 репутации. Надеюсь, это поможет.
Я попытался подключиться с 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
:?
Почему-то порт 5432 кажется защищенным. Я изменил конфигурацию порта с 5432:5432
на, 5416:5432
и следующая команда работала для подключения к вашей базе данных postgres извне контейнера докеров :
psql -h localhost -p 5416 -U <my-user> -d <my-database>
postgres
службу на своем хост-компьютере, который уже привязан к localhost: 5432, что не позволяет вам ее использовать. Сопоставление другого порта хоста с портом по умолчанию 5432 внутри контейнера - хорошее решение; в качестве альтернативы вы можете остановить службу postgres на своем хосте, но, возможно, она используется для чего-то, что вам нужно.
сначала откройте образ докера для postgres
docker exec -it <container_name>
тогда вы получите рут - root@868594e88b53:/#
ему нужно подключение к базе данных
psql postgresql://<username>:<databasepassword>@postgres:5432/<database>
В случае, если это серверное приложение django, вы можете сделать что-то вроде этого.
docker exec -it container_id python manage.py dbshell
docker ps -a
чтобы получить идентификаторы контейнеров, затем docker exec -it psql -U -W