Próbuję owinąć głowę Dockerem od momentu wdrożenia aplikacji, która ma działać na komputerach użytkowników. Moja aplikacja to po prostu aplikacja internetowa z kolbami i baza danych mongo. Zwykle zainstalowałbym zarówno na maszynie wirtualnej, jak i przekazałbym port hosta do aplikacji internetowej gościa. Chciałbym spróbować Docker, ale nie jestem pewien, jak mam używać więcej niż jednego programu. Dokumentacja mówi, że może być tylko ENTRYPOINT, więc jak mogę mieć Mongo i moją aplikację na kolbę. A może muszą znajdować się w oddzielnych kontenerach, w takim przypadku jak rozmawiają ze sobą i jak to ułatwia dystrybucję aplikacji?
150
Odpowiedzi:
Może istnieć tylko jeden punkt ENTRYPOINT, ale tym celem jest zwykle skrypt, który uruchamia tyle programów, ile potrzeba. Możesz dodatkowo użyć np. Supervisorda lub podobnego, aby zadbać o uruchomienie wielu usług w jednym kontenerze. To jest przykład kontenera Dockera z uruchomionymi mysql, apache i wordpress w jednym kontenerze .
Powiedzmy, że masz jedną bazę danych, która jest używana przez jedną aplikację internetową. Wtedy prawdopodobnie łatwiej będzie uruchomić oba w jednym kontenerze.
Jeśli masz udostępnioną bazę danych, która jest używana przez więcej niż jedną aplikację, lepiej byłoby uruchomić bazę danych w jej własnym kontenerze, a aplikacje każda w swoich własnych kontenerach.
Istnieją co najmniej dwie możliwości, w jaki sposób aplikacje mogą się ze sobą komunikować, gdy działają w różnych kontenerach:
źródło
Miałem podobne wymaganie, aby uruchomić stos LAMP, Mongo DB i własne usługi
Docker to wirtualizacja oparta na systemie operacyjnym, dlatego izoluje swój kontener wokół działającego procesu, dlatego wymaga co najmniej jednego procesu działającego w FOREGROUND.
Więc dostarczasz swój własny skrypt startowy jako punkt wejścia, w ten sposób twój skrypt startowy staje się rozszerzonym skryptem obrazu Dockera, w którym możesz układać dowolną liczbę usług, o ile ROZPOCZĘŁA SIĘ CO NAJMNIEJ JEDNA WCZESNA USŁUGA, KTÓRA ZBYT KU KOŃCA
Więc mój plik obrazu Dockera ma dwie linie poniżej na samym końcu:
W moim skrypcie uruchamiam wszystkie MySQL, MongoDB, Tomcat itp. Na koniec uruchamiam Apache jako wątek pierwszego planu.
Dzięki temu mogę uruchomić wszystkie moje usługi i utrzymać kontener przy życiu, przy czym ostatnia usługa zaczyna być na pierwszym planie
Mam nadzieję, że to pomoże
AKTUALIZACJA : Odkąd ostatnio odpowiedziałem na to pytanie, pojawiły się nowe rzeczy, takie jak Docker Compose , który może pomóc w uruchamianiu każdej usługi w osobnym kontenerze, a jednocześnie powiązać je wszystkie razem jako zależności między tymi usługami, spróbuj dowiedzieć się więcej o docker-compose i użyj go, jest bardziej elegancki, chyba że twoja potrzeba mu nie pasuje.
źródło
Zdecydowanie nie zgadzam się z niektórymi wcześniejszymi rozwiązaniami, które zalecały uruchamianie obu usług w tym samym kontenerze. W dokumentacji jest jasno określone, że nie jest to zalecane :
Istnieją dobre przypadki użycia dla nadzorcy lub podobnych programów, ale uruchomienie aplikacji internetowej + bazy danych nie jest ich częścią.
W tym celu zdecydowanie powinieneś użyć docker-compose i zaaranżować wiele kontenerów z różnymi obowiązkami.
źródło
Mogą znajdować się w osobnych kontenerach i rzeczywiście, jeśli aplikacja miałaby działać również w większym środowisku, prawdopodobnie tak by się stało.
System z wieloma kontenerami wymagałby trochę więcej orkiestracji, aby móc przywołać wszystkie wymagane zależności, chociaż w Docker v0.6.5 + dostępna jest nowa funkcja, która pomaga z tym wbudowanym w sam Docker - Łączenie . Jednak w przypadku rozwiązania obejmującego wiele maszyn nadal jest to coś, co trzeba zorganizować spoza środowiska Dockera.
W przypadku dwóch różnych kontenerów obie części nadal komunikują się przez TCP / IP, ale chyba że porty zostały specjalnie zablokowane (niezalecane, ponieważ nie można uruchomić więcej niż jednej kopii), musiałbyś przekazać nowy port że baza danych została ujawniona jako aplikacja, aby mogła komunikować się z Mongo. To znowu coś, w czym Linking może pomóc.
W przypadku prostszej, małej instalacji, w której wszystkie zależności znajdują się w tym samym kontenerze, możliwe jest również uruchomienie zarówno bazy danych, jak i środowiska wykonawczego Pythona przez program, który początkowo był nazywany ENTRYPOINT. Może to być tak proste, jak skrypt powłoki lub inny kontroler procesu - Supervisord jest dość popularny, a wiele przykładów istnieje w publicznych plikach Dockerfile.
źródło
Zgadzam się z innymi odpowiedziami, że używanie dwóch kontenerów jest lepsze, ale jeśli masz serce nastawione na pakowanie wielu usług w jednym kontenerze, możesz użyć czegoś w rodzaju nadzorcy.
w Hipache Na przykład, zawarte Dockerfile biegnie supervisord oraz określa plik supervisord.conf zarówno dla hipache i Redis-serwer do uruchomienia.
źródło
Docker zawiera kilka przykładów, jak to zrobić. Lekka opcja to:
źródło
Możesz uruchomić 2 procesy na pierwszym planie, używając
wait
. Po prostu utwórz skrypt bash z następującą zawartością. Np .start.sh
:W swoim pliku Dockerfile zacznij od
źródło
Jeśli dedykowany skrypt wydaje się być zbyt dużym narzutem, możesz jawnie utworzyć oddzielne procesy za pomocą
sh -c
. Na przykład:źródło