локальное соединение docker postgres pgadmin


96

Я создал образ ubuntu с nginx, php и postgres.

Я хочу подключить базу данных postgres в моем текущем изображении с pgadminрасположенной на моем локальном компьютере.

Я попытался использовать инспектор докеров, чтобы попытаться использовать ip изображения для подключения к моему локальному pgadmin, но без особого успеха. Я также пробовал настроить некоторые порты на локальном компьютере, чтобы соединение работало.


Вы не говорите, прослушивает ли PostgreSQL внешние подключения (проверьте свои файлы конфигурации) или этот порт кажется открытым с локального компьютера.
Ричард Хакстон,

1
Кажется невозможным ответить на этот вопрос при таком небольшом количестве информации
cthulhu

Ответы:


91

Это правильный вопрос, не знаю, почему люди считают, что «кажется невозможным ответить на этот вопрос».

Итак, вот как я делаю то, что вы пытаетесь сделать:

  1. Извлечь образ postgres из Docker Hub

    docker pull postgres:latest

  2. Запустите контейнер, используя следующую команду

    docker run -p 5432:5432 postgres

  3. Используя команду docker inspect, найдите IP-адрес

  4. Используйте этот IP-адрес, ПОРТ, имя пользователя и пароль для подключения к PGADMIN.

  5. Вы также можете выполнить простой telnet, как показано ниже, чтобы подтвердить, можете ли вы получить доступ к контейнеру docker postgres:

    telnet IP_ADDRESS 5432


16
Если вы публикуете порт с этим, -p 5432:5432вам не нужно искать IP-адрес контейнера, вы можете использовать свой IP-адрес хоста или 127.0.0.1простоlocalhost
Давос,

Цель сообщения действительна, но это не высококачественный пост для SE. Для начала, на самом деле нет никакого «вопроса». Кроме того, нет никаких указаний на то, как они пробовали процесс или ошибки, которые они получили при этом. Тем не менее, я думаю, вы хорошо ответили.
duct_tape_coder

3
Этот ответ мне полезен, поэтому это правильный вопрос.
Тодд

Я использовал -p 5432: 5432 для сопоставления контейнера с моим хостом, но по-прежнему получаю ошибку подключения. Я попытался использовать IPAddress, который получил от проверки докеров, и он работает.
Гинад

49

То, что я сделал успешно на Windows 10 с запущенным докером для Windows 1.12.6 (9655), шаг выглядит следующим образом:

  1. Вытащите последнюю версию postgres

    docker pull postgres:latest

  2. запустите контейнер postgres:

    docker run -d -e POSTGRES_USER=user -e POSTGRES_PASSWORD=password123 --name db-my -p 5432:5432 --restart=always postgres

  3. Затем установил последнюю версию pgAdmin4 с веб-сайта pgadmin

  4. Запустите pgAdmin 4, создайте новый сервер и введите следующий хост: 127.0.0.1 Порт: 5432 Имя пользователя: пароль пользователя: пароль123

  5. Тогда все в порядке, подключаемся к docker postgres instance success.

41

Кроме того , вы можете комбинировать Postgres и Pgadmin в одном docker-composeфайле, а Войти как пользователь pgadmin4@pgadmin.org, PWD: admin. Чтобы добавить сервер Posgres, используйте имя хоста postgres, порт 5432.

version: '3'
services:
  postgres:
    image: postgres
    hostname: postgres
    ports:
      - "6543:5432"
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: TEST_SM
    volumes:
      - postgres-data:/var/lib/postgresql/data
    restart: unless-stopped

  pgadmin:
    image: dpage/pgadmin4
    depends_on:
      - postgres
    ports:
      - "5555:80"
    environment:
      PGADMIN_DEFAULT_EMAIL: pgadmin4@pgadmin.org
      PGADMIN_DEFAULT_PASSWORD: admin
    restart: unless-stopped

volumes:
  postgres-data:

3
Я получаю сообщение «не удалось перевести имя хоста postgres в адрес: имя узла или имя сервера предоставлены или неизвестны».
Энрике Ортис Касильяс

1
не удалось перевести имя хоста "postgres" в адрес: имя не разрешается
прокси

1
если вы docker network ls, вы увидите мост для сети postgres-to-pgadmin (мой - postgres_postgres). Затем вы можете docker network inspect postgres_postgresувидеть два контейнера, каждый с IP / именем хоста. Возьмите тот из Postgres (мой postgres_db_1), чтобы успешно подключиться из pgAdmin.
Ноль

25

Это то, что я сделал

для postgres

docker run -p 5432:5432  --name container-postgresdb -e POSTGRES_PASSWORD=admin -d postgres

для pgadmin

docker run -p 5050:80  -e "PGADMIN_DEFAULT_EMAIL=name@example.com" -e "PGADMIN_DEFAULT_PASSWORD=admin"  -d dpage/pgadmin4

Строка подключения для pgadmin

host: host.docker.internal
database: postgres
user: postgres
password: admin

Работает нормально !!!!!


5
Unable to connect to server: could not translate host name "host.docker.internal" to address: Try again
duct_tape_coder

