Mam dwa osobne docker-compose.yml
pliki w dwóch różnych folderach:
~/front/docker-compose.yml
~/api/docker-compose.yml
Jak mogę się upewnić, że kontener w front
może wysyłać żądania do kontenera w api
?
Wiem, że tę --default-gateway
opcję można ustawić za pomocą docker run
dla pojedynczego kontenera, dzięki czemu można przypisać określony adres IP do tego kontenera, ale wydaje się, że ta opcja nie jest dostępna podczas korzystania docker-compose
.
Obecnie kończę docker inspect my_api_container_id
i patrzę na bramę w danych wyjściowych. Działa, ale problem polega na tym, że to IP jest losowo przypisywane, więc nie mogę na nim polegać.
Inną formą tego pytania może być zatem:
- Czy mogę przypisać stały adres IP do konkretnego kontenera przy użyciu funkcji dokowania-tworzenia?
Ale w końcu to, na czym mi zależy:
- W jaki sposób dwa różne projekty dokowania mogą się ze sobą komunikować?
networking
docker
docker-compose
Jivan
źródło
źródło
Odpowiedzi:
Musisz tylko upewnić się, że kontenery, z którymi chcesz rozmawiać, znajdują się w tej samej sieci. Sieci są pierwszorzędną konstrukcją dokującą i nie są specyficzne do tworzenia.
...
Następnie mogą rozmawiać ze sobą przy użyciu nazwy usługi. Od
front
można zrobićping api
i vice versa.źródło
name
właściwości, która wyłączy automatyczne dodawanie z nazwą projektu. Wówczas każdy projekt może korzystać z tej sieci i utworzyć ją automatycznie, jeśli jeszcze nie istnieje.Tylko małe przyzwolenie na świetną odpowiedź @ johnharris85, kiedy uruchamiasz plik komponowania dokera,
default
tworzona jest sieć „ ”, dzięki czemu możesz po prostu dodać go do innego pliku tworzenia jako sieć zewnętrzna:...
Dla mnie to podejście było bardziej odpowiednie, ponieważ nie posiadałem pierwszego pliku skomponowanego w oknie dokowanym i chciałem się z nim komunikować.
źródło
services:
Zmodyfikowałem to, aby zrobić to w obrębie tagu, sintax zostanienetworks:
następnie zagnieżdżonyfront_default:
(usuń „-”), a następnie zagnieżdżymy statyczny adres IP:ipv4_address: '172.20.0.44'
AKTUALIZACJA: Od momentu skomponowania pliku w wersji 3.5:
To teraz działa:
docker-compose up -d
dołączy do sieci o nazwie „custom_network”. Jeśli nie istnieje, zostanie utworzony!Teraz możesz to zrobić:
Spowoduje to utworzenie kontenera, który będzie w sieci zewnętrznej.
Nie mogę znaleźć żadnego odniesienia w dokumentacji, ale działa!
źródło
Wszystkie kontenery z
api
mogą dołączyć dofront
domyślnej sieci z następującą konfiguracją:Zobacz przewodnik tworzenia dokerów: za pomocą istniejącej sieci (patrz na dole)
źródło
Informacje z poprzednich postów są poprawne, ale nie zawierają szczegółowych informacji na temat łączenia kontenerów, które powinny być połączone jako „external_links”.
Mam nadzieję, że ten przykład wyjaśni ci:
Załóżmy, że masz app1 / docker-compose.yml z dwiema usługami (svc11 i svc12) oraz app2 / docker-compose.yml z dwoma dodatkowymi usługami (svc21 i svc22) i załóżmy, że musisz połączyć się w sposób krzyżowy:
svc11 musi połączyć się z kontenerem svc22
Konfiguracja powinna wyglądać następująco:
to jest app1 / docker-compose.yml:
to jest app2 / docker-compose.yml:
źródło
Od wersji Compose 1.18 (specyfikacja 3.5) możesz po prostu zastąpić domyślną sieć, używając własnej niestandardowej nazwy dla wszystkich potrzebnych plików Compose YAML. Jest to tak proste, jak dodanie do nich następujących elementów:
Inne odpowiedzi wskazują na to samo; to jest uproszczone podsumowanie.
źródło
Chciałbym upewnić się, że wszystkie kontenery są
docker-compose
podłączone do tej samej sieci, tworząc je razem w tym samym czasie, używając:źródło
link
lubdepends_on
jednego pojemnika z przodu na jeden pojemnik z API?build path ~/front/api either does not exist or is not accessible
w oknie dokowanym lub na odwrótbuild path ~/api/front either does not exist or is not accessible
AKTUALIZACJA: Od momentu skomponowania pliku w wersji 3.5:
Natknąłem się na podobny problem i rozwiązałem go, dodając niewielką zmianę w jednym z moich projektów docker-compose.yml.
Na przykład mamy dwa API
scoring
iner
.Scoring
Interfejs API musi wysłać doner
interfejsu API żądanie przetworzenia żądania wejściowego. Aby to zrobić, oboje powinni dzielić tę samą sieć.Uwaga: każdy kontener ma własną sieć, która jest automatycznie tworzona w momencie uruchomienia aplikacji w oknie dokowanym. Na przykład zostanie utworzona sieć ner api jak
ner_default
i sieć oceniająca api zostanie nazwana jakoscoring default
. To rozwiązanie będzie działać dla wersji: „3”.Jak w powyższym scenariuszu mój punktacyjny interfejs API chce komunikować się z interfejsem Ner API, więc dodam następujące wiersze. Co oznacza, że ilekroć tworzę kontener dla interfejsu API, to automatycznie dodaje się do sieci scoring_default.
ner / docker-compose.yml
scoreing / docker-compose.yml
Widzimy to, jak powyższe kontenery są teraz częścią tej samej sieci nazywanej
scoring_default
za pomocą polecenia:źródło
Możesz dodać
.env
plik do wszystkich swoich projektów zawierającychCOMPOSE_PROJECT_NAME=somename
.COMPOSE_PROJECT_NAME przesłania prefiks używany do nazywania zasobów, ponieważ wszystkie twoje projekty będą używać
somename_default
ich sieci, dzięki czemu usługi mogą komunikować się ze sobą, tak jak były w tym samym projekcie.Uwaga: Otrzymasz ostrzeżenia dla „osieroconych” kontenerów utworzonych z innych projektów.
źródło
źródło
drugi docker-compose.yml
źródło
Inną opcją jest po prostu uruchomienie pierwszego modułu za pomocą funkcji „docker-compose”, sprawdzenie adresu IP powiązanego z modułem i połączenie drugiego modułu z poprzednią siecią, jak zewnętrzny, i skierowanie wewnętrznego adresu IP
przykład app1 - nowa sieć utworzona w liniach serwisowych, oznacz jako zewnętrzny: prawda na dole app2 - wskaż „nową sieć” utworzoną przez app1, gdy idzie w górę, zaznacz jako zewnętrzny: prawda na dole i ustaw w konfiguracji do połączenia, ip, które aplikacja1 ma w tej sieci.
Dzięki temu powinieneś być w stanie ze sobą rozmawiać
* ten sposób służy wyłącznie do testowania lokalnego, aby nie robić zbyt skomplikowanej konfiguracji ** Wiem, że jest to bardzo łatwa metoda, ale działa dla mnie i myślę, że jest tak prosta, że inni mogą z tego skorzystać
źródło
Jeśli jesteś
Connection refused
podczas próby komunikacji między dwoma konteneramiA ty chcesz
api_a
komunikuje się zapi_b
(lub odwrotnie) bez tej samej „sieci dokerów”(przykład poniżej)
możesz użyć „hosta” drugiego kontenera jako adresu IP komputera i portu odwzorowanego z wnętrza kontenera Docker. Możesz uzyskać adres IP swojego komputera za pomocą tego skryptu (z: Znajdowanie lokalnych adresów IP za pomocą stdlib Pythona ):
Przykład:
project_api_a/docker-compose.yml
:wewnątrz
api_a
kontenera uruchomiona jest aplikacja Django:manage.py runserver 0.0.0.0:8000
i drugi docker-compose.yml z innego projektu:
project_api_b/docker-compose-yml
:wewnątrz
api_b
kontenera uruchomiona jest aplikacja Django:manage.py runserver 0.0.0.0:8001
I próba połączenia z kontenera
api_a
doapi_b
adresu URLapi_b
kontenera będzie:http://<get_ip_from_script_above>:8001/
Może być szczególnie cenny, jeśli używasz nawet więcej niż dwóch (trzech lub więcej) projektów dokowania i trudno jest zapewnić wspólną sieć dla wszystkich - jest to dobre obejście i rozwiązanie
źródło