Docker + fig / compose + nginx + node.js + mysql + redis
Próbuję ustawić węzeł.aplikacja js na wielu kontenerach Docker. Moja aplikacja jest obecnie na jednym Ubuntu do droplet & używa:
- węzeł.js (express 4)
- mysql dla bazy aplikacji
- redis dla przechowalni wartości klucza
- nginx do równoważenia obciążenia i serwowania plików statycznych.
Muszę dockeryzować różne części, po jednej dla każdego kontenera, a następnie użyć Docker-Compose (wcześniej znanego jako Fig), aby po prostu opisać różne kontenery i konfigurację powiązania między nimi.
Nie mam pojęcia o wielozadaniowym apprachorze.
Jeden dla nginx
jeden dla węzła.js & my express app
jeden dla MySql
i jeden dla Redis
Jak komponuje się Docker.yml będzie wyglądał jak? Zgaduję, że nginx, mysql i redis będą niezmodyfikowane oficjalne obrazy? Podczas gdy węzeł.js będzie miał dyrektywę build wskazującą na plik Dockerfile, który zauważy, że jest on oparty na węźle.oficjalny obraz js wraz z instrukcją konfiguracji? Będę potrzebował aby skonfigurować / przepisać mysql & redis na przykład tak czy to znaczy, że każdy musi być oddzielony z własnym Dockerfile?
Jaki byłby sposób połączenia między kontenerami? Kopiuj do nich pliki za pomocą woluminów, ustawianie portów, dostosowywanie pliku hosts do mapowania some.domain.com do ip nginx?
Będę musiał zainstalować globalnie kilka pakietów npm takich jak nodemon & PM2 i ustawić kilka zadań cron... (na węźle.kontener js?)
Oto pierwszy szkic, byłbym wdzięczny każda pomoc, aby lepiej zrozumieć tę nową konfigurację:
Docker-compose.yml
nginx:
image: nginx
links:
- "node"
node:
build: .
volumes:
- "app:/src/app"
ports:
- "3030:3000"
links:
- "db:mysql"
db:
image: mysql:5.6
environment:
- MYSQL_ROOT_PASSWORD=mypassword
Dockerfile
FROM node:0.12
RUN mkdir /src
RUN npm install nodemon pm2 -g
WORKDIR /src
ADD app/package.json /src/package.json
RUN npm install
ADD app/nodemon.json /src/nodemon.json
EXPOSE 3000
CMD npm start
[[2]} używam tego simple project jako bazy, choć moja aplikacja potrzebuje 2 answers
Przed konfiguracją części docker-compose należy zdecydować o architekturze systemu.
The parts you have-
- MySQL w wersji wykonywalnej X na porcie 3306
- MySQL dane przechowywane na dysku
- Redis wersja wykonywalna y nasłuchująca na porcie 6379
- Redis backup dane na dysku
- węzeł.js wersja wykonywalna z nasłuchiwanie na porcie 3000
- Pliki Twojego ekspresu.js application
- nginx executable wersja Q nasłuchiwanie na porcie 80
Dodatkowe względy infrastrukturalne -
- pojedyncza instancja, jeden procesor / rdzeń
- pojedyncza instancja, wiele procesorów / rdzeni
- wiele instancji
- który load-balancer jest używany (jeśli w ogóle)
Dla pojedynczej instancji, która uruchomi wszystkie komponenty, prawdopodobnie nie potrzebujesz nawet load balancer - więc jeśli nie musisz podawać plików statycznych obok aplikacji, nie ma sensu mieć tutaj nginx ponieważ nie zrobiłby nic użytecznego.
Gdy masz wiele kontenerów działających express.aplikacja js albo na jednej instancji (dla wielordzeniowych / CPU) lub wielu instancjach, a następnie musisz mieć jakiś balans obciążenia dzieje, może za pomocą nginx.
Obsługa danych wewnątrz kontenera nie jest zalecana, ponieważ system plików kontenera nie jest zbyt dobry w obsłudze silnie mutujących danych. Więc dla MySQL i Redis pewnie chcesz mieć zewnętrzne punkty montowania, w których znajdują się dane.
Twój Ekspres.aplikacja js wymaga konfiguracji serwerów Redis i MySQL, z którymi musi się łączyć, można to zrobić za pomocą linków Docker. Tak więc Twój komponent Dockera będzie wyglądał mniej więcej tak:]}redis:
image: redis
volumes:
- /data/redis:/data
mysql:
image: mysql:5.6
environment:
- MYSQL_ROOT_PASSWORD=verysecret
volumes:
- /data/mysql:/var/lib/mysql
application:
image: node:0.12
working_dir: /usr/src/myapp
volumes:
- /src/app:/usr/src/myapp
ports:
- 80:3000
links:
- redis
- mysql
Zakłada to, że będziesz przechowywać dane MySQL i Redis na systemie plików hosta w /data
, a Twoja aplikacja na systemie plików hosta znajduje się w /src/app
.
Ponieważ używane obrazy sąpobłogosławione obrazy z Docker HUB, ich pliki readme są ważne, aby pamiętać o większej konfiguracji -
- https://registry.hub.docker.com/_/mysql/
- https://registry.hub.docker.com/_/node/
- https://registry.hub.docker.com/_/redis/
Dodawanie kolejnych instancji aplikacji jest łatwe, ale wtedy trzeba będzie dodać nginx, aby zrównoważyć ruch przychodzący do wielu kontenerów aplikacji.
Wtedy, gdy chcesz uruchomić tego rodzaju konfigurację przy użyciu wielu hostów, staje się to znacznie bardziej skomplikowane, ponieważ docker-linki nie będą działać i potrzebujesz innego sposobu, aby odkryć adresy IP kontenera i porty. Funkcja load balancer musi mieć jeden punkt końcowy, który akceptuje ruch dla wielu instancji aplikacji. Tutaj bym polecam dobrze się przyjrzeć https://consul.io o pomoc.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-01 13:13:56
Myślę, że nie trzeba dzielić nginx i nodejs na różne instancje. Obecnie konfiguruję również nodejs na dockerze, więc wkrótce tu wrócę i postaram się umieścić kompleksową odpowiedź na twoje pytanie.
Tam znajdziesz przydatny artykuł o konfigurowaniu podobnej architektury na dockerze http://blog.stxnext.com/posts/2015/01/development-with-docker-and-fig / , różnica django / nodejs nie powinna być problemem.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-15 13:01:59