Docker nie może się połączyć z Postgres

0

Cześć,
Uczę się dockera i chciałbym wrzucić do niego jakiś prosty projekt. Na razie utworzyłem 2 pliki:
Dockerfile

FROM python:3
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/

i docker-compose.yml

version: "3.9"

services:
  db:
    image: postgres
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_HOST_AUTH_METHOD=trust
      - POSTGRES_USER=hidden
      - POSTGRES_PASSWORD=hidden
      - POSTGRES_HOST=localhost
  web:
    build: .
    command: python3 manage.py runserver
    volumes:
      - .:/code/
    ports:
      - "7786:7786"
    depends_on:
      - db

Używam kontenera linuxowego, pracując na Windowsie. Wczoraj trochę kombinowałem w portach postgres i finalnie zmieniłem z portu 5432 na 7786 w celu sprawdzenia czy uda mi się połączyć z bazą. Otóż za każdą próbą postawienia kontenera otrzymuję komunikat:

Is the server running on host "localhost" (127.0.0.1) and accepting
web_1  |        TCP/IP connections on port 7786?
web_1  | could not connect to server: Cannot assign requested address
web_1  |        Is the server running on host "localhost" (::1) and accepting
web_1  |        TCP/IP connections on port 7786?

Mógłby mi ktoś wyjaśnić co ja mam tutaj zrobić, aby działało? Porty zmieniałem na różne i nie pomogło. Plik z konfiguracją postgres jest ustawiony na połączenia ze wszystkich adresów (*), a port 7786.

3

W pierwszy port jaki podajesz to port na jakim przekierowujesz ruch na lokalny komputer, drugi to port na jakim usługa działa w kontenerze.
Czyli napisanie

      - "7786:7786"

Oznacza że usługa w kontenerze działa na porcie 7786 i port 7786 wystawiasz na zewnątrz.
Jak sam wspomniałeś postgres działa na 5432
Czy gdzieś przekierowujesz taki port na localhost w sekcji db? Bo ten 7786 przekierowujesz dla sekcji web, czyli kontenera z serwerem www uruchomionym z Django.
No i uruchamiając serwer też powinieneś podać jakiś port na jakim ma ruszyć:
command: python manage.py runserver 0.0.0.0:7786
Nie wiem jaki jest domyślny i nie ma co zgadywać lepiej podać port jako parametr i mieć przejrzystość.

2

Jak się uczysz, z Windows, to pytanie, czy gotowiec ci działa?

Ściągnie obraz i uruchomi w tle kontener

docker run -d -p 5432:5432 --name postgres -e POSTGRES_PASSWORD=1234 postgres

zalogujesz się user: postgres, password: 1234

docker exec -it postgres bash
root@1a7304e010f6:/# psql -U postgres
psql (12.4 (Debian 12.4-1.pgdg100+1))
Type "help" for help.

Jak gotowiec z repozytorium działa, to przechodzisz do budowania własnych obrazów.
Na początek polecam gotowe obrazy z repozytorium, przynajmniej masz pewność podczas nauki, że sam obraz jest OK.

1

A czy problem nie leży w czymś zupełnie innym:

  • Aplikacja w kontenerze WEB chce się połączyć z bazą danych w kontenerze DB
  • W aplikacji WEB adres do połączenie z bazą powinien wyglądać: postgresql://user:password@host:port/database - przy czym z perspektywy WEB baza danych jest na hoście DB
0

Dzięki za rozjaśnienie tematu! Po 2 dniach prób i błędów w końcu udało mi się postawić działające 2 kontenery dla Web i Db :) Zmieniłem port postgres z powrotem na 5432 i zmodyfikowałem trochę docker-compose według wskazówek powyżej. O dziwo zmieniłem także settings.py projektu modyfikując DATABASES: ... 'HOST': 'localhost' na 'HOST': 'db' i to raczej to pomogło. Teraz widzę w db moje tabele, ale one są puste. Z doświadczenia wiem, że prawdopodobnie istnieje sposób na załadowanie tabel danymi z jakiegoś pliku albo skryptu, ale muszę jeszcze znaleźć sposób jak to zrobić.

#Edit: Wystarczyło wejść do kontenera Web i wpisać python3 manage.py migrate. Dzięki jeszcze raz za pomoc!

1 użytkowników online, w tym zalogowanych: 0, gości: 1