Com podeu veure a l'article anterior, he treballat amb diferents projectes. Els primers dies en un nou equip solen anar de la mateixa manera: el backender s'asseu a mi i fa els passos màgics per instal·lar i desplegar l'aplicació. Docker és indispensable per als desenvolupadors front-end, perquè. El backend sovint s'escriu en una àmplia gamma de piles PHP/Java/Python/C# i la part frontal no necessita distreure la part posterior cada vegada per instal·lar i desplegar-ho tot. Només en un lloc vaig veure un munt de Docker-Jenkins amb un desplegament transparent, registres, cargolats amb autotests.
S'han escrit molts articles detallats sobre Docker. Aquest article se centrarà a desplegar una aplicació de pàgina única mitjançant VueJS / Vue Router, la part del servidor en forma d'API RESTful amb NodeJS i MongoDB s'utilitza com a base de dades. Docker Compose s'utilitza per descriure i executar diverses aplicacions de contenidors.
Per què necessiteu Docker
Docker us permet automatitzar el procés de desplegament d'una aplicació. El desenvolupador ja no necessita instal·lar programes pel seu compte, fer front a la incompatibilitat de versions a la seva màquina. N'hi ha prou amb instal·lar Docker i escriure ordres 1-2 a la consola. El més convenient és fer-ho a Linux.
Getting started
Establir
Estructura de carpetes
Creem 2 carpetes per a aplicacions client i servidor. Un fitxer amb l'extensió .yml és una configuració Docker Composeon es defineixen i enllaçen els contenidors de l'aplicació.
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
Creem 3 serveis a docker: per a NodeJS, MongoDB i per a estàtica a Vue. S'ha afegit per connectar el client al servidor depèn del servidor. Per enllaçar MongoDB amb l'API del servidor, utilitzeu enllaços mongo. Servidor, client, mongo són els noms dels serveis.
Client VueJS
A la carpeta /client l'aplicació es troba a VueJS. Aplicació creada amb
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"]
Tingueu en compte que package.json es copia i s'instal·la per separat de la resta de fitxers del projecte. Això es fa per al rendiment de manera que el contingut de la carpeta /node_modules s'emmagatzemi a la memòria cau durant la reconstrucció. Cada línia d'ordres s'emmagatzema a la memòria cau per separat.
Al final, quan s'inicia el contenidor, s'executa l'ordre npm run dev
. Aquesta ordre es descriu a package.json:
"scripts": {
"test:dev": "http-server dist -p 8081 -c 1 --push-state"
}
Per executar fitxers des d'una carpeta /dist, establert globalment http-server
, i al paquet de dependències de desenvolupament spa-http-server
perquè Vue Router funcioni correctament. El senyalador --push-state redirigeix a index.html. S'ha afegit el senyalador -c amb un valor d'1 segon servidor http no guardava els scripts a la memòria cau. Aquest és un exemple de prova, en un projecte real és millor utilitzar nginx.
Creeu un camp a la botiga Vuex apiHost: 'http://localhost:3000'
, on s'escriu el port de l'API NodeJS. La part del client està preparada. Ara totes les sol·licituds del client al back-end van a aquesta URL.
API del servidor NodeJS
A la carpeta /server
crear server.js i Dockerfile:
FROM node:10
WORKDIR /server
COPY ./package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
В server.js indicat url per a la base de dades const url = 'mongodb://mongo:27017/';
. Permetem sol·licituds entre dominis del client:
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));
});
Conclusió
Ara aneu al directori del projecte i executeu-lo docker-compose build
per a la imatge i docker-compose up
per fer funcionar contenidors. L'ordre aixecarà 3 contenidors: servidor, client, mongo. Per a un servidor NodeJS, podeu configurar la recàrrega en calent enllaçant-lo a la carpeta d'usuari. I el client està en desenvolupament per executar-se localment amb recàrrega en calent, s'executa per separat servidor и mongo. Per iniciar un servei independent, només cal que especifiqueu el seu nom docker-compose up client
. No t'oblidis de fer-ho de vegades prune
i eliminació de contenidors (contenidors), xarxes (xarxes) i imatges (imatges) per alliberar recursos.
Podeu veure el codi complet
Font: www.habr.com