2015-02-27 20 views
14

Próbuję skonfigurować aplikację Node.js w wielu kontenerach Docker. Moja aplikacja jest obecnie na jednym Ubuntu DO kropla & używa:Docker + rys/compose + nginx + node.js + mysql + redis

  1. node.js (Express 4)
  2. mysql do bazy danych aplikacji
  3. Redis do sklepu klucz-wartość
  4. nginx dla obciążenia równoważenie i wyświetlanie plików statycznych.

trzeba dockerize różne części, po jednej dla każdego pojemnika, oczywiście, a następnie użyć Docker-Utwórz (poprzednio znany jako rysunku) wprost do opisania różnych pojemników & Setup łącza pomiędzy nimi. Kradnę niejasno na temat wieloskładnikowej aplikacji.
Jeden dla nginx
jeden dla node.js & mój express app
jeden dla MySQL
i jeden dla Redis

Jak miałby Docker-compose.yml będzie wyglądać? Zgaduję, że nginx, mysql & redis będzie niezmodyfikowanymi oficjalnymi obrazami? Podczas gdy plik node.js będzie mieć dyrektywę budowania, która wskaże plik Docker, który będzie pamiętać, że jest oparty na oficjalnym obrazie node.js wraz z instrukcjami konfiguracyjnymi? Będę musiał skonfigurować/dostarczyć mysql & redis na przykład, więc czy to oznacza, że ​​każdy musi być oddzielny z własnym plikiem Dockerfile?

Jaki byłby sposób łączenia kontenerów? używać woluminów do kopiowania do nich plików, ustawiając porty, dostosowując plik hosts, aby mapować some.domain.com na nginx ip?

będę wtedy trzeba instalować globalnie niektórych pakietów NPM jak nodemon & PM2 i ustawić kilka crona ... (na pojemniku node.js?)

o to pierwszy projekt, będę wdzięczny za wszelkie pomóc 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 

Używam tego simple project jako zasady, że moja aplikacja potrzebuje

Odpowiedz

25

Przed skonfigurowaniem części dokujacej musisz zdecydować o architekturze systemu.

Części masz -

  • MySQL wersja wykonywalny X nasłuchuje na porcie 3306
  • MySQL dane przechowywane na dysku
  • Redis wykonywalny wersja Y nasłuchuje na porcie 6379
  • Redis zapasowej dane na dysku
  • Wersja wykonywalna Node.js Z nasłuchiwanie na porcie 3000
  • Pliki aplikacji Express.js
  • Nginx wersja wykonywalny Q nasłuchuje na porcie 80

dodatkowe kwestie infrastrukturalne -

  • jednej instancji, jeden cpu/core
  • jednej instancji, wiele procesorów/rdzeni
  • Wiele instancji
  • Który load-bala ncer jest używany (jeśli w ogóle)

Dla jednej instancji, które będą uruchamiać wszystkie komponenty, prawdopodobnie nawet nie trzeba równoważenia obciążenia - tak chyba trzeba służyć pliki statyczne obok aplikacji, istnieje nie ma sensu, aby mieć nginx, ponieważ nie przyniosłoby to żadnego pożytku.

Gdy masz wiele kontenerów z uruchomioną aplikacją express.js na jednej instancji (w przypadku procesorów wielordzeniowych/procesorów) lub w wielu instancjach, musisz przeprowadzić pewne równoważenie obciążenia, może używając nginx.

Obsługa danych w kontenerze nie jest zalecana, ponieważ system plików kontenera nie radzi sobie z wysoce zmutowanymi danymi. Tak więc dla MySQL i Redis prawdopodobnie chcesz mieć zewnętrzne punkty montowania, w których znajdują się dane.

Twoja aplikacja Express.js wymaga konfiguracji, z którymi serwerami Redis i MySQL musi się połączyć, można tego dokonać za pomocą łączy Docker.

Zatem Twój Docker Compose 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 będzie przechowywać dane z MySQL i Redis w systemie plików hosta w /data i aplikacji w systemie plików hosta jest /src/app .

Polecam, aby wyszukać odniesienie do pliku YAML dla funkcji Docker dla wszystkich różnych opcji, które można zastosować https://docs.docker.com/compose/yml/.

Ponieważ obrazy użyte są błogosławione obrazy z Docker HUB, ich readme pliki są ważne, aby wziąć pod uwagę, aby uzyskać więcej konfiguracji -

Dodawanie większej liczby wystąpień aplikacji jest łatwe, ale wtedy będzie musiał dodać nginx, aby zrównoważyć przychodzący ruch do wielu kontenerów aplikacji.

Jeśli chcesz uruchomić tego rodzaju konfigurację przy użyciu wielu hostów, staje się to o wiele bardziej skomplikowane, ponieważ łącza doczepne nie będą działały i potrzebujesz innego sposobu na wykrycie adresów IP kontenera i portów. A moduł równoważenia obciążenia będzie musiał posiadać jeden punkt końcowy, który akceptuje ruch dla wielu wystąpień aplikacji. Tutaj chciałbym polecić, aby przyjrzeć się https://consul.io, aby uzyskać pomoc.

0

myślę, że nie trzeba podzielić nginx i nodejs do różnych instancji. Obecnie tworzę również nodejs na dockerze, więc wrócę tu wkrótce i spróbuję złożyć kompleksową odpowiedź na twoje pytanie.

Tutaj można znaleźć przydatny artykuł na temat konfigurowania podobnej architektury na dockerze http://blog.stxnext.com/posts/2015/01/development-with-docker-and-fig/, różnica django/nodejs nie powinna stanowić problemu.

+0

Dziękuję Damian. Odnośnie plików nginx i node.js w tym samym kontenerze - w jaki sposób chciałbyś dodać więcej "skrzynek" w konfiguracji początkowej w nginx? Jeśli dobrze zrozumiałem - musisz go oddzielić, aby umożliwić skalowalną strukturę ... przechodzenie przez twój artykuł - dzięki! i czekam na twoją rozwiniętą odpowiedź ... Ajar – Ajar

+0

Prowadzimy również Nginx i Node.JS w tym samym kontenerze, a my przeskalujemy przez AWS ELB –

+0

Hej @Shimon :) Jest to bardzo interesujące - jeśli twoje skalowanie korzystasz z elastycznego równoważenia obciążenia Amazon (używając automatycznego skalowania?) - dlaczego potrzebujesz nginx wraz z Node.js w każdym pojedynczym kontenerze, który kręcisz? Jaka jest istota posiadania wielu instancji nginx? czy to służy do wyświetlania plików statycznych? masz S3 do tego ... jeśli nie używasz nginx jako pojedynczego load balancera do obsługi routingu ruchu pomiędzy kontenerami Node, dlaczego jest on na pierwszym miejscu? Dziękuję za Twój komentarz. – Ajar

Powiązane problemy