Підключення до Postgresql в докерному контейнері ззовні


202

У мене є Postgresql на сервері в докерному контейнері. Як я можу підключитися до нього зовні, тобто з мого локального комп'ютера? Яке налаштування потрібно застосувати, щоб дозволити це?


1
яку команду ви використовували для запуску postresql? ви можете відкрити порт і відобразити його
lvthillo

Зверніться до цього dosegnadeem.wordpress.com/2020/06/02/…
craftsmannadeem

Відповіді:


318

Ви можете запустити 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.

У цій публікації вона детально розкрита.


1
@Tjorriemorrie Ви впевнені, що ваші поштові повідомлення працюють на вашій локальній машині? Можливо, спробуйте 127.0.0.1 замість localhost, але для знайомих це працює.
lvthillo

2
Отримайте ваш публічний IP - адреса (OSX):ifconfig -u | grep 'inet ' | grep -v 127.0.0.1 | cut -d\ -f2 | head -1
Пол

5
З усіх різноманітних публікацій, пов’язаних з postgres / docker, я виявив, що це одна з найкорисніших. Дякую.
rg88

1
@GarouDan, якщо ви не хочете картографувати порт, але все ж хочете отримати доступ до контейнера postgres від свого хоста, вам потрібно буде розгорнути контейнер у хост-мережі так:docker run --net=host --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres
lvthillo

1
вихід psql працює з \ q (тільки для новачків, як я)
Дірк Шумахер,

43

Мені вдалося запустити його на Linux

  1. запустіть доскрип докер - переконайтеся, що порт опублікований, я використовую альпійський, оскільки він легкий.

    sudo docker run --rm -P -p 127.0.0.1:5432:5432 -e POSTGRES_PASSWORD="1234" --name pg postgres:alpine

  2. використовуючи інший термінал, отримайте доступ до бази даних від хоста, використовуючи postgres uri

    psql postgresql://postgres:1234@localhost:5432/postgres

для користувачів Mac, замініть psql на pgcli


7
рада, що хтось відповів, як з’єднатись, не стрибнувши в контейнер. thnx.
PabTorre

1
Ви не повинні використовувати sudoконтейнер для запуску.
Russ Bateman

30

Ви також можете отримати доступ через команду docker exec:

$ docker exec -it postgres-container bash

# su postgres

$ psql

Або

$ docker exec -it postgres-container psql -U postgres

3
psql -U postgres
Марина Краснова

ось напрочуд корисний коментар
Dan Rosenstark

Що робить su postgres?
Брено

14

У мене вже було запущено 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
framp

13

Я використовую 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.


1
Я вважаю це найбільш корисним. Для людей, які вживають докер-композицію, це здається найкращим способом.
Девід Фрік

Дякую, Девід, щасливе кодування!
omeraiman

9

Для підключення з 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

6

Я намагався підключитися від 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

Це мій досвід, яким я хотів поділитися. Можливо, хтось може цим скористатися.


3
Об'єм шлях /var/lib/mysql:?
Девід Табернеро М.

5432 - порт за замовчуванням Postgres. 3306 - порт за замовчуванням MySQL. Якщо ви зміните опублікований порт на docker-compose, то будь-які клієнтські інструменти, які ви намагаєтеся використовувати для з'єднання, також за замовчуванням намагаються підключитися до порту 5432, якщо ви не скажете їм використовувати інший порт.
Давос

6

Я припускаю, що ви хочете мати можливість переглядати дані, наявні у вашому контейнері кожного разу, коли ви підключаєтесь до нього ззовні. Для цього вам доведеться зберегти дані на зображенні постгресу.

Якщо у вас немає постійних даних, вам доведеться повторити все, що ви зробили вперше.
Кроки 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


5

Чомусь порт 5432 видається захищеним. Я змінив конфігурацію свого порту з 5432:5432на 5416:5432та наступна команда працювала, щоб підключитися до вашої бази даних postgres поза її контейнера докера :

psql -h localhost -p 5416 -U <my-user> -d <my-database>

Це працює для мене, але я не знайшов пояснення в Інтернеті. Ти знайшов?
негас

2
@negas Ви, ймовірно, вже запускаєте postgresслужбу на своєму хост-машині, яка вже буде прив’язана до localhost: 5432, не дозволяючи вам використовувати її. Зображення іншого хостового порту до порту 5432 за замовчуванням всередині контейнера є хорошим рішенням для цього; Ви також можете зупинити послугу Postgres на своєму хості, але, можливо, вона використовується для чогось необхідного.
Давос

5

спочатку відкрийте зображення докера для постгресів

docker exec -it <container_name>

тоді ви отримаєте корінь - root@868594e88b53:/# йому потрібно підключення до бази даних

psql postgresql://<username>:<databasepassword>@postgres:5432/<database>

1

У випадку, якщо це додаток django, ви можете зробити щось подібне.

docker exec -it container_id python manage.py dbshell

1

Тут є хороші відповіді, але якщо ви хочете мати якийсь інтерфейс для управління базами даних postgres, ви можете встановити pgAdmin на свій локальний комп'ютер і підключитися до віддаленої машини за допомогою свого IP-адреси та порту, що відкривається після пошти (за замовчуванням 5432).



-1

Я знаю, що це пізно, якщо ви використовували докер-композицію, наприклад @Martin

Це фрагменти, які допомогли мені підключитися до psql всередині контейнера

docker-compose run db bash

root@de96f9358b70:/# psql -h db -U root -d postgres_db

Я не можу коментувати, оскільки у мене немає 50 репутації. Тож сподіваємось, що це допомагає.


Оп хоче з'єднатися ззовні.
avizzzy
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.