Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Docker - dwa nginx
Forum PHP.pl > Inne > Hydepark
nospor
Cześć,
ma dwie aplikacje, powiedzmy app1, app2
obie aplikacje mają swoje środowiska docker startowane przez docker-compose. Każda ma swój własny php oraz nginx. Ponieważ app1 musi slać żądania do app2, wiec w docker-compose w app2 dodałem
Kod
networks:
  default:
    external:
      name: app1_default

Dzięki czemu app1 widzi kontener nginx z app2. I generalnie nie byłoby problemu gdyby nie fakt, że robiąc żądanie do app2 nawet z zewntarz a nie app1 to od czasu do czasu mam 404 NOT FOUND. Gdy wyłącze app1 to błąd ten się nie pojawia. Problem również znika gdy wywale exteneral network z docker-compose w app2
Ewidentnie więc nginx z app1 przechwytuje żądania które teoretycznie powinien łapać nginx z app2

Każdy konfig strony ma swoj właśny server_name więc teoretycznie powinien łapać tylko swoje a niestety łapie też nie swoje.

Jakieś porady?
gitbejbe
rozdziel na 2 sieci

  1. networks:
  2. app1:
  3. driver: bridge
  4. app2:
  5. driver: bridge
nospor
Nie bardzo rozumiem gdzie mam to wsadzic?

Kazda z aplikacja ma swoj oddzielny docker-compoer.yml. Konterer php z app1 ma widziec konterer nginx z app2
gitbejbe
sorki, umknęło mi że masz 2 compose. W jednym compose działałoby to w ten sposób jak napisałem, w 2 oddzielnych od ręki się nie wypowiem, musiałbym się wdrożyć
nospor
Z jednym compose nie mialbym w ogole tego problemu wink.gif
viking
A coś takiego https://stackoverflow.com/questions/3808827...ompose-projects
nospor
@viking to wlasnie teraz mam. Tylko sek w tym, ze gdy te dwie apllikacje sa wtej samej sieci, to nginx z pierwszej od czasu do czasu lapie requesty z drugiej co skutkuje rzuceniem NOT FOUND.
Pyton_000
Czy obie apki są publiczne? Generalnie wystawiłnbym porty dla obu np. 8080 i 8081 i stukał po portach.
nospor
Obie sa publiczne

stukam po roznych portach
Pyton_000
No to stukaj zew_ip:port1 zew_ip:por2 i po problemie. Nie łąćz tych apek w jednej sieci.
vokiel
Opcją jest też dodanie nginxa jako proxy przed tymi obiema apkami.
batman
Sprawdź czy takie coś zadziała:

Kod
services:
  app1:
    extra_hosts:
      - "app2host:host.docker.internal"


To powinno dodać do pliku hosts w kontenerze app1 wpis:
Kod
<twój adres ip>    app2host


Teraz powinieneś byś w stanie wysłać request to app2 bez kombinowania z siecią.

Kilka uwag:
- nie wiem czy host.docker.internal zostanie przetłumaczone na adres ip hosta w takiej postaci. Ja korzystałem z tego wewnątrz kontenera, nigdy z poziomu docker-compose.yml
- będzie musiał pamiętać o porcie (ale podejrzewam, że i tak go używasz)
nospor
Cytat
No to stukaj zew_ip:port1 zew_ip:por2 i po problemie. Nie łąćz tych apek w jednej sieci.

To nei dziala. Niewazne jak sie odwoluje do appek, czy host, czy IP, czy nawet po nazwie z kontenera wewnatrz appek to i tak srednio co drugi call leci lapanka z innego nginx. Oczywiscie porty nadal inne. Nawet godzinke spedzilem z szefem, ekspertem od nginx, to sie zalamal na koniec i stwierdzil ze nie kuma o co chodzi.

Cytat
Teraz powinieneś byś w stanie wysłać request to app2 bez kombinowania z siecią.

Ja to wiem, ze jak odlacze sieci to to dziala. I wiem ze odpowiedni wpis w etc/hosts zalatwi sprawe. ALe to jest tylko tymczasowe obejscie problemu. Najbardziej mnie zastanawia jakim cudem oddzielny nginx lapie moje requesty.
batman
Cytat
Najbardziej mnie zastanawia jakim cudem oddzielny nginx lapie moje requesty.

Może coś jest skaszanione w konfiguracji nginx? Jakaś reguła, która przechwytuje wszystkie nieobsłużone requesty? Albo w apce masz jakiś ukryty błąd, który skutkuje 404.
nospor
Nie ma, sprawdzilem wszystkie virtual hosts, wywalilem wszystkie default ktore nginx instaluje samodzielnie. Nic. Przegladalem to razem z szefem linia po linii i tez nic. Normalnie magia :/

@batman, sprawdzilem jeszcze twoje hosty ale mam problemy pewnie dlatego ze chyba nie rozumiem ten zapis. Dalem tak:
Kod
services:
  php:
   .... tu masa konfiguracje dla kontenera php.....
    extra_hosts:
      - "hubsync_nginx:host.docker.internal"

I dostaje blad:
" Cannot create container for service php: b'invalid IP address in add-host: "host.docker.internal"'"
batman
Cytat
" Cannot create container for service php: b'invalid IP address in add-host: "host.docker.internal"'"

Tak jak się obawiałem, docker compose nie wie co to jest host.docker.internal sad.gif Rzadko z tego korzystałem, zawsze z poziomu kontenera. Liczyłem, że compose będzie w stanie przetłumaczyć to na standardowy adres ip. Cóż, shit happens. Na chwilę obecną nie mam żadnego innego pomysłu.
aras785
Problem jest banalny, Twoja konfiguracja nginxa jest błędna - łączy się z tym samym FPMem (fpm:9000).

Rozwiązanie może wyglądać tak (dodanie links i podmiane w ngixie):

  1. version: '3'
  2. services:
  3. fpm:
  4. image: my_image/nginx-php:latest
  5. environment:
  6. - DOCKER_ROLE=fpm
  7. restart: always
  8. networks:
  9. - app1_default
  10. volumes:
  11. - ./public:/var/www/public
  12. nginx:
  13. image: my_image/nginx-php:latest
  14. restart: always
  15. ports:
  16. - 72:80
  17. environment:
  18. - DOCKER_ROLE=nginx
  19. - DOCKER_FPM_HOSTNAME=app2_fpm
  20. networks:
  21. - app1_default
  22. links:
  23. - "fpm:app2_fpm"
  24. networks:
  25. app1_default:
  26. external: true


i entrypoint do podmiany konfiguracji w nginxie (dzięki temu ta sama konfiguracja może lecieć na proda):
  1. ...
  2. if [ ! -z "$DOCKER_FPM_HOSTNAME" ]; then
  3. sed -i "s/fastcgi_pass 127.0.0.1:9000/fastcgi_pass $DOCKER_FPM_HOSTNAME:9000/g" /etc/nginx/conf.d/default.conf
  4. fi
  5. ...


Gdybyś potrzebował obrazu nginx + php 7.4 + cron + nodejs + supervisior to napisz priv to podrzucę Ci moje repo obrazu smile.gif
nospor
Ustawienie innych wewnetrznych portow w app2 dla php i nginx rozwiazalo sprawe.
Dzieki @Pyton za sugestie na pw oraz @aras za zwrocenie na to uwagi
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.