Как Π΄Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈΡ€Π°Ρ‚Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ VueJS + NodeJS + MongoDB Π² Docker

Как Π΄Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈΡ€Π°Ρ‚Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ VueJS + NodeJS + MongoDB Π² Docker
ΠšΠ°ΠΊΡ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΎΡ‚ ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½Π°Ρ‚Π° статия, Ρ€Π°Π±ΠΎΡ‚ΠΈΡ… с Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ. ΠŸΡŠΡ€Π²ΠΈΡ‚Π΅ Π΄Π½ΠΈ Π² Π½ΠΎΠ² Π΅ΠΊΠΈΠΏ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΠΏΡ€ΠΎΡ‚ΠΈΡ‡Π°Ρ‚ ΠΏΠΎ ΡΡŠΡ‰ΠΈΡ Π½Π°Ρ‡ΠΈΠ½: Π±Π΅ΠΊΠ΅Π½Π΄ΡŠΡ€ΡŠΡ‚ сяда Π΄ΠΎ ΠΌΠ΅Π½ ΠΈ изпълнява магичСскитС ΡΡ‚ΡŠΠΏΠΊΠΈ Π·Π° инсталиранС ΠΈ внСдряванС Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ. Docker Π΅ Π½Π΅Π·Π°ΠΌΠ΅Π½ΠΈΠΌ Π·Π° front-end Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅, Ρ‚.ΠΊ. Π‘Π΅ΠΊΠ΅Π½Π΄ΡŠΡ‚ чСсто Π΅ написан Π² ΡˆΠΈΡ€ΠΎΠΊ Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ PHP/Java/Python/C# стСковС ΠΈ ΠΏΡ€Π΅Π΄Π½Π°Ρ‚Π° част Π½Π΅ трябва Π΄Π° ΠΎΡ‚Π²Π»ΠΈΡ‡Π° Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° Π·Π°Π΄Π½Π°Ρ‚Π° всСки ΠΏΡŠΡ‚, Π·Π° Π΄Π° инсталира ΠΈ Π²Π½Π΅Π΄Ρ€ΠΈ всичко. Π‘Π°ΠΌΠΎ Π½Π° Π΅Π΄Π½ΠΎ място видях ΠΊΡƒΠΏ Docker-Jenkins с ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎ Ρ€Π°Π·Π³Ρ€ΡŠΡ‰Π°Π½Π΅, Π»ΠΎΠ³ΠΎΠ²Π΅, ΠΏΡ€Π΅Ρ†Π°ΠΊΠ°Π½ΠΈ с автотСстовС.

Π—Π° docker са написани ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΈ статии. Π’Π°Π·ΠΈ статия Ρ‰Π΅ сС фокусира Π²ΡŠΡ€Ρ…Ρƒ внСдряванСто Π½Π° Сдностранично ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° VueJS / Vue Router, ΡΡŠΡ€Π²ΡŠΡ€Π½Π°Ρ‚Π° част ΠΏΠΎΠ΄ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π½Π° RESTful API с NodeJS, Π° MongoDB сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΊΠ°Ρ‚ΠΎ Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ. Docker Compose сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° описванС ΠΈ изпълнСниС Π½Π° мноТСство ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π½ΠΈ прилоТСния.

Π—Π°Ρ‰ΠΎ ΠΈΠΌΠ°Ρ‚Π΅ Π½ΡƒΠΆΠ΄Π° ΠΎΡ‚ Docker

Docker Π²ΠΈ позволява Π΄Π° Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€Π°Ρ‚Π΅ процСса Π½Π° внСдряванС Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡŠΡ‚ Π²Π΅Ρ‡Π΅ Π½Π΅ трябва сам Π΄Π° инсталира ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ, Π΄Π° сС справя с Π½Π΅ΡΡŠΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚Ρ‚Π° Π½Π° вСрсиитС Π½Π° своята машина. Π”ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ Π΅ Π΄Π° инсталиратС Docker ΠΈ Π΄Π° Π²ΡŠΠ²Π΅Π΄Π΅Ρ‚Π΅ 1-2 ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ Π² ΠΊΠΎΠ½Π·ΠΎΠ»Π°Ρ‚Π°. Най-ΡƒΠ΄ΠΎΠ±Π½ΠΎ Π΅ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ Ρ‚ΠΎΠ²Π° Π½Π° Linux.

ΠŸΡŠΡ€Π²ΠΈ ΡΡ‚ΡŠΠΏΠΊΠΈ

инсталирам Π΄ΠΎΠΊΠ΅Ρ€ намлява Π”ΠΎΠΊΠ΅Ρ€ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ€Π°Π½Π΅

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Π½Π° ΠΏΠ°ΠΏΠΊΠ°Ρ‚Π°

