Planuję podzielić mój serwer monolityczny na wiele małych kontenerów dockerowych, ale nie znalazłem jeszcze dobrego rozwiązania dla „komunikacji między kontenerami”. Oto mój docelowy scenariusz:
Wiem, jak łączyć ze sobą kontenery i eksponować porty, ale żadne z tych rozwiązań nie jest dla mnie satysfakcjonujące.
Czy istnieje rozwiązanie umożliwiające komunikację za pośrednictwem nazw hostów (nazw kontenerów) między kontenerami, jak w tradycyjnej sieci serwerów?
networking
docker
Patrick Gotthard
źródło
źródło
Odpowiedzi:
Edycja: po Docker 1.9
docker network
polecenie (patrz poniżej https://stackoverflow.com/a/35184695/977939 ) jest zalecanym sposobem osiągnięcia tego.Moim rozwiązaniem jest skonfigurowanie dnsmasq na hoście, aby rekord DNS był automatycznie aktualizowany: rekordy „A” mają nazwy kontenerów i automatycznie wskazują adresy IP kontenerów (co 10 sekund). Tutaj wklejono skrypt automatycznej aktualizacji :
Upewnij się, że Twoja usługa dnsmasq jest dostępna na
docker0
. Następnie uruchom swój kontener,--dns HOST_ADDRESS
aby korzystać z tej usługi mini dns.Źródła: http://docs.blowb.org/setup-host/dnsmasq.html
źródło
Nowa funkcja sieciowa umożliwia łączenie się z kontenerami według ich nazw, więc jeśli utworzysz nową sieć, każdy kontener podłączony do tej sieci może łączyć się z innymi kontenerami po ich nazwie. Przykład:
1) Utwórz nową sieć
2) Podłącz kontenery do sieci
lub
3) Ping kontenera według nazwy
Zobacz tę sekcję dokumentacji;
Uwaga: W przeciwieństwie do starszej
links
wersji, nowa sieć nie będzie tworzyć zmiennych środowiskowych ani współdzielić zmiennych środowiskowych z innymi kontenerami.Ta funkcja obecnie nie obsługuje aliasów
źródło
docker-compose down,up,restart
?bridge
sieci ze względu na wsteczną kompatybilność, ale tak, zgadzam się, zdecydowanie powinno być domyślnie włączone!To powinno być to, co
--link
jest , przynajmniej dla części hosta.W przypadku dockera 1.10 i PR 19242 byłoby to:
(patrz ostatnia sekcja poniżej)
To właśnie aktualizacja
/etc/hosts
szczegółów plikuNa przykład uruchom serwer LDAP:
I zdefiniuj obraz, aby przetestować ten serwer LDAP:
Możesz wyeksponować
openldap
„kontener jakointernalopenldap
” w obrazie testowym za pomocą --link:Następnie, jeśli wpiszesz „lds”, ten alias zadziała:
To zwróciłoby ludzi. Znaczenie
internalopenldap
jest poprawnie osiągnięte zldaptest
obrazu.Oczywiście, docker 1.7 doda
libnetwork
, co zapewnia natywną implementację Go do łączenia kontenerów. Zobacz wpis na blogu .Wprowadził bardziej kompletną architekturę z modelem sieci kontenerowej (CNM)
Spowoduje to zaktualizowanie interfejsu wiersza polecenia platformy Docker za pomocą nowych poleceń „sieciowych” i udokumentowanie sposobu
-net
użycia flagi „ ” do przypisywania kontenerów do sieci.docker 1.10 ma nową sekcję Alias o zasięgu sieciowym , teraz oficjalnie udokumentowany w
network connect
:źródło
EDYCJA : To już nie jest krwawa krawędź: http://blog.docker.com/2016/02/docker-1-10/
Oryginalna odpowiedź
Walczyłem z nią całą noc. Jeśli nie boisz się krwawienia, skomponuj najnowszą wersję silnika Docker i Dockera implementację libnetwork.
Z odpowiednim plikiem konfiguracyjnym (który należy umieścić w wersji 2), utworzysz usługi, które będą się wzajemnie widzieć. I dodatkowo, możesz je również skalować za pomocą docker-compose (możesz skalować dowolną usługę, która nie wiąże portu na hoście)
Oto przykład plik
I odniesienie do nowej wersji pliku tworzenia wiadomości: https://github.com/docker/compose/blob/1.6.0-rc1/docs/networking.md
źródło
O ile wiem, przy użyciu tylko Dockera nie jest to możliwe. Potrzebujesz trochę DNS do mapowania adresów IP kontenerów na nazwy hostów.
Jeśli chcesz gotowe rozwiązanie. Jednym z rozwiązań jest użycie na przykład Konteny . Jest wyposażony w technologię nakładki sieciowej firmy Weave, która służy do tworzenia wirtualnych prywatnych sieci LAN dla każdej usługi i każdej usługi można uzyskać
service_name.kontena.local-address
.Oto prosty przykład pliku YAML aplikacji Wordpress, w którym usługa Wordpress łączy się z serwerem MySQL z adresem wordpress-mysql.kontena.local:
źródło