PostgreSQL и pgAdmin работают в контейнерах Docker и соединяются - PullRequest
0 голосов
/ 10 мая 2019

Я пытаюсь запустить PostgreSQL и pgAdmin в контейнерах Docker. Идея состоит в том, что база данных PostgreSQL должна быть доступна для любых приложений, которые я запускаю на хост-машине, а также для pgAdmin.

Я использую эту команду для запуска PostgreSQL:

docker run -d -e POSTGRES_USER=username -e POSTGRES_PASSWORD=password --name postgres -p 5432:5432 postgres

И запустить pgAdmin :

docker run -d -p 1111:1111 --name pgadmin -e "PGADMIN_LISTEN_PORT=1111" -e "PGADMIN_DEFAULT_EMAIL=admin@test.com" -e "PGADMIN_DEFAULT_PASSWORD=test" dpage/pgadmin4

Если я зайду на localhost:1111, я могу подключиться к pgAdmin и войти в систему. Однако, когда я пытаюсь подключиться к моему локальному экземпляру PostgreSQL, он не получает ответа.

Поэтому я попытался запустить pgAdmin с доступом к главному Интернету, используя --net=host вместо -p 1111:1111:

docker run -d --net=host --name pgadmin -e "PGADMIN_LISTEN_PORT=1111" -e "PGADMIN_DEFAULT_EMAIL=admin@test.com" -e "PGADMIN_DEFAULT_PASSWORD=test" dpage/pgadmin4

Теперь, когда я пытаюсь перейти на localhost:1111 для подключения к pgAdmin, я не получаю ответа в своем браузере.

Docker Compose является возможным решением, так как я мог бы связать два контейнера вместе, чтобы они могли обращаться друг к другу, не беспокоясь о портах, но мне также нужен pgAdmin, чтобы иметь возможность доступа к экземплярам PostgreSQL на других машинах, а также мой местный.

Я чувствую, что --net=host сломан в Docker. Здесь целая нить здесь с большим количеством путаницы.

Моя настройка:

Host: Windows 10
Docker: Docker Desktop Community v2.0.0.3 (31259)

Обновление

Я сейчас попытался использовать --link postgres в контейнере pgAdmin, и это позволяет мне подключаться к моему локальному экземпляру PostgreSQL, но не к нелокальным, полная команда:

docker run -d -p 1111:1111 --link postgres --name pgadmin -e "PGADMIN_LISTEN_PORT=1111" -e "PGADMIN_DEFAULT_EMAIL=admin@test.com" -e "PGADMIN_DEFAULT_PASSWORD=test" dpage/pgadmin4

Ответы [ 2 ]

0 голосов
/ 15 мая 2019

Команды не ошиблись, только соединение в pgAdmin, поэтому полный список команд:


Для PostgreSQL:

docker run -d -e POSTGRES_USER=username -e POSTGRES_PASSWORD=password --name postgres -p 5432:5432 postgres

И pgAdmin:

docker run -d -p 1111:1111 --name pgadmin -e "PGADMIN_LISTEN_PORT=1111" -e "PGADMIN_DEFAULT_EMAIL=admin@test.com" -e "PGADMIN_DEFAULT_PASSWORD=test" dpage/pgadmin4

Теперь контейнер pgAdmin не будет подключаться к localhost, но ему необходим IP-адрес контейнера PostgreSQL.Выполнение:

docker inspect postgres

Проверка результата:

[
    {
        ...
        "NetworkSettings": {
            ...
            "Networks": {
                ...
                "IPAddress": "172.17.0.3",
                ...
            }
        }
    }
]

Нас интересует только IPAddress из команды inspect.Это IP-адрес, к которому должен подключаться pgAdmin.

pgAdmin также может получать доступ к внешним IP-адресам с вашего компьютера.

0 голосов
/ 10 мая 2019

Когда вы создаете Docker-контейнеры, он создает мостовую сеть.Сначала найдите диапазон сети для сети моста.Вы можете использовать ifconfig, чтобы найти его.Допустим, 172.17.0.5 - это ip из pgAdmin, затем создайте пользователя 'root'@'172.17.0.5' для PostgreSQL и предоставьте разрешения для базы данных для этого пользователя.Затем вы можете подключиться к базе данных.Также проверьте, доступен ли порт 3306 с помощью telnet.

...