БъздавамС 2 ΠΏΠ°ΠΏΠΊΠΈ Π·Π° клиСнтски ΠΈ ΡΡŠΡ€Π²ΡŠΡ€Π½ΠΈ прилоТСния. Π€Π°ΠΉΠ» с Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ .yml Π΅ конфигурация Π”ΠΎΠΊΠ΅Ρ€ ΠšΠΎΠΌΠΏΠΎΠ·ΠΈΡ€Π°Π½Π΅ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈΡ‚Π΅ Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ са Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½ΠΈ ΠΈ ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈ.
docker-compose.yml:

version: "3"
services:
  mongo:
    container_name: mongo
    hostname: mongo
    image: mongo
    ports:
      - "27017:27017"
  server:
    build: server/
    #command: node ./server.js #здСсь ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ CMD ΠΈΠ· Dockerfile Π² /server
    ports:
      - "3000:3000"
    links:
      - mongo
  client:
    build: client/
    #command: http-server ./dist #здСсь ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ CMD ΠΈΠ· Dockerfile Π² /client
    network_mode: host
    ports:
      - "8089:8089"
    depends_on:
      - server

БъздавамС 3 услуги Π² docker: Π·Π° NodeJS, MongoDB ΠΈ Π·Π° статика във Vue. Π”ΠΎΠ±Π°Π²Π΅Π½ΠΎ Π΅ ΡΠ²ΡŠΡ€Π·Π²Π°Π½Π΅ Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ към ΡΡŠΡ€Π²ΡŠΡ€ зависи ΠΎΡ‚ ΡΡŠΡ€Π²ΡŠΡ€Π°. Π—Π° Π΄Π° ΡΠ²ΡŠΡ€ΠΆΠ΅Ρ‚Π΅ MongoDB с API Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π°, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ Π²Ρ€ΡŠΠ·ΠΊΠΈ mongo. Π‘ΡŠΡ€Π²ΡŠΡ€, ΠΊΠ»ΠΈΠ΅Π½Ρ‚, ΠΌΠΎΠ½Π³ΠΎ са ΠΈΠΌΠ΅Π½Π°Ρ‚Π° Π½Π° услугитС.

VueJS ΠΊΠ»ΠΈΠ΅Π½Ρ‚

Π’ ΠΏΠ°ΠΏΠΊΠ° /ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ сС Π½Π°ΠΌΠΈΡ€Π° Π½Π° VueJS. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, създадСно с vue cli. ΠšΠΎΠ³Π°Ρ‚ΠΎ ΡΡŠΠ·Π΄Π°Π²Π°Ρ‚Π΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, клиСнтското ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ сС Π²Π³Ρ€Π°ΠΆΠ΄Π° Π² Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ статични Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ Π² ΠΏΠ°ΠΏΠΊΠ° /дист. Dockerfile описва Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅:

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"]

Π˜ΠΌΠ°ΠΉΡ‚Π΅ ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄, Ρ‡Π΅ package.json сС ΠΊΠΎΠΏΠΈΡ€Π° ΠΈ инсталира ΠΎΡ‚Π΄Π΅Π»Π½ΠΎ ΠΎΡ‚ останалитС Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Π’ΠΎΠ²Π° сС ΠΏΡ€Π°Π²ΠΈ Π·Π° производитСлност, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° ΠΏΠ°ΠΏΠΊΠ°Ρ‚Π° /node_modules Π΄Π° сС ΠΊΠ΅ΡˆΠΈΡ€Π° ΠΏΡ€ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅. ВсСки ΠΊΠΎΠΌΠ°Π½Π΄Π΅Π½ Ρ€Π΅Π΄ сС ΠΊΠ΅ΡˆΠΈΡ€Π° ΠΎΡ‚Π΄Π΅Π»Π½ΠΎ.

Π’ края, ΠΊΠΎΠ³Π°Ρ‚ΠΎ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΡŠΡ‚ сС стартира, ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° сС изпълнява npm run dev. Π’Π°Π·ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π΅ описана Π² package.json:


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

Π—Π° стартиранС Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ ΠΎΡ‚ ΠΏΠ°ΠΏΠΊΠ° /дист, Π³Π»ΠΎΠ±Π°Π»Π½ΠΎ Π·Π°Π΄Π°Π΄Π΅Π½ http-serverΠΈ Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π° dev-dependencies spa-http-serverΠ·Π° Π΄Π° Π½Π°ΠΊΠ°Ρ€Π°Ρ‚Π΅ Vue Router Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ. Π€Π»Π°Π³ΡŠΡ‚ --push-state прСнасочва към index.html. Π”ΠΎΠ±Π°Π²Π΅Π½ Π΅ Ρ„Π»Π°Π³ΡŠΡ‚ -c със стойност 1 сСкунда http-ΡΡŠΡ€Π²ΡŠΡ€ Π½Π΅ ΠΊΠ΅ΡˆΠΈΡ€Π° скриптовС. Π’ΠΎΠ²Π° Π΅ тСстов ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² Ρ€Π΅Π°Π»Π΅Π½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π΅ ΠΏΠΎ-Π΄ΠΎΠ±Ρ€Π΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ nginx.

Π‘ΡŠΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΏΠΎΠ»Π΅ Π² ΠΌΠ°Π³Π°Π·ΠΈΠ½Π° Π½Π° Vuex apiHost: 'http://localhost:3000', ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ Π΅ написан NodeJS Api ΠΏΠΎΡ€Ρ‚. ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠ°Ρ‚Π° част Π΅ Π³ΠΎΡ‚ΠΎΠ²Π°. Π‘Π΅Π³Π° всички заявки ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° към Π·Π°Π΄Π½Π°Ρ‚Π° част ΠΎΡ‚ΠΈΠ²Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ·ΠΈ url.

NodeJS Server API

Π’ ΠΏΠ°ΠΏΠΊΠ° /server създавай server.js ΠΈ Dockerfile:


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

Π’ server.js посочСни URL Π·Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ const url = 'mongodb://mongo:27017/';. Π Π°Π·Ρ€Π΅ΡˆΠ°Π²Π°ΠΌΠ΅ ΠΌΠ΅ΠΆΠ΄ΡƒΠ΄ΠΎΠΌΠ΅ΠΉΠ½ заявки ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°:


const clientUrl = 'http://localhost:8081';
const corsOptions = {
  origin: clientUrl,
  optionsSuccessStatus: 200, // some legacy browsers (IE11, various SmartTVs) choke on 204
};
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));
  });

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π‘Π΅Π³Π° ΠΎΡ‚ΠΈΠ΄Π΅Ρ‚Π΅ Π² дирСкторията Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈ стартирайтС docker-compose build Π·Π° изобраТСния ΠΈ docker-compose up Π·Π° пусканС Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈ. ΠšΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° Ρ‰Π΅ ΠΏΠΎΠ²Π΄ΠΈΠ³Π½Π΅ 3 ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°: ΡΡŠΡ€Π²ΡŠΡ€, ΠΊΠ»ΠΈΠ΅Π½Ρ‚, mongo. Π—Π° NodeJS ΡΡŠΡ€Π²ΡŠΡ€ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Ρ‚Π΅ Π³ΠΎΡ€Π΅Ρ‰ΠΎ ΠΏΡ€Π΅Π·Π°Ρ€Π΅ΠΆΠ΄Π°Π½Π΅, ΠΊΠ°Ρ‚ΠΎ Π³ΠΎ ΡΠ²ΡŠΡ€ΠΆΠ΅Ρ‚Π΅ към потрСбитСлската ΠΏΠ°ΠΏΠΊΠ°. И ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡŠΡ‚ Π΅ Π² процСс Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°, Π·Π° Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ Π»ΠΎΠΊΠ°Π»Π½ΠΎ с Π³ΠΎΡ€Π΅Ρ‰ΠΎ ΠΏΡ€Π΅Π·Π°Ρ€Π΅ΠΆΠ΄Π°Π½Π΅, ΠΊΠ°Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΎΡ‚Π΄Π΅Π»Π½ΠΎ ΡΡŠΡ€Π²ΡŠΡ€ ΠΈ Монго. Π—Π° Π΄Π° стартиратС ΠΎΡ‚Π΄Π΅Π»Π½Π° услуга, просто посочСтС Π½Π΅ΠΉΠ½ΠΎΡ‚ΠΎ ΠΈΠΌΠ΅ docker-compose up client. НС забравяйтС Π΄Π° Π³ΠΎ ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ понякога prune ΠΈ ΠΏΡ€Π΅ΠΌΠ°Ρ…Π²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈ (ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈ), ΠΌΡ€Π΅ΠΆΠΈ (ΠΌΡ€Π΅ΠΆΠΈ) ΠΈ изобраТСния (изобраТСния), Π·Π° Π΄Π° сС освободят рСсурси.

ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅ пълния ΠΊΠΎΠ΄ Ρ‚ΡƒΠΊ. ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ΡŠΡ‚ всС ΠΎΡ‰Π΅ Π΅ Π² процСс Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: www.habr.com

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€