Подключение к Postgresql в Docker-контейнере извне

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


person Sojo    schedule 08.06.2016    source источник
comment
какую команду вы использовали для запуска postresql? вы можете открыть порт и сопоставить его   -  person lvthillo    schedule 08.06.2016
comment
Обратитесь к этому seekmnadeem.wordpress.com/2020/06/02/   -  person craftsmannadeem    schedule 02.06.2020


Ответы (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   

Итак, вы получаете доступ к базе данных (которая работает в докере на сервере) с вашего локального хоста.

В этом сообщении он раскрыт в деталь.

person lvthillo    schedule 08.06.2016
comment
@Tjorriemorrie Вы уверены, что ваш postgres работает на вашем локальном компьютере? Возможно, попробуйте 127.0.0.1 вместо localhost, но для встречи он работает. - person lvthillo; 24.02.2017
comment
Получите свой общедоступный IP-адрес (osx): ifconfig -u | grep 'inet ' | grep -v 127.0.0.1 | cut -d\ -f2 | head -1 - person Paul; 27.08.2017
comment
Из всех сообщений, связанных с postgres / docker, я обнаружил, что это один из самых полезных. Спасибо. - person rg88; 12.04.2018
comment
Можно ли подключиться к postgres через докер без сопоставления локального порта? Например, что-то вроде: psql -h some-internal-docker-host -p 5432 -U postgres? - person GarouDan; 26.05.2018
comment
@GarouDan, если вы не хотите отображать порт, но все же хотите получить доступ к контейнеру postgres со своего хоста, вам нужно развернуть свой контейнер в сети хоста следующим образом: docker run --net=host --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres - person lvthillo; 27.05.2018
comment
docker exec -it 05b3a3471f6f bash @lvthillo в этой строке, не нужно писать здесь SHA, вы можете заменить его как some-postgres, потому что контейнер назван из приведенной выше команды - person Aragami1408; 25.06.2019
comment
выход из psql работает с \ q (только для новичков вроде меня) - person Dirk Schumacher; 18.07.2019
comment
Если у вас Mac, вы можете заменить его на psql -h docker.for.mac.localhost -p 5432 -U postgres. Оба эти варианта работают - person Raphaël; 21.01.2021
comment
Но это доступ с локального хоста с точки зрения контейнера. Другими словами, вы находитесь внутри контейнера и получаете доступ к базе данных. Хорошо, это полезно, но как подключиться из внешнего контейнера? - person filosofisto; 21.03.2021

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

  1. запустите docker postgres - убедитесь, что порт опубликован, я использую alpine, потому что он легкий.

    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

person Thomas Webber    schedule 04.08.2018
comment
Рад, что кто-то ответил, как подключиться, не прыгая в контейнер. спасибо - person PabTorre; 28.08.2018
comment
Вам действительно не следует использовать sudo для запуска вашего контейнера. - person Russ Bateman; 07.02.2019
comment
@RussBateman - Почему? - person Anonymous Person; 14.02.2021

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

$ docker exec -it postgres-container bash

# su postgres

$ psql

Or

$ docker exec -it postgres-container psql -U postgres
person SuperNova    schedule 30.01.2018
comment
psql -U postgres - person Maryna Krasnova; 01.11.2018
comment
Что делает su postgres? - person Breno; 21.05.2020
comment
@Breno su postgres означает: переключить пользователя на пользователя postgres. - person vab2048; 21.07.2020
comment
РАБОТАЕТ потрясающе. Сначала вам нужно получить идентификатор контейнера для вашего docker postgress, использовать команду docker ps -a, затем использовать continerID с помощью этой команды: docker exec -it container_ID psql -U postgres - person MMEL; 17.12.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.

person omeraiman    schedule 20.03.2019
comment
Я нашел это самым полезным. Для людей, использующих docker-compose, это кажется лучшим выходом. - person David Frick; 03.04.2020

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

person Community    schedule 08.10.2019
comment
Я точно следил за этим, но когда я ввожу данные в dbeaver, он говорит, что тестовая база данных не существует - person J Hubbard; 10.02.2021

У меня уже был запущен 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
person Eugene    schedule 05.06.2017
comment
если вы хотите создать единую базу данных по умолчанию, вы также можете добавить: -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 репутации. Надеюсь, это поможет.

person Rishabh Anand    schedule 11.05.2020
comment
Оп хочет подключиться извне. - person avizzzy; 04.06.2020
comment
@avizzzy, это просто альтернатива тому, что сказал Ашутош Гупта, stackoverflow.com/a/54865728/10422291 Должен был там прокомментировать тоже. Не то чтобы я заботился, но должен быть последовательным в жизни, верно? - person Rishabh Anand; 02.08.2020
comment
@RishabhAn, и теперь ты будешь :) - person ; 06.08.2020

Чтобы подключиться с локального хоста, вам нужно добавить --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
person user2627846    schedule 31.01.2019

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

psql -h localhost -p 5416 -U <my-user> -d <my-database>
person Marc Perrin-Pelletier    schedule 30.04.2019
comment
У меня это работает, но я не нашел объяснения в Интернете. Вы нашли? - person negas; 12.09.2019
comment
@negas Вы, вероятно, уже используете службу 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

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

person Martin    schedule 18.12.2018
comment
Путь к тому: /var/lib/mysql? - person David Tabernero M.; 23.06.2019
comment
5432 - порт по умолчанию для Postgres. 3306 - порт MySQL по умолчанию. Если вы измените опубликованный порт в docker-compose, то любые клиентские инструменты, которые вы пытаетесь использовать для подключения, также будут по умолчанию пытаться подключиться к порту 5432, если вы не укажете им использовать другой порт. - person Davos; 20.11.2019

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

docker exec -it <container_name>

тогда вы получите корень --_ 2_ ему нужно соединение с базой данных

psql postgresql://<username>:<databasepassword>@postgres:5432/<database>
person ashutosh gupta    schedule 25.02.2019

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

docker exec -it container_id python manage.py dbshell
person SuperNova    schedule 26.05.2018

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

person CageE    schedule 16.01.2019

После создания моего приложения-шлюз-микросервис у меня возникла та же проблема. Не могу подключиться к 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

person yuriyni.com    schedule 20.05.2021
comment
Хотя эта ссылка может дать ответ на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если ссылка на страницу изменится. - Из отзыва - person Robert; 20.05.2021

docker ps -a, чтобы получить идентификаторы контейнеров, затем docker exec -it psql -U -W

person Afshin Ghazi    schedule 30.08.2019

Это сработало для меня:

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
person Joel Mata    schedule 07.01.2021