Kiel vi povas vidi el la antaŭa artikolo, mi laboris kun malsamaj projektoj. La unuaj tagoj en nova teamo kutime iras la saman vojon: la subtenanto sidiĝas al mi kaj plenumas la magiajn paŝojn por instali kaj deploji la aplikaĵon. Docker estas nemalhavebla por antaŭfinaj programistoj, ĉar. La backend ofte estas skribita en ampleksa gamo de PHP/Java/Python/C# stakoj kaj la fronto ne bezonas distri la malantaŭon ĉiufoje por instali kaj deploji ĉion. Nur en unu loko mi vidis aron da Docker-Jenkins kun travidebla deplojo, ŝtipoj, ŝraŭbitaj per aŭtotestoj.
Multaj detalaj artikoloj estis skribitaj pri docker. Ĉi tiu artikolo fokusiĝos pri deplojado de Unupaĝa Apliko per VueJS / Vue Router, la servila parto en formo de RESTful API kun NodeJS, kaj MongoDB estas uzata kiel datumbazo. Docker Compose estas uzata por priskribi kaj ruli plurajn ujajn aplikaĵojn.
Kial vi bezonas Docker
Docker permesas vin aŭtomatigi la procezon de deplojado de aplikaĵo. La programisto ne plu bezonas instali programojn memstare, trakti version nekongruon sur sia maŝino. Sufiĉas instali Docker kaj tajpi 1-2 komandojn en la konzolon. Estas plej oportune fari tion en Linukso.
Komencante
Instali
Dosierujo strukturo
Ni kreas 2 dosierujojn por klientaj kaj servilaj aplikaĵoj. Dosiero kun la etendo .yml estas agordo Docker Komponikie la aplikaj ujoj estas difinitaj kaj ligitaj.
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
Ni kreas 3 servojn en docker: por NodeJS, MongoDB kaj por statiko ĉe Vue. Por konekti klienton al servilo aldonita dependas de servilo. Por ligi MongoDB kun la servila API, uzu ligoj mongo. Servilo, kliento, mongo estas la nomoj de la servoj.
VueJS-kliento
En la dosierujo /kliento la aplikaĵo troviĝas sur VueJS. Apliko kreita kun
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"]
Notu, ke package.json estas kopiita kaj instalita aparte de la ceteraj projektdosieroj. Ĉi tio estas farita por agado, por ke la enhavo de la dosierujo /node_modules estu konservita en kaŝmemoro dum rekonstruo. Ĉiu komandlinio estas konservita aparte.
Ĉe la fino, kiam la ujo estas komencita, la komando estas efektivigita npm run dev
. Ĉi tiu komando estas priskribita en package.json:
"scripts": {
"test:dev": "http-server dist -p 8081 -c 1 --push-state"
}
Por ruli dosierojn el dosierujo /dist, tutmonde fiksita http-server
, kaj en dev-dependencies-pakaĵo spa-http-server
por ke Vue Router funkciu ĝuste. La flago --push-state alidirektas al index.html. La flago -c kun valoro de 1 sekundo estis aldonita al http-servilo ne kaŝmemoris skriptojn. Ĉi tio estas prova ekzemplo, en reala projekto estas pli bone uzi nginx.
Kreu kampon en la vendejo Vuex apiHost: 'http://localhost:3000'
, kie la haveno NodeJS Api estas skribita. La klienta parto estas preta. Nun ĉiuj petoj de la kliento ĝis la malantaŭo iras al ĉi tiu url.
NodeJS Server API
En la dosierujo /server
krei server.js kaj Dockerfile:
FROM node:10
WORKDIR /server
COPY ./package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
В server.js indikita url por datumbazo const url = 'mongodb://mongo:27017/';
. Ni permesas transdomajnajn petojn de la kliento:
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));
});
konkludo
Nun iru al la projekta dosierujo kaj rulu docker-compose build
por bildigo kaj docker-compose up
ruli ujojn. La komando levos 3 ujojn: servilo, kliento, mongo. Por NodeJS-servilo, vi povas agordi varman reŝargon ligante ĝin al la uzanta dosierujo. Kaj la kliento estas evoluinta por funkcii loke kun varma reŝargi, funkciante aparte servilo и Mongo. Por komenci apartan servon, simple specifu ĝian nomon docker-compose up client
. Ne forgesu fari ĝin foje prune
kaj forigo de ujoj (ujoj), retoj (retoj) kaj bildoj (bildoj) por liberigi rimedojn.
Vi povas vidi la plenan kodon
fonto: www.habr.com