SÄ hÀr paketerar du en VueJS + NodeJS + MongoDB-applikation i Docker.

SÄ hÀr paketerar du en VueJS + NodeJS + MongoDB-applikation i Docker.
Som man kan förstÄ av den förra artikeln har jag arbetat med olika projekt. De första dagarna i det nya teamet brukar se likadana ut: backendutvecklaren sÀtter sig hos mig och utför magiska handlingar för att installera och deploya applikationen. Docker Àr oumbÀrligt för frontendutvecklare eftersom backend ofta Àr skriven i ett brett spektrum av teknologier som PHP/Java/Python/C# och frontend behöver inte hela tiden störa backend för att fÄ allt installerat och uppsatt. Bara pÄ ett stÀlle har jag sett en kombination av Docker och Jenkins med transparent deployment, loggar och automatiserade tester.

Det har skrivits mÄnga detaljerade artiklar om Docker. I den hÀr artikeln kommer vi att diskutera distributionen av en Single Page Application med hjÀlp av VueJS/Vue Router, medan serverdelen utgörs av ett RESTful API med NodeJS, och databasen som anvÀnds Àr MongoDB. För att beskriva och köra flera applikationscontainrar anvÀnds Docker Compose.

Varför behövs Docker

Docker möjliggör automatisering av processen för distribution av applikationen. Utvecklare behöver inte lÀngre sjÀlv installera program, eller slÄss med versionskompatibilitet pÄ sin maskin. Det rÀcker med att installera Docker och skriva in 1-2 kommandon i terminalen. Det Àr enklast att göra detta pÄ Linux.

Kom igÄng

Installera Docker och Docker compose

Mappstruktur

Vi skapar 2 mappar för klient- och serverapplikationerna. En fil med .yml-Àndelse Àr en konfigurationsfil Docker Compose, dÀr containrarna för applikationen definieras och lÀnkas.
Docker-compose.yml:

version: "3"
services:
  mongo:
    container_name: mongo
    hostname: mongo
    image: mongo
    ports:
      - "27017:27017"
  server:
    build: server/
    #command: node ./server.js #hÀr kan CMD frÄn Dockerfile i /server överskrivas
    ports:
      - "3000:3000"
    links:
      - mongo
  client:
    build: client/
    #command: http-server ./dist #hÀr kan CMD frÄn Dockerfile i /client överskrivas
    network_mode: host
    ports:
      - "8089:8089"
    depends_on:
      - server

Vi skapar 3 tjĂ€nster i Docker: för NodeJS, MongoDB och för statiska filer med Vue. För att koppla klienten till servern har vi lagt till beroenden pĂ„ servern. För att lĂ€nka MongoDB med serverens API anvĂ€nds lĂ€nkar mongo. Server, klient, mongo – namnen pĂ„ tjĂ€nsterna.

Klienten pÄ VueJS

I mappen /client Àr applikationen som ligger pÄ VueJS. Applikationen skapades med hjÀlp av Vue Cli. Vid byggandet av bilden byggs klientapplikationen till ett set av statiska filer i mappen /dist. I Dockerfile beskrivs en uppsÀttning kommandon för att bygga bilden:

FROM node:10
WORKDIR /client
COPY ./package*.json ./
RUN npm install
RUN npm install -g http-server
COPY . .
RUN npm run build
EXPOSE 8081
CMD ["npm", "test:dev"]

Observera att package.json kopieras och installeras separat frĂ„n de andra filerna i projektet. Detta görs för prestanda, sĂ„ att innehĂ„llet i mappen /node_modules cachas vid ĐżĐŸĐČŃ‚ĐŸŃ€byggen. Varje radkommando cachas separat.

Till slut, nÀr containern körs utförs kommandot npm run dev. Detta kommando beskrivs i package.json:


"scripts": {
	 "test:dev": "http-server dist -p 8081 -c 1 --push-state"
}

För att köra filer frĂ„n mappen /dist, installeras globalt http-server, och i dev-dependencies paketet spa-http-server, sĂ„ att Vue Router fungerar korrekt. Flaggan —push-state gör en omdirigering till index.html. Flaggan -c med vĂ€rdet 1 sekund har lagts till för att http-server inte cacha skripten. Det hĂ€r Ă€r ett testexempel; i ett verkligt projekt Ă€r det bĂ€ttre att anvĂ€nda nginx.

I Vuex store skapar vi ett fÀlt apiHost: 'http://localhost:3000', dÀr NodeJS Api-porten anges. Klientsidan Àr klar. Nu gÄr alla förfrÄgningar frÄn klienten till backend pÄ denna url.

NodeJS server API

I mappen /server skapar server.js och Dockerfile:


FROM node:10
WORKDIR /server
COPY ./package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]

I server.js anges url för databasen const url = 'mongodb://mongo:27017/';. Vi tillÄter korsdomÀnförfrÄgningar frÄn klienten:


const clientUrl = 'http://localhost:8081';
const corsOptions = {
  origin: clientUrl,
  optionsSuccessStatus: 200, 
};
app.use(cors());
app.all('/*', (req, res, next) => {
  res.header('Access-Control-Allow-Origin', clientUrl);
  res.header('Access-Control-Allow-Headers', 'X-Requested-With');
  next();
});
  app.get('/getProducts', cors(corsOptions), (req, res) => {
    products.getContent
      .then(data => res.json(data), err => res.json(err));
  });
  app.get('/getUsers', cors(corsOptions), (req, res) => {
    db.getUsers()
      .then(data => res.json(data), err => res.json(err));
  });

Slutsats

Nu gÄr vi till projektets katalog och kör docker-compose build för att bygga bilder och docker-compose up för att starta containrar. Kommandot kommer att starta 3 containrar: server, client, mongo. För servern pÄ NodeJS kan hot-reload konfigureras genom att koppla den till anvÀndarmappen. Klienten kan köras lokalt i utvecklingslÀge med hot reload genom att starta den separat server och mongo. För att starta en separat tjÀnst, ange bara dess namn docker-compose up client. Glöm inte att ibland köra prune och ta bort containrar, nÀtverk och bilder för att frigöra resurser.

Hele koden kan ses ). Ett typiskt exempel pÄ anvÀndning:. Projektet Àr fortfarande under utveckling.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster