2016-03-10 10 views
12

Próbuję użyć kontenera Docker do uruchomienia serwera PostgreSQL i połączyć się z nim z komputera hosta.Kontener dokowania dla PostgreSQL 9.1 bez wystawiania portu 5432 na hosta

Moja konfiguracja to: ekspres

  • Host: Mac OS X 10.10.5
  • Docker 1.10.1

Robiłem to:

Krok 1 : utwórz wolumin dla stałych danych postgresowych

docker volume create --name postgres_data 

Krok 2: Start instancja postgres

UPDATE: Jak sugerowano w komentarzach, ja podano mapowanie portów, gdy uruchomiony pojemnik

docker run --name my_postgres_container -e POSTGRES_PASSWORD=my_password -v postgres_data:/var/lib/postgresql/data -p 5432:5432 -d postgres:9.1 

Krok 3: connect to przykład Docker w ten sposób:

docker run -it --link my_postgres_container:postgres --rm postgres:9.1 sh -c 'exec psql -h "$POSTGRES_PORT_5432_TCP_ADDR" -p "$POSTGRES_PORT_5432_TCP_PORT" -U postgres' 

Bu t Chcę połączyć się z tą instancją przez:

psql -h localhost -p 5432 -U postgres 

Tak jak w przypadku zainstalowania PostgreSQL lokalnie na moim komputerze-hoście.

Problem to port 5432 nie jest udostępniony. Tak więc, nie mogę połączyć się z nim:

sudo lsof -i -P | grep -i "listen" -> Nie Port 5432 otwarty

UPDATE 2: Nawet obcy. Zrobiłem to również:

Przystanek Docker. Następnie uruchom normalną instancję PostgreSQL 9.4.4 w mojej maszynie głównej (tutaj nie ma żadnego dokera, tylko postgres działa na moim hostie Mac OS X, nasłuchując na porcie 5432). Wszystko jest normalne:

sudo lsof -i -P | grep -i "postgres" 

postgres 14100   jorge 6u IPv4 0x780274158cebef01  0t0 TCP localhost:5432 (LISTEN) 

mogę połączyć się z moim lokalnej instancji postgres bez problemu (patrz dane wyjściowe komendy: Czy postgres skompilowane dla systemu Mac OS X, mój gospodarz):

psql -h localhost -U postgres -c "select version()" 
                   version 
--------------------------------------------------------------------------------------------------------------------------------------- 
PostgreSQL 9.4.4 on x86_64-apple-darwin14.3.0, compiled by Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn), 64-bit 
(1 row) 

Teraz zabawna część. Ponownie uruchamiam instancję Docker, , gdy działa instancja PostgreSQL hosta.

Zaczyna się! (i nie powinno). Mogę nawet połączyć za pomocą run Döcker ...

docker run -it --link my_postgres_instance:postgres --rm postgres:9.1 sh -c 'exec psql -h "$POSTGRES_PORT_5432_TCP_ADDR" -p "$POSTGRES_PORT_5432_TCP_PORT" -U postgres' 

Jeśli biegnę Wybierz wersję() teraz, pokazuje postgres uruchomione w moim przypadku Döcker na tych samych PostgreSQL czas ucieka w moim hostem, z docker, przy użyciu tego samego portu 5432.(Spójrz na ouput jest postgres skompilowany dla Debiana, OS wewnątrz PostgreSQL 9.1 pojemnik)

postgres=# select version(); 
              version 
------------------------------------------------------------------------------------------------ 
PostgreSQL 9.1.20 on x86_64-unknown-linux-gnu, compiled by gcc (Debian 4.9.2-10) 4.9.2, 64-bit 
(1 row) 

Dlaczego?

Czy ma to sens? Mój ostateczny cel to , aby uruchomić aplikację Django w innym kontenerze Docker i połączyć się z moją instancją PostgreSQL. Jak mogłem to zrobić?

Odpowiedz

7

Uruchom obraz Postgre z prawidłowym mapowania portów wykorzystaniem -p <host_port>:<container_port>:

docker run --same-options-as-step-one -d -p 5432:5432 postgres:9.1 
+0

Dzięki! To zrobiłem. Ale nadal nie można połączyć się przy użyciu psql. port 5432 nie jest narażony lub nie wiem jak się połączyć. Program psql mojego hosta działa poprawnie (mogę połączyć się z innymi hostami, ale nie z moim kontenerem). – jorgeas80

+0

Co oznacza "port dokujacy "? –

+0

Powinien wydrukować coś w rodzaju '5432/tcp -> 0.0.0.0: 5432' –

6

Gospodarz doker jest maszyną wirtualną, która ma własne adddres IP. Można wykryć ten adres IP, wpisując następującą komendę:

docker-machine ip 

Odpowiedź będzie coś podobnego 192.168.99.100

Po odwzorowany portów za pomocą -p 5432: 5432 Switch, będziesz mógł łączyć się z postgresem za pomocą dowolnego narzędzia z urządzenia deweloperskiego, korzystając z podanego adresu IP.

2

Jest 2018 i właśnie miałem podobny problem. Rozwiązanie dla mnie wydawało się być z rzędu rekwizytów do dokowania. na przykład w wyniku tego żaden port nie był narażony;

docker run -d --name posttest postgres:alpine -e POSTGRES_PASSWORD=fred -p 5432:5432

gdy ten pracował dobrze (obraz wystawiony portu 5432, zgodnie z oczekiwaniami);

docker run --name posttest -d -p 5432:5432 -e POSTGRES_PASSWORD=fred postgres:alpine

+0

naprawione dla mnie, dzięki! – PepeHands

Powiązane problemy