Подтвердить что ты не робот

Подключение к Postgresql в контейнере докеров со стороны

У меня есть Postgresql на сервере в контейнере докеров. Как я могу подключиться к нему со стороны, то есть с моего локального компьютера? Какую настройку я должен применять, чтобы позволить это?

4b9b3361

Ответ 1

Вы можете запустить 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
[email protected]:/# psql -U postgres
postgres-# CREATE DATABASE mytest;
postgres-# \q

Перейдите на ваш локальный хост (где у вас есть какой-либо инструмент или клиент 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 на сервере) с вашего локального хоста.

В этом посте он подробно изложен.

Ответ 2

Мне удалось запустить его на Linux

  • 1 Сначала запустите Docker Postgres, убедитесь, что порт опубликован, я использую Alpine, потому что он легкий.

    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:[email protected]:5432/postgres

для пользователей Mac замените psql на pgcli

Ответ 3

Вы также можете получить доступ с помощью команды docker exec:

$ docker exec -it postgres-container bash

# su postgres

$ psql

Или

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

Ответ 4

Я уже запустил 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

Ответ 5

Для подключения с локального хоста вам необходимо добавить "--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

Ответ 6

Я использую 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.

Ответ 7

Я попытался подключиться с локального хоста (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

Это был мой опыт, которым я хотел поделиться. Возможно, кто-то может использовать это.

Ответ 8

сначала откройте образ докера для postgres

docker exec -it <container_name>

тогда вы получите root - [email protected]:/# ему нужно соединение с базой данных

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

Ответ 9

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

Ответ 10

Почему-то порт 5432 кажется защищенным. Я изменил конфигурацию своего порта с 5432:5432 на 5416:5432 и следующая команда работала для подключения к вашей базе данных postgres из-за пределов его контейнера докера:

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

Ответ 11

Я предполагаю, что вы хотите, чтобы иметь возможность просматривать данные, присутствующие в вашем контейнере каждый раз, когда вы подключаетесь к нему извне. Для этого вам необходимо сохранить данные на изображении 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. Войдите в контейнер_имя в интерактивном режиме
. (Примечание: такие команды, как 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

Ответ 12

В случае, если это серверное приложение django, вы можете сделать что-то вроде этого.

docker exec -it container_id python manage.py dbshell

Ответ 13

docker ps -a, чтобы получить идентификаторы контейнеров Докер Exec -it PSQL -U -W