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

233

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

Соджо
источник
1
какую команду вы использовали для запуска postresql? вы можете открыть порт и сопоставить его
lvthillo 08
Смотрите этот reachmnadeem.wordpress.com/2020/06/02/...
craftsmannadeem

Ответы:

347

Вы можете запустить 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 подробно.

lvthillo
источник
1
@Tjorriemorrie Вы уверены, что ваш postgres работает на вашем локальном компьютере? Возможно, попробуйте 127.0.0.1 вместо localhost, но для встречи он работает.
lvthillo
2
Получите свой общедоступный IP-адрес (osx):ifconfig -u | grep 'inet ' | grep -v 127.0.0.1 | cut -d\ -f2 | head -1
Пол
6
Из всех постов, связанных с postgres / docker, я обнаружил, что это один из самых полезных. Спасибо.
rg88
1
@GarouDan, если вы не хотите отображать порт, но все же хотите получить доступ к контейнеру postgres со своего хоста, вам нужно развернуть свой контейнер в сети хоста следующим образом:docker run --net=host --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres
lvthillo
2
выход из psql работает с \ q (только для новичков вроде меня)
Дирк Шумахер
60

Мне удалось запустить его на 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:1234@localhost:5432/postgres

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

Томас Уэббер
источник
9
рад что кто-то ответил как подключиться не прыгая в контейнер. thnx.
PabTorre
3
Вам действительно не следует использовать sudoдля запуска вашего контейнера.
Расс Бейтман
39

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

$ docker exec -it postgres-container bash

# su postgres

$ psql

Или

$ docker exec -it postgres-container psql -U postgres
Сверхновая звезда
источник
3
psql -U postgres
Марина Краснова
это на удивление полезный комментарий
Дэн Розенстарк
Что su postgresделать?
Брено
1
@Breno su postgresозначает: переключить пользователя на пользователя postgres.
vab2048
15

У меня уже был запущен 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
15

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

омерайман
источник
1
Я нашел это самым полезным. Для людей, использующих docker-compose, это кажется лучшим выходом.
Дэвид Фрик,
Спасибо, Дэвид, удачного кодирования!
омерайман
13

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


источник
11

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

Я знаю, что это поздно, если вы использовали docker-compose, например @Martin

Это фрагменты, которые помогли мне подключиться к psql внутри контейнера.

docker-compose run db bash

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

Я не могу комментировать, потому что у меня нет 50 репутации. Надеюсь, это поможет.

Ришаб Ананд
источник
Оп хочет подключиться извне.
avizzzy,
@avizzzy, это просто альтернатива тому, что сказал Ашутош Гупта. stackoverflow.com/a/54865728/10422291 Должен был там прокомментировать. Не то чтобы я заботился, но должен быть последовательным в жизни, верно?
Ришаб Ананд,
1
@RishabhAnand ну а теперь будешь :)
6

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

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

Мартин
источник
3
Путь к тому /var/lib/mysql:?
Дэвид Табернеро М.
5432 - порт по умолчанию для Postgres. 3306 - порт MySQL по умолчанию. Если вы измените опубликованный порт в docker-compose, тогда любые клиентские инструменты, которые вы пытаетесь использовать для подключения, также будут по умолчанию пытаться подключиться к порту 5432, если вы не скажете им использовать другой порт.
Давос
5

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

psql -h localhost -p 5416 -U <my-user> -d <my-database>
Марк Перрен-Пеллетье
источник
У меня это работает, но я не нашел объяснения в Интернете. Вы нашли?
negas
2
@negas Вы, вероятно, уже запускаете postgresслужбу на своем хост-компьютере, который уже привязан к localhost: 5432, что не позволяет вам ее использовать. Сопоставление другого порта хоста с портом по умолчанию 5432 внутри контейнера - хорошее решение; в качестве альтернативы вы можете остановить службу postgres на своем хосте, но, возможно, она используется для чего-то, что вам нужно.
Давос
5

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

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-адрес и открытый порт postgres (по умолчанию 5432).

CageE
источник
0

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

Афшин Гази
источник