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:

  1. węzeł.js (express 4)
  2. mysql dla bazy aplikacji
  3. redis dla przechowalni wartości klucza
  4. 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
Author: Ajar, 2015-02-27

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.

Polecam poszukać pliku Docker Compose YAML odniesienie do wszystkich różnych opcji, które mogą być użyte https://docs.docker.com/compose/yml/.

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 -

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.

 25
Author: Evgeny,
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.

 0
Author: Damian Gądziak,
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