У мене є Postgresql на сервері в докерному контейнері. Як я можу підключитися до нього зовні, тобто з мого локального комп'ютера? Яке налаштування потрібно застосувати, щоб дозволити це?
У мене є Postgresql на сервері в докерному контейнері. Як я можу підключитися до нього зовні, тобто з мого локального комп'ютера? Яке налаштування потрібно застосувати, щоб дозволити це?
Відповіді:
Ви можете запустити Postgres таким чином (карта порт):
docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres
Отже, тепер ви зіставили порт 5432 свого контейнера на порт 5432 вашого сервера. -p <host_port>:<container_port>
.Так тепер ваші поштові адреси доступні у ваших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
Перейдіть до свого localhost (де у вас є інструмент або клієнт psql).
psql -h public-ip-server -p 5432 -U postgres
(пароль мій пароль)
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
Таким чином, ви отримуєте доступ до бази даних (яка працює в docker на сервері) з вашого localhost.
У цій публікації вона детально розкрита.
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
запустіть доскрип докер - переконайтеся, що порт опублікований, я використовую альпійський, оскільки він легкий.
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
?
У мене вже було запущено 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. у файлі докерів-композицій додайте таке:
db:
image: postgres:10-alpine
environment:
- POSTGRES_DB=app
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=supersecretpassword
**ports:
- "6543:5432"**
який додасть доступний порт вашою локальною машиною. для себе я підключив DBeaver до нього. це запобіжить зіткнення портів між вашим запитом програми та запитом локальної машини. спочатку мені надійшло повідомлення про те, що порт 5432 використовується (що використовується програмою django), тому я не міг отримати доступ через pgAdmin або DBeaver.
Для підключення з localhost потрібно додати "--net хост":
docker run --name some-postgres --net host -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres
Ви можете отримати доступ до сервера безпосередньо, не використовуючи exec зі свого localhost, використовуючи:
psql -h localhost -p 5432 -U postgres
Я намагався підключитися від localhost (mac) до контейнера postgres. Я змінив порт у файлі docker-compose з 5432 на 3306 і запустив контейнер. Поняття не маю, чому я це зробив: |
Тоді я спробував підключитися до postgres через PSequel і адмінер, і з'єднання не вдалося встановити.
Після повернення до порту 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
:?
Я припускаю, що ви хочете мати можливість переглядати дані, наявні у вашому контейнері кожного разу, коли ви підключаєтесь до нього ззовні. Для цього вам доведеться зберегти дані на зображенні постгресу.
Якщо у вас немає постійних даних, вам доведеться повторити все, що ви зробили вперше.
Кроки 3, 5, 6, 7 і 8 відповідають на ваше запитання безпосередньо.
Ось детальний огляд всього процесу, за яким я дотримувався в панелі повноважень Windows 10 (команди однакові і в Linux, і в macOS):
Крок 1 : Запустіть панель повноважень у режимі без адміністрування
Крок 2 : Завантажте зображення докера postgres:
docker pull postgres:latest
Крок 3 : Запустіть контейнер докера у відірваному режимі та збережіть дані про зображення після пошти, створивши том та прив’язавши їх до пункту призначення
( Примітка : за замовчуванням 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 : Перейдіть всередину_іменника_контракту в інтерактивному режимі
( Примітка. Тут можна виконувати команди типу 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
Чомусь порт 5432 видається захищеним. Я змінив конфігурацію свого порту з 5432:5432
на 5416:5432
та наступна команда працювала, щоб підключитися до вашої бази даних postgres поза її контейнера докера :
psql -h localhost -p 5416 -U <my-user> -d <my-database>
postgres
службу на своєму хост-машині, яка вже буде прив’язана до localhost: 5432, не дозволяючи вам використовувати її. Зображення іншого хостового порту до порту 5432 за замовчуванням всередині контейнера є хорошим рішенням для цього; Ви також можете зупинити послугу Postgres на своєму хості, але, можливо, вона використовується для чогось необхідного.
спочатку відкрийте зображення докера для постгресів
docker exec -it <container_name>
тоді ви отримаєте корінь - root@868594e88b53:/#
йому потрібно підключення до бази даних
psql postgresql://<username>:<databasepassword>@postgres:5432/<database>
Тут є хороші відповіді, але якщо ви хочете мати якийсь інтерфейс для управління базами даних postgres, ви можете встановити pgAdmin на свій локальний комп'ютер і підключитися до віддаленої машини за допомогою свого IP-адреси та порту, що відкривається після пошти (за замовчуванням 5432).
docker ps -a
щоб отримати ідентифікатори контейнера, тоді docker exec -it psql -U -W
Я знаю, що це пізно, якщо ви використовували докер-композицію, наприклад @Martin
Це фрагменти, які допомогли мені підключитися до psql всередині контейнера
docker-compose run db bash
root@de96f9358b70:/# psql -h db -U root -d postgres_db
Я не можу коментувати, оскільки у мене немає 50 репутації. Тож сподіваємось, що це допомагає.