локальне підключення -


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's inspect знайдіть IP

  4. Використовуйте цей IP, PORT, ім’я користувача та пароль для підключення в PGADMIN

  5. Ви також можете зробити простий telnet, як показано нижче, щоб підтвердити, чи можете ви отримати доступ до контейнера postcker 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, який я отримав від перевірки докера, і він працює.
ginad

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.

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 / host. Візьміть той із Postgres (мій postgres_db_1), щоб успішно підключитися від pgAdmin.
Ніл

26

Це те, що я зробив

для 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 у docker. Те , що працювало для мене в якості значення вхідного була відповідь від @SolidSnake - stackoverflow.com/a/58224344/4288961 > докер інспектувати CONTAINER_ID | grep IPAddress. і використовував цю IP-адресу результату як хост
Prusdrum

Чудово !. Дуже корисний. Мені потрібне було лише значення '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?
Том

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.

Зробіть a, docker psщоб отримати ідентифікатор контейнера, а потімdocker inspect <dockerContainerId> | grep IPAddress

наприклад: docker inspect 2f50fabe8a87 | grep IPAddress

Вставте Ip-адресу в pgAdmin та облікові дані бази даних, що використовуються в docker:

pgAdmin


1
Це допомогло. Мені довелося зігріти правильну IP-адресу з контейнера, пов'язаного з docker Postgres, щоб додати до конфігурації сервера на порталі docker PgAdmin, як показано вище. Покладання localhostне спрацювало.
Ендрю Лоббан,

5

У моєму випадку у мене був контейнер PostgreSQL, тому я не міняв свій контейнер і не створював підхід до компонування докера, мені потрібно було 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 --net docker_default -e 'PGADMIN_DEFAULT_EMAIL=user@domain.com' -e 'PGADMIN_DEFAULT_PASSWORD = SuperSecret' -d dpage / pgadmin4

  4. Вставте Ip-адресу в pgAdmin та облікові дані бази даних, що використовуються в Docker.

Я сподіваюся, це може бути для когось корисним. З повагою.



4

Вам потрібно відкрити порт postgres у контейнері для вашої локальної системи. Ви робите це, запускаючи контейнер так:

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

під час з’єднання з вашим клієнтом графічного інтерфейсу або CLI обов’язково використовуйте ip-адресу, а не localhost, навіть якщо ваша ip-адреса є ip-адресою localhost.

docker ps дасть вам ip-адресу, на якій увімкнено ваш контейнер postgres.


4

Якщо ви переконались, що PostgreSQL запущений, і ви можете зв’язати там локальну копію PgAdmin ...

Відповідь проста: використовуйте host.docker.internalistead of localhostдля PgAdmin, що працює всередині Docker

використовуйте <code> host.docker.internal </code> istead <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. Ім'я / адреса хосту: стор
    3. Ім'я користувача: postgres
    4. Пароль: pg123
  3. Зберегти

Назва хосту / адреса, яка використовується вище, - це назва контейнера Postgres, вказана --name pg


Це унікальний підхід, що використовує ім’я контейнера як ім’я хосту. Той самий підхід, як налаштування Nginx чи щось інше. Має сенс.
Шон Маккарті

2

Зіткнувшись із цією проблемою протягом двох днів, я зміг вирішити цю проблему.

На вирішення цієї проблеми вже відповідають люди, як-от перевірити

docker inspect CONTAINER_ID

але під час запуску цієї команди я отримав багато журналів, таких як Host Config Config Network Settings тощо, тому я заплутався, який IPAddress додати до з'єднання 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 для вашого контейнера, виконайте такі команди:

Перевірте ідентифікатор контейнера:

docker ps

Щоб перевірити правильність IP вашого контейнера:

docker inspect <ID_CONTAINER> | grep "IPAddress"

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

Ось сценарій, який я розробив для вирішення цієї проблеми. script-sh / install-docker-postgres-and-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.