2
Я также использовал этот подход для создания как postgres, так и pgAdmin в докере. Для меня в качестве входного значения сработал ответ от @SolidSnake - stackoverflow.com/a/58224344/4288961 > docker inspect CONTAINER_ID | grep IPAddress. и использовал
полученный

Потрясающие!. Очень полезно. Мне нужно было только значение host.docker.internal
Эрнан Акоста,

19

В моем случае я мог бы решить проблему, проверяя мое изображение postgre с помощью команды

docker inspect CONTAINER_ID  | grep IPAddress.

Итак, я использовал IP-адрес докера для настройки подключения к pgadmin 4, и все было в порядке. Спасибо @Afshin Ghazi


У меня это работает.
Калпеш Тавде,

17

Если pgAdmin предназначен для запуска с тем же хостом / гостем Ubuntu, вам необходимо связать контейнер postgres, чтобы его можно было разрешить по имени.

1. Запустите контейнер postgres:

docker run --name some-postgres -e POSTGRES_PASSWORD=postgres -d postgres

2. Запустите контейнер pgAdmin:

docker run -p 80:80 --link some-postgres -e "PGADMIN_DEFAULT_EMAIL=email@domain.com" -e "PGADMIN_DEFAULT_PASSWORD=postgres" -d dpage/pgadmin4

3. Теперь при добавлении нового сервера в веб-приложение phAdmin используйте в some-postgresкачестве имени сервера

Обратите внимание на то, что --link some-postgresкогда мы поднимали файл pgAdmin. Эта команда делает контейнер postgres видимым для контейнера pgAdmin.


1
Я могу подключиться с помощью psq к серверу и войти в интерфейс pgadmin. Но какую сеть / порт я использую при подключении к серверу postgres через интерфейс pgadmin?
Tom

1
Стоит отметить в документации Docker ( docs.docker.com/network/links ). Warning: The --link flag is a legacy feature of Docker. It may eventually be removed. Unless you absolutely need to continue using it, we recommend that you use user-defined networks to facilitate communication between two containers instead of using --link.Мне также не повезло с использованием, --linkчтобы заставить мой контейнер pgadmin общаться с моим контейнером postgres. Однако я могу получить доступ к postgres из локальной установки pgadmin.
duct_tape_coder

11

Я включил это в файл docker yaml, чтобы получить базу данных и pgAdmin:

database:
    image: postgres:10.4-alpine
    container_name: kafka-nodejs-example-database
    environment:
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    expose:
      - "5432"
    ports:
      - 8000:5432
    volumes:
      - ./services/database/schema.sql:/docker-entrypoint-initdb.d/1-schema.sql
      - ./services/database/seed.sql:/docker-entrypoint-initdb.d/2-seed.sql
  pgadmin:
    image: dpage/pgadmin4
    ports:
      - 5454:5454/tcp
    environment:
      - PGADMIN_DEFAULT_EMAIL=admin@mydomain.com
      - PGADMIN_DEFAULT_PASSWORD=postgres
      - PGADMIN_LISTEN_PORT=5454

Имя пользователя postgres - alphaone, пароль - xxxxxxxxxxx.

Сделайте, docker psчтобы получить идентификатор контейнера, а затемdocker inspect <dockerContainerId> | grep IPAddress

например: docker inspect 2f50fabe8a87 | grep IPAddress

Вставьте IP-адрес в pgAdmin и учетные данные базы данных, используемые в докере:

pgAdmin


1
Это помогло. Мне пришлось найти правильный IP-адрес из контейнера, связанного с докером Postgres, чтобы добавить в конфигурацию сервера на портале Docker PgAdmin, как показано выше. Выложить localhostне получилось.
Эндрю

5

В моем случае у меня был контейнер PostgreSQL, поэтому я не менял свой контейнер и не создавал подход docker-compose, мне понадобилось pgadming через несколько месяцев, чтобы установить PostgreSQL, так что это мой подход:

  1. docker inspect my_container_id_postgreSQL
  2. Сеть, назначенная PostgreSQL, была:

    "Сети": {"docker_default": {"IPAddress": "172.18.0.2", ...}}

  3. Запустил мой PGADMIN с --network командой.

    docker run -p 85:80 --network docker_default -e 'PGADMIN_DEFAULT_EMAIL=user@domain.com' -e 'PGADMIN_DEFAULT_PASSWORD = SuperSecret' -d dpage / pgadmin4

  4. Вставьте IP-адрес в pgAdmin и учетные данные базы данных, используемые в докере.

Надеюсь, это может быть кому-то полезно. С уважением.



4

Вы должны открыть порт postgres в контейнере для вашей локальной системы. Вы делаете это, запустив свой контейнер следующим образом:

docker run -p 5432:5432 <name/id of container>

при подключении к вашему GUI-клиенту или CLI убедитесь, что вы используете IP-адрес, а не localhost, даже если ваш IP-адрес является IP-адресом localhost.

docker ps предоставит вам IP-адрес, на котором находится ваш контейнер postgres.


4

Если вы убедились, что PostgreSQL запущен, и вы можете подключиться к нему с помощью локальной копии PgAdmin ...

Ответ прост: используйте host.docker.internalвместо localhostPgAdmin, работающий внутри Docker.

используйте <code> host.docker.internal </code> вместо <code> localhost </code>


2

Для этого вы также можете создать сеть моста Docker.

$ docker network create pgnet
a0ae44aaf6f806fc37302e4c603b4828c4edb8d487fd9cd90e2fb19ae1d5c65f

$ docker run --detach \
    --name pg \
    --network pgnet \
    --publish 5432:5432 \
    --restart always \
    --env POSTGRES_PASSWORD=pg123 \
    --volume ${PWD}/data:/var/lib/postgresql/data \
    postgres:12.1
b60611e43727dabe483c1f08fdf74961b886ce05b432a10a0625bd1b6db87899

$ docker run --detach \
    --name pgadm \
    --network pgnet \
    --publish 8000:80 \
    --volume ${PWD}/pgadmin:/var/lib/pgadmin \
    --env PGADMIN_DEFAULT_EMAIL=user@domain.com \
    --env PGADMIN_DEFAULT_PASSWORD=pgadm123 \
    dpage/pgadmin4:4.20
27f9ce1c1c4c383ee1507f4e2d88f6ef33d4fcf5b209a8a03b87519f90d56312

Откройте http: // localhost: 8000 /

  1. Нажмите Добавить новый сервер
  2. Создать - Сервер
    1. Имя: db
    2. Имя хоста / адрес: pg
    3. Имя пользователя: postgres
    4. Пароль: pg123
  3. Сохранить

Имя хоста / адрес, использованные выше, - это имя контейнера Postgres, указанное --name pg


Это уникальный подход, в котором в качестве имени хоста используется имя контейнера. Тот же подход, что и настройка Nginx или что-то в этом роде. Имеет смысл.
Шон Маккарти,

2

После того, как я столкнулся с этой проблемой в течение двух дней, я смог решить эту проблему.

на решение этой проблемы уже ответили люди вроде

docker inspect CONTAINER_ID

но во время выполнения этой команды у меня было много журналов, таких как Host Config Config Network Settings и т.д., поэтому я запутался, какой IP-адрес добавить в соединение pgAdmin, потому что я пробовал 0.0.0.0 и config, host, networkSettings разные -2 IPAddress в журналы, но, наконец, он работает после долгих попыток.

он работает с каким IP-адресом, мы должны добавить этот сетевой IP-адрес (который мы создали для подключения postgres и pgAdmin .)

как в моем случае, когда я бегу: -

докер проверяет postgres_container

 "NetworkSettings": {
        "Bridge": "",
        "SandboxID": "sdffsffsfsfsfsf123232e2r3pru3ouoyoyuosyvo8769696796",
        "HairpinMode": false,
        "LinkLocalIPv6Address": "",
        "LinkLocalIPv6PrefixLen": 0,
        "Ports": {
            "5432/tcp": [
                {
                    "HostIp": "0.0.0.0",
                    "HostPort": "5432"
                }
            ]
        },
        "SandboxKey": "/var/run/docker/231231Ad132",
        "SecondaryIPAddresses": null,
        "SecondaryIPv6Addresses": null,
        "EndpointID": "",
        "Gateway": "",
        "GlobalIPv6Address": "",
        "GlobalIPv6PrefixLen": 0,
        "IPAddress": "",
        "IPPrefixLen": 0,
        "IPv6Gateway": "",
        "MacAddress": "",
        "Networks": {
            "postgres": {
                "IPAMConfig": null,
                "Links": null,
                "Aliases": [
                    "postgres",
                    "0e2j3bn2m42"
                ],
                "NetworkID": "35rhlhl3l53l5hlh3523233k3k4k22l3hk2k4",
                "EndpointID":"b3424n43k52o2i4n235k1k4l2l4hj234f14n2",
                "Gateway": "192.168.16.1",
                "IPAddress": "192.168.16.2",
                "IPPrefixLen": 20,
                "IPv6Gateway": "",

поэтому мы должны добавить NetworkSettings -> Network -> Postgres (моя созданная сеть) -> IPAddress, т.е. «IPAddress»: «192.168.16.2».

После добавления этого ip он заработает.

Надеюсь, это поможет.


1

Чтобы найти правильный IP-адрес для вашего контейнера, выполните следующие команды:

Проверить ID контейнера:

docker ps

Чтобы проверить правильный IP-адрес вашего контейнера:

docker inspect <ID_CONTAINER> | grep "IPAddress"

Конфигурация как PostgreSQL, так и PgAdmin с Docker проста, если не правильно, я рекомендую переделать конфигурацию с нуля, если ваша проблема глубже.

Вот сценарий, который я разработал для решения этой проблемы. скрипт-ш / установка-докер-постгрес-и-pgadmin


1

Для macOS IP-адреса postgresи pgadmin4отличаются от docker inspectпредоставленных. Тип

docker-machine ls

Взгляните на имя сервера слева. Это defaultпо умолчанию.

docker-machine ip defaultбудет IP вам нужно использовать для обоих , pgadmin4в браузере и postgresв pgadmin4настройках.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.