Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Hydepark _ Docker - dwa nginx

Napisany przez: nospor 3.07.2020, 12:01:05

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?

Napisany przez: gitbejbe 3.07.2020, 19:05:01

rozdziel na 2 sieci

  1. networks:
  2. app1:
  3. driver: bridge
  4. app2:
  5. driver: bridge

Napisany przez: nospor 5.07.2020, 18:27:04

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

Napisany przez: gitbejbe 6.07.2020, 19:48:48

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ć

Napisany przez: nospor 7.07.2020, 08:55:54

Z jednym compose nie mialbym w ogole tego problemu wink.gif

Napisany przez: viking 7.07.2020, 09:04:28

A coś takiego https://stackoverflow.com/questions/38088279/communication-between-multiple-docker-compose-projects

Napisany przez: nospor 7.07.2020, 09:26:04

@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.

Napisany przez: Pyton_000 7.07.2020, 19:37:09

Czy obie apki są publiczne? Generalnie wystawiłnbym porty dla obu np. 8080 i 8081 i stukał po portach.

Napisany przez: nospor 8.07.2020, 06:35:40

Obie sa publiczne

stukam po roznych portach

Napisany przez: Pyton_000 8.07.2020, 17:41:42

No to stukaj zew_ip:port1 zew_ip:por2 i po problemie. Nie łąćz tych apek w jednej sieci.

Napisany przez: vokiel 8.07.2020, 21:47:04

Opcją jest też dodanie nginxa jako proxy przed tymi obiema apkami.

Napisany przez: batman 9.07.2020, 03:32:29

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)

Napisany przez: nospor 9.07.2020, 09:04:35

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.

Napisany przez: batman 9.07.2020, 09:24:32

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.

Napisany przez: nospor 10.07.2020, 17:09:10

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"'"

Napisany przez: batman 10.07.2020, 18:18:23

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.

Napisany przez: aras785 12.07.2020, 00:43:23

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

Napisany przez: nospor 13.07.2020, 10:58:02

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)