ื›ื™ืฆื“ ืœืืจื•ื– ื™ื™ืฉื•ื VueJS + NodeJS + MongoDB ื‘-Docker

ื›ื™ืฆื“ ืœืืจื•ื– ื™ื™ืฉื•ื VueJS + NodeJS + MongoDB ื‘-Docker
ื›ืคื™ ืฉื ื™ืชืŸ ืœื”ื‘ื™ืŸ ืžื”ืžืืžืจ ื”ืงื•ื“ื, ืขื‘ื“ืชื™ ืขืœ ืคืจื•ื™ืงื˜ื™ื ืฉื•ื ื™ื. ื”ื™ืžื™ื ื”ืจืืฉื•ื ื™ื ื‘ืฆื•ื•ืช ื—ื“ืฉ ื‘ื“ืจืš ื›ืœืœ ืžืชื ื”ืœื™ื ื‘ืื•ืชื” ื”ื“ืจืš: ื”-backender ื™ื•ืฉื‘ ืื™ืชื™ ื•ืžื‘ืฆืข ืคืขื•ืœื•ืช ืงืกื•ืžื•ืช ืœื”ืชืงื ื” ื•ืคืจื™ืกื” ืฉืœ ื”ืืคืœื™ืงืฆื™ื”. Docker ื”ื•ื ื”ื›ืจื—ื™ ืขื‘ื•ืจ ืžืคืชื—ื™ ืงืฆื” ืžื›ื™ื•ื•ืŸ... ื”ืงืฆื” ื”ืื—ื•ืจื™ ื›ืชื•ื‘ ืœืจื•ื‘ ื‘ืžื’ื•ื•ืŸ ืจื—ื‘ ืฉืœ ืขืจื™ืžื•ืช PHP/Java/Python/C#, ื•ื”ื—ื–ื™ืช ืœื ืฆืจื™ื›ื” ืœื”ืกื™ื— ืืช ื“ืขืชื• ืฉืœ ื”ืงืฆื” ื”ืื—ื•ืจื™ ื‘ื›ืœ ืคืขื ื›ื“ื™ ืœื”ืชืงื™ืŸ ื•ืœืคืจื•ืก ื”ื›ืœ. ืจืง ื‘ืžืงื•ื ืื—ื“ ืจืื™ืชื™ ืฉื™ืœื•ื‘ ืฉืœ Docker-Jenkins ืขื ืคืจื™ืกื” ืฉืงื•ืคื”, ื™ื•ืžื ื™ื ื•ื‘ื“ื™ืงื•ืช ืื•ื˜ื•ืžื˜ื™ื•ืช.

ืžืืžืจื™ื ืžืคื•ืจื˜ื™ื ืจื‘ื™ื ื ื›ืชื‘ื• ืขืœ Docker. ืžืืžืจ ื–ื” ื™ื“ื‘ืจ ืขืœ ืคืจื™ืกืช ื™ื™ืฉื•ื ืขืžื•ื“ ื‘ื•ื“ื“ ื‘ืืžืฆืขื•ืช VueJS/Vue Router, ื—ืœืง ื”ืฉืจืช ื”ื•ื ื‘ืฆื•ืจื” ืฉืœ RESTful API ืขื NodeJS, ื•- MongoDB ืžืฉืžืฉ ื›ื‘ืกื™ืก ื ืชื•ื ื™ื. Docker Compose ืžืฉืžืฉ ื›ื“ื™ ืœื”ื’ื“ื™ืจ ื•ืœื”ืคืขื™ืœ ื™ื™ืฉื•ืžื™ ืžื™ื›ืœ ืžืจื•ื‘ื™ื.

ืœืžื” ืฆืจื™ืš Docker

Docker ืžืืคืฉืจ ืœืš ืœื”ืคื•ืš ืืช ืชื”ืœื™ืš ืคืจื™ืกืช ื”ื™ื™ืฉื•ื ืœืื•ื˜ื•ืžื˜ื™. ื”ืžืคืชื— ื›ื‘ืจ ืœื ืฆืจื™ืš ืœื”ืชืงื™ืŸ ืชื•ื›ื ื™ื•ืช ื‘ืขืฆืžื• ืื• ืœื”ืชืžื•ื“ื“ ืขื ืื™ ืชืื™ืžื•ืช ื’ืจืกืื•ืช ื‘ืžื—ืฉื‘ ืฉืœื•. ื›ืœ ืžื” ืฉืืชื” ืฆืจื™ืš ืœืขืฉื•ืช ื”ื•ื ืœื”ืชืงื™ืŸ ืืช Docker ื•ืœื”ืงืœื™ื“ 1-2 ืคืงื•ื“ื•ืช ื‘ืงื•ื ืกื•ืœื”. ื”ื“ืจืš ื”ื ื•ื—ื” ื‘ื™ื•ืชืจ ืœืขืฉื•ืช ื–ืืช ื”ื™ื ื‘ืœื™ื ื•ืงืก.

ืชื—ื™ืœืช ืขื‘ื•ื“ื”

ืœื”ืชืงื™ืŸ ืกึทื•ึธืจ ื• ื“ื•ืงืจ ืžืœื—ื™ืŸ

ืžื‘ื ื” ืชื™ืงื™ื•ืช

ืื ื• ื™ื•ืฆืจื™ื 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 ืฉืœ ื”ืฉืจืช, ื”ืฉืชืžืฉ ืงื™ืฉื•ืจื™ื ืžื•ื ื’ื•. ืฉืจืช, ืœืงื•ื—, ืžื•ื ื’ื• - ืฉืžื•ืช ืฉื™ืจื•ืชื™ื.

ืœืงื•ื— VueJS

ื‘ืชื™ืงื™ื™ื” /ืœึธืงื•ึผื—ึท ื”ืืคืœื™ืงืฆื™ื” ืžื‘ื•ืกืกืช ืขืœ VueJS. ื”ืืคืœื™ืงืฆื™ื” ื ื•ืฆืจื” ื‘ืืžืฆืขื•ืช Vue Cli. ื‘ืขืช ื‘ื ื™ื™ืช ืชืžื•ื ื”, ื™ื™ืฉื•ื ื”ืœืงื•ื— ืžื•ื‘ื ื” ื‘ืชื•ืš ืงื‘ื•ืฆื” ืฉืœ ืงื‘ืฆื™ื ืกื˜ื˜ื™ื™ื ื‘ืชื™ืงื™ื™ื” / dist. ื”-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"
}

ื›ื“ื™ ืœื”ืคืขื™ืœ ืงื‘ืฆื™ื ืžืชื™ืงื™ื” / dist, ืžื•ืชืงืŸ ื‘ืจื—ื‘ื™ ื”ืขื•ืœื http-server, ื•ื‘ืชืœื•ืช ื‘-dev ื”ื—ื‘ื™ืœื” spa-http-serverื›ืš ืฉื ืชื‘ Vue ื™ืขื‘ื•ื“ ื ื›ื•ืŸ. ื”ื“ื’ืœ --push-state ืžืคื ื” ืžื—ื“ืฉ ืืœ index.html. ื“ื’ืœ -c ืขื ืขืจืš ืฉืœ ืฉื ื™ื™ื” ืื—ืช ื ื•ืกืฃ http- ืฉืจืช ืœื ืฉืžืจ ืกืงืจื™ืคื˜ื™ื. ื–ื•ื”ื™ ื“ื•ื’ืžื” ืœื‘ื“ื™ืงื”; ื‘ืคืจื•ื™ืงื˜ ืืžื™ืชื™ ืขื“ื™ืฃ ืœื”ืฉืชืžืฉ ื‘-nginx.

ื‘ื—ื ื•ืช Vuex ืื ื• ื™ื•ืฆืจื™ื ืฉื“ื” apiHost: 'http://localhost:3000', ืฉื‘ื• ืจืฉื•ืžื” ื™ืฆื™ืืช ื”-NodeJS Api. ื—ืœืง ื”ืœืงื•ื— ืžื•ื›ืŸ. ื›ืขืช ื›ืœ ื”ื‘ืงืฉื•ืช ืžื”ืœืงื•ื— ืžืื—ื•ืจ ืขื•ื‘ืจื•ืช ืœื›ืชื•ื‘ืช ื”ืืชืจ ื”ื–ื•.

API ืฉืœ ืฉืจืช NodeJS

ื‘ืชื™ืงื™ื™ื” /server ืœึดื™ืฆื•ึนืจ server.js ื•- Dockerfile:


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

ะ’ server.js ืฆื•ื™ืŸ ื›ืชื•ื‘ืช ืืชืจ ืขื‘ื•ืจ ืžืกื“ ื ืชื•ื ื™ื 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 ืžื›ื•ืœื•ืช: ืฉืจืช, ืœืงื•ื—, ืžื•ื ื’ื•. ืขื‘ื•ืจ ืฉืจืช NodeJS, ืืชื” ื™ื›ื•ืœ ืœื”ื’ื“ื™ืจ ื˜ืขื™ื ื” ืžื—ื“ืฉ ืขืœ ื™ื“ื™ ืงื™ืฉื•ืจื• ืœืชื™ืงื™ื™ืช ื”ืžืฉืชืžืฉ. ื•ื”ืœืงื•ื— ื‘ืคื™ืชื•ื— ืฆืจื™ืš ืœื”ื™ื•ืช ืžื•ืฉืง ืžืงื•ืžื™ืช ืขื ื˜ืขื™ื ื” ื—ื•ื–ืจืช ื—ืžื”, ื”ืคื•ืขืœืช ื‘ื ืคืจื“ ืฉืจืช ะธ ืžื•ื ื’ื•. ื›ื“ื™ ืœื”ืชื—ื™ืœ ืฉื™ืจื•ืช ื ืคืจื“, ืคืฉื•ื˜ ืฆื™ื™ืŸ ืืช ืฉืžื• docker-compose up client. ืืœ ืชืฉื›ื— ืœืขืฉื•ืช ืืช ื–ื” ืœืคืขืžื™ื prune ื•ืžื—ื™ืงืช ืงื•ื ื˜ื™ื™ื ืจื™ื, ืจืฉืชื•ืช ื•ืชืžื•ื ื•ืช ื›ื“ื™ ืœืคื ื•ืช ืžืฉืื‘ื™ื.

ืืชื” ื™ื›ื•ืœ ืœืจืื•ืช ืืช ื”ืงื•ื“ ื”ืžืœื ื›ืืŸ. ื”ืคืจื•ื™ืงื˜ ืขื“ื™ื™ืŸ ื‘ืคื™ืชื•ื—.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”