Krótka odpowiedź:
chciałbym wdrożyć nginx i uwsgi application/kolby w postaci oddzielnych pojemnikach. Zapewnia to bardziej elastyczną architekturę, która pozwala łączyć więcej kont mikroservices z instancją nginx, ponieważ zwiększają się wymagania dotyczące większej liczby usług.
Objaśnienie:
Z dokowanym zwykle strategią jest podzielona usługę nginx i usługi uwsgi/kolbę w dwóch oddzielnych pojemnikach. Następnie możesz połączyć oba przy użyciu linków. Jest to wspólna filozofia architektury w świecie dokerów.Narzędzia takie jak docker-compose upraszczają zarządzanie wieloma kontenerami i tworzenie połączeń między nimi. Następujący plik konfiguracyjny doker-komponować pokazuje przykład tak:
version: '2'
services:
app:
image: flask_app:latest
volumes:
- /etc/app.cfg:/etc/app.cfg:ro
expose:
- "8090"
http_proxy:
image: "nginx:stable"
expose:
- "80"
ports:
- "80:8090"
volumes:
- /etc/app_nginx/conf.d/:/etc/nginx/conf.d/:ro
links:
- app:app
Oznacza to, że jeśli chcesz dodać więcej pojemników aplikacji można dołączyć je do tego samego pełnomocnika ngnix łatwo przez ich łączenie. Ponadto, jeśli chcesz uaktualnić jedną część infrastruktury, powiedzmy, uaktualnij nginx lub przestaw z Apache na nginx, budujesz ponownie tylko odpowiedni kontener i pozostawiasz resztę na miejscu.
Jeśli dodałeś obie usługi do pojedynczego kontenera (np. Uruchamiając proces nadzoru z pliku Dockerfile ENTRYPOINT), to umożliwiłoby to łatwiejszą komunikację między procesem nginx i uwsgi przy użyciu pliku skarpet, zamiast przez IP, ale nie sądzę, że to samo w sobie jest wystarczająco mocnym powodem, aby umieścić oba w tym samym pojemniku.
Weź również pod uwagę, czy w końcu skończysz z dwudziestoma mikroserwisami i każda uruchomi każdą własną instancję nginx, co oznacza, że masz teraz dwadzieścia zestawów dzienników nginx (access.log/error.log) do śledzenia w dwudziestu kontenerach.
Jeśli korzystasz z architektury "mikroserwisów", oznacza to, że z czasem będziesz dodawać coraz więcej kontenerów. W takim ekosystemie uruchamianie nginx jako oddzielnego procesu dokowania i łączenie z nim mikroserwisów ułatwia rozwój zgodnie z rosnącymi wymaganiami.
Uwaga na temat wykrywania usług
Jeżeli pojemniki są uruchomione na tym samym komputerze, a następnie połączenie wszystkich pojemników jest łatwe. Jeśli kontenery są uruchomione na wielu hostach, używając roju Kubernetes lub Docker, może się to okazać nieco bardziej skomplikowane, ponieważ Ty (lub struktura klastra) musi być w stanie połączyć swój adres DNS z instancją nginx, a kontenery dokowane muszą być w stanie "znaleźć" siebie nawzajem - to dodaje trochę pojęciowego narzutu. Kubernetes pomaga to osiągnąć, grupując pojemniki w pojemniki, definiując usługi itp.
[to-> wszystko w jednym pojemniku] (https://github.com/tiangolo/uwsgi-nginx-flask-docker) Versus [this -> flask i uwsgi w oddzielnym pojemniku] (http://louistiao.me/posts/re-implementing-the-kubernetes-guestbook-example-with-flask-and-nginx/) – Navid