Kaip supratote iš ankstesnio straipsnio, dirbau su įvairiais projektais. Pirmosios dienos naujoje komandoje paprastai praeina taip pat: su manimi atsisėda backender ir atlieka magiškus veiksmus, kad įdiegtų ir diegtų programą. „Docker“ yra būtinas priekinės dalies kūrėjams, nes... Užpakalinė programa dažnai rašoma įvairiuose PHP/Java/Python/C# kaminuose, o priekinė dalis neturi kiekvieną kartą atitraukti užpakalinės dalies, kad būtų galima viską įdiegti ir įdiegti. Tik vienoje vietoje mačiau „Docker-Jenkins“ derinį su skaidriu diegimu, žurnalais ir automatizuotais testais.
Apie Docker parašyta daug išsamių straipsnių. Šiame straipsnyje bus kalbama apie vieno puslapio programos diegimą naudojant VueJS / Vue Router, serverio dalis yra RESTful API su NodeJS forma, o MongoDB naudojama kaip duomenų bazė. „Docker Compose“ naudojama kelioms konteinerio programoms apibrėžti ir paleisti.
Kodėl Docker reikalingas
„Docker“ leidžia automatizuoti programos diegimo procesą. Kūrėjui nebereikia pačiam diegti programų ar spręsti versijų nesuderinamumo savo kompiuteryje. Viskas, ką jums reikia padaryti, tai įdiegti „Docker“ ir į konsolę įvesti 1–2 komandas. Patogiausias būdas tai padaryti yra Linux.
Darbo pradžia
Nustatyti
Aplanko struktūra
Sukuriame 2 aplankus kliento ir serverio programoms. Failas su plėtiniu .yml yra konfigūracija "Docker Compose", kur apibrėžiami ir susieti taikomųjų programų konteineriai.
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
Sukuriame 3 paslaugas Docker: NodeJS, MongoDB ir statinėms Vue. Pridėta norint prijungti klientą prie serverio priklauso nuo serverio. Norėdami susieti MongoDB su serverio API, naudokite nuorodos mongo. Serveris, klientas, mongo – paslaugų pavadinimai.
VueJS klientas
Aplanke /klientas Programa yra pagrįsta VueJS. Programa buvo sukurta naudojant
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"]
Atminkite, kad paketas.json yra nukopijuotas ir įdiegiamas atskirai nuo kitų projekto failų. Tai daroma dėl našumo priežasčių, kad aplanko /node_modules turinys būtų išsaugotas talpykloje vėl kuriant. Kiekviena komandų eilutė talpykloje saugoma atskirai.
Galiausiai, kai konteineris paleidžiamas, komanda vykdoma npm run dev
. Ši komanda aprašyta pakete.json:
"scripts": {
"test:dev": "http-server dist -p 8081 -c 1 --push-state"
}
Norėdami paleisti failus iš aplanko /dist, įdiegta visame pasaulyje http-server
, o dev-priklausomybėse paketą spa-http-server
kad „Vue Router“ veiktų tinkamai. Žymėjimas --push-state nukreipia į index.html. Prie pridėta vėliavėlė -c, kurios reikšmė yra 1 sekundė http-serveris nepaliko talpyklos scenarijų. Tai yra bandomasis pavyzdys realiame projekte geriau naudoti nginx.
Vuex parduotuvėje sukuriame lauką apiHost: 'http://localhost:3000'
, kur užregistruotas NodeJS Api prievadas. Kliento dalis yra paruošta. Dabar visos kliento užklausos nukreipiamos į šį URL.
NodeJS serverio API
Aplanke /server
sukurti server.js ir Dockerfile:
FROM node:10
WORKDIR /server
COPY ./package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
В server.js nurodytas URL duomenų bazei const url = 'mongodb://mongo:27017/';
. Kliento kelių domenų užklausų leidimas:
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));
});
išvada
Dabar eikime į projekto katalogą ir paleiskite docker-compose build
vaizdams kurti ir docker-compose up
paleisti konteinerius. Komanda pakels 3 konteinerius: serveris, klientas, mongo. Jei naudojate NodeJS serverį, galite sukonfigūruoti greitąjį įkėlimą, susiedami jį su vartotojo aplanku. O kuriamas klientas turėtų būti paleistas lokaliai su karštu perkrovimu, veikiant atskirai serveris и Mongo. Norėdami pradėti atskirą paslaugą, tiesiog nurodykite jos pavadinimą docker-compose up client
. Nepamirškite kartais tai padaryti prune
ir konteinerių, tinklų ir vaizdų ištrynimas, kad būtų atlaisvinti ištekliai.
Galite pamatyti visą kodą
Šaltinis: www.habr.com