Kā var saprast no iepriekšējā raksta, es strādāju pie dažādiem projektiem. Pirmās dienas jaunā komandā parasti notiek tāpat: aizmugure apsēžas ar mani un veic maģiskas darbības, lai instalētu un izvietotu lietojumprogrammu. Docker ir neaizstājams priekšgala izstrādātājiem, jo... Aizmugursistēma bieži tiek rakstīta plašā PHP/Java/Python/C# skursteņu diapazonā, un priekšējai daļai nav jānovērš aizmugursistēmas uzmanība katru reizi, lai visu instalētu un izvietotu. Tikai vienā vietā es redzēju Docker-Jenkins kombināciju ar pārredzamu izvietošanu, žurnāliem un automatizētiem testiem.
Par Docker ir rakstīti daudzi detalizēti raksti. Šajā rakstā tiks runāts par vienas lapas lietojumprogrammas izvietošanu, izmantojot VueJS/Vue Router, servera daļa ir RESTful API formā ar NodeJS, un MongoDB tiek izmantota kā datu bāze. Docker Compose tiek izmantots, lai definētu un palaistu vairākas konteineru lietojumprogrammas.
Kāpēc Docker ir nepieciešams
Docker ļauj automatizēt lietojumprogrammas izvietošanas procesu. Izstrādātājam vairs nav jāinstalē programmas pašam vai jārisina versiju nesaderība savā datorā. Viss, kas jums jādara, ir instalēt Docker un konsolē ierakstīt 1-2 komandas. Ērtākais veids, kā to izdarīt, ir Linux.
Iesākumam
Komplekts
Mapju struktūra
Mēs izveidojam 2 mapes klienta un servera lietojumprogrammām. Fails ar paplašinājumu .yml ir konfigurācija Docker sastopas, kur ir definēti un saistīti lietojumprogrammu konteineri.
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
Docker veidojam 3 pakalpojumus: NodeJS, MongoDB un statiskajiem Vue. Pievienots, lai savienotu klientu ar serveri atkarīgs no servera. Lai saistītu MongoDB ar servera API, izmantojiet saites mongo. Serveris, klients, mongo - pakalpojumu nosaukumi.
VueJS klients
Mapē /klients Lietojumprogramma ir balstīta uz VueJS. Lietojumprogramma tika izveidota, izmantojot
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"]
Lūdzu, ņemiet vērā, ka fails package.json tiek kopēts un instalēts atsevišķi no pārējiem projekta failiem. Tas tiek darīts veiktspējas nodrošināšanai, lai, veidojot atkārtoti, mapes /node_modules saturs tiktu saglabāts kešatmiņā. Katra komandrinda tiek saglabāta kešatmiņā atsevišķi.
Visbeidzot, kad konteiners sākas, komanda tiek izpildīta npm run dev
. Šī komanda ir aprakstīta failā package.json:
"scripts": {
"test:dev": "http-server dist -p 8081 -c 1 --push-state"
}
Lai palaistu failus no mapes /dist, uzstādīts visā pasaulē http-server
, un dev-atkarībās pakotni spa-http-server
lai Vue maršrutētājs darbotos pareizi. Karogs --push-state novirza uz index.html. Tika pievienots karodziņš -c ar vērtību 1 sekunde http-serveris neglabāja skriptus kešatmiņā. Šis ir testa piemērs; reālā projektā labāk izmantot nginx.
Vuex veikalā mēs izveidojam lauku apiHost: 'http://localhost:3000'
, kur reģistrēts NodeJS Api ports. Klienta daļa ir gatava. Tagad visi klienta pieprasījumi tiek nosūtīti uz šo URL.
NodeJS servera API
Mapē /server
izveidot serveris.js un Dockerfile:
FROM node:10
WORKDIR /server
COPY ./package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
В serveris.js norādīts url datu bāzei const url = 'mongodb://mongo:27017/';
. Starpdomēnu pieprasījumu atļaušana no klienta:
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));
});
Secinājums
Tagad ejam uz projekta direktoriju un palaidīsim docker-compose build
attēlu konstruēšanai un docker-compose up
lai palaistu konteinerus. Komanda pacels 3 konteinerus: serveris, klients, mongo. NodeJS serverim varat konfigurēt karsto atkārtotu ielādi, saistot to ar lietotāja mapi. Un izstrādes stadijā esošais klients ir jāpalaiž lokāli ar karsto pārlādēšanu, kas darbojas atsevišķi serveris и Mongo. Lai sāktu atsevišķu pakalpojumu, vienkārši norādiet tā nosaukumu docker-compose up client
. Neaizmirstiet to darīt dažreiz prune
un konteineru, tīklu un attēlu dzēšana, lai atbrīvotu resursus.
Jūs varat redzēt pilnu kodu
Avots: www.habr.com