Ostatnio bawiłem się Dockerem i QGIS i zainstalowałem kontener postępując zgodnie z instrukcjami zawartymi w tym samouczku .
Wszystko działa świetnie, chociaż nie mogę połączyć się z bazą danych postgres localhost, która zawiera wszystkie moje dane GIS. Wydaje mi się, że dzieje się tak, ponieważ moja baza danych Postgres nie jest skonfigurowana do akceptowania połączeń zdalnych i edytuję pliki conf postgres, aby umożliwić połączenia zdalne, korzystając z instrukcji zawartych w tym artykule .
Nadal otrzymuję komunikat o błędzie, gdy próbuję połączyć się z moją bazą danych z uruchomionym QGIS w Dockerze: nie można połączyć się z serwerem: Connection refused Is the server running on host "localhost" (::1) and accepting TCP/IP connections to port 5433?
serwer postgres jest uruchomiony i zmodyfikowałem mój plik pg_hba.conf , aby umożliwić połączenia z zakresu Adresy IP (172.17.0.0/32). Wcześniej odpytywałem o adres IP kontenera docker za pomocą docker ps
i chociaż adres IP się zmienia, do tej pory zawsze znajdował się w zakresie 172.17.0.x
Jakieś pomysły, dlaczego nie mogę połączyć się z tą bazą danych? Prawdopodobnie coś bardzo prostego, jak sobie wyobrażam!
Używam Ubuntu 14.04; Postgres 9.3
źródło
pg_hba.conf
na adres, który zasugerowałeś, ale nadal otrzymuję ten sam komunikat o błędzie połączenia po zatrzymaniu i ponownym uruchomieniu usługi postgres. Dodałem linię pod moimi połączeniami ipv4 - czy jest gdzieś jeszcze, gdzie mam dodać sugerowany adres? Alternatywnie, czy w mojej aplikacji QGIS działającej w Dockerze muszę zmienić informacje o połączeniu postgres? Na przykład, jeśli łączę się z kontenera Dockera, czy host nadal jest „localhost”?localhost
to nie jest system hosta w kontenerze Docker. Spróbuj połączyć się z publicznym adresem IP hosta. Aby zachować przenośność kontenera, możesz również uruchomić kontener za pomocą--add-host=database:<host-ip>
i po prostu użyćdatabase
jako nazwy hosta, aby połączyć się z hostem PostgreSQL z poziomu kontenera Docker./etc/postgresql/9.3/main/postgresql.conf
i dodaćeth0
adres IP mojego serwera dolisten_addresses
. Domyślnielisten_addresses
ma powiązanielocalhost
tylko z postgres .host-ip
to adres IP maszyny wirtualnej lub kontenera Dockera?Rozwiązanie Docker dla komputerów Mac
17.06 i później
Dzięki komentarzowi @Birchlabs, teraz jest dużo łatwiej dzięki tej specjalnej nazwie DNS tylko dla komputerów Mac :
Od 17.12.0-cd-mac46,
docker.for.mac.host.internal
powinno być używane zamiastdocker.for.mac.localhost
. Szczegółowe informacje można znaleźć w informacji o wersji.Starsza wersja
Odpowiedź @ helmberta dobrze wyjaśnia problem. Ale Docker na Maca nie ujawnia sieci mostkowej , więc musiałem zrobić tę sztuczkę, aby obejść ograniczenie:
Otwórz
/usr/local/var/postgres/pg_hba.conf
i dodaj tę linię:Otwórz
/usr/local/var/postgres/postgresql.conf
i edytuj zmianęlisten_addresses
:Załaduj ponownie usługę i uruchom kontener:
To obejście jest zasadniczo takie samo, jak odpowiedź @ helmbert, ale używa adresu IP, do którego jest dołączony
lo0
zamiastdocker0
interfejsu sieciowego.źródło
docker.for.mac.localhost
. to jest adres IP twojego komputera głównego. wyszukaj jego wpis w bazie danych hostów kontenera w następujący sposób:docker run alpine /bin/sh -c 'getent hosts docker.for.mac.localhost'
host.docker.internal
od 18.03, inne opcje są nadal dostępne, ale są przestarzałe ( źródło ).Proste rozwiązanie dla komputerów Mac:
Najnowsza wersja dockera (18.03) oferuje wbudowane rozwiązanie do przekazywania portów. Wewnątrz kontenera docker po prostu ustaw host db na
host.docker.internal
. Zostanie to przekazane do hosta, na którym działa kontener Dockera.Dokumentacja na ten temat jest tutaj: https://docs.docker.com/docker-for-mac/networking/#i-want-to-connect-from-a-container-to-a-service-on-the-host
źródło
host.docker.internal
ograniczony tylko do komputerów Mac?Proste rozwiązanie
Po prostu dodaj
--network=host
dodocker run
. To wszystko!W ten sposób kontener będzie korzystał z sieci hosta,
localhost
a więc i127.0.0.1
wskaże hosta (domyślnie wskazuje kontener). Przykład:źródło
W Ubuntu:
Najpierw musisz sprawdzić, czy port bazy danych Docker jest dostępny w twoim systemie, wykonując polecenie -
Przykładowe WYJŚCIE:
Tutaj
3306
jest używany jako port bazy danych Docker na adresie IP 172.17.0.2, jeśli ten port nie jest dostępny Uruchom następujące polecenie -Teraz możesz łatwo uzyskać dostęp do bazy danych Docker z systemu lokalnego, wykonując konfigurację
W CentOS:
Najpierw musisz sprawdzić, czy port bazy danych Docker jest dostępny w zaporze, wykonując polecenie -
Przykładowe WYJŚCIE:
Tutaj
3307
jest używany jako port bazy danych Docker na adresie IP 172.17.0.2, jeśli ten port nie jest dostępny Uruchom następujące polecenie -Na serwerze możesz dodać port na stałe
Teraz możesz łatwo uzyskać dostęp do bazy danych Docker z systemu lokalnego dzięki powyższej konfiguracji.
źródło
Przedstawione tutaj rozwiązanie nie działa dla mnie. Dlatego zamieszczam tę odpowiedź, aby pomóc komuś, kto ma podobny problem.
System operacyjny: Ubuntu 18
PostgreSQL: 9.5 (hostowany na Ubuntu)
Docker: Aplikacja serwerowa (która łączy się z PostgreSQL)
Do tworzenia aplikacji używam docker-compose.yml.
KROK 1: Dodaj
host.docker.internal:<docker0 IP>
Aby znaleźć adres IP dockera
i.e. 172.17.0.1 (in my case)
, możesz użyć:LUB
KROK 2: W postgresql.conf zmień Listen_addresses na
listen_addresses = '*'
KROK 3: W pg_hba.conf dodaj tę linię
KROK 4: Teraz zrestartuj usługę postgresql używając,
sudo service postgresql restart
KROK 5: Użyj
host.docker.internal
nazwy hosta do połączenia bazy danych z aplikacji serwera.Dawny:
jdbc:postgresql://host.docker.internal:5432/bankDB
Cieszyć się!!
źródło
dla docker-compose możesz spróbować po prostu dodać
przykład:
https://docs.docker.com/compose/compose-file/#network_mode
źródło
Aby skonfigurować coś prostego, co pozwala na połączenie Postgresql z kontenera dockera do mojego lokalnego hosta, użyłem tego w postgresql.conf:
I dodał ten pg_hba.conf:
Następnie uruchom ponownie. Mój klient z kontenera docker (który był pod adresem 172.17.0.2) mógł wtedy połączyć się z Postgresql działającym na moim lokalnym hoście przy użyciu hosta: hasła, bazy danych, nazwy użytkownika i hasła.
źródło
Jeszcze jedna rzecz potrzebna do mojej konfiguracji to dodanie
do
/etc/hosts
tak, że Docker wskazywałby
172.17.0.1
jako nazwę hosta DB i nie polegał na zmieniającym się zewnętrznym adresie IP w celu znalezienia DB. Mam nadzieję, że pomoże to komuś innemu w rozwiązaniu tego problemu!źródło
database
hosta--add-host=database:172.17.0.1
przy uruchomieniu kontenera. Następnie skieruj swoją aplikację do tego hosta. Pozwala to uniknąć zakodowania adresu IP na stałe w kontenerze.--add-host=database:172.17.0.1
jest lepszeInnym rozwiązaniem jest wolumen usług. Możesz zdefiniować wolumen usługi i zamontować w nim katalog danych PostgreSQL hosta. Sprawdź podany plik tworzenia, aby uzyskać szczegółowe informacje.
W ten sposób inna usługa PostgreSQL będzie działać w kontenerze, ale używa tego samego katalogu danych, którego używa usługa hosta PostgreSQL.
źródło