Som du kan se fra den forrige artikel, arbejdede jeg med forskellige projekter. De første dage i et nyt team går normalt på samme måde: Backenderen sætter sig ned til mig og udfører de magiske trin for at installere og implementere applikationen. Docker er uundværlig for frontend-udviklere, fordi. Backend er ofte skrevet i en bred vifte af PHP/Java/Python/C# stakke, og fronten behøver ikke at distrahere bagsiden hver gang for at installere og implementere alt. Kun ét sted så jeg en flok Docker-Jenkins med en gennemsigtig implementering, logfiler, skruet sammen med autotest.
Der er skrevet mange detaljerede artikler om docker. Denne artikel vil fokusere på at implementere en Single Page Application ved hjælp af VueJS / Vue Router, serverdelen i form af en RESTful API med NodeJS, og MongoDB bruges som en database. Docker Compose bruges til at beskrive og køre flere containerapplikationer.
Hvorfor har du brug for Docker
Docker giver dig mulighed for at automatisere processen med at implementere en applikation. Udvikleren behøver ikke længere at installere programmer på egen hånd, håndtere versionsinkompatibilitet på sin maskine. Det er nok at installere Docker og skrive 1-2 kommandoer i konsollen. Det er mest praktisk at gøre dette på Linux.
Kom godt i gang
Indstil
Mappestruktur
Vi opretter 2 mapper til klient- og serverapplikationer. En fil med filtypenavnet .yml er en konfiguration Docker komponerehvor applikationsbeholderne er defineret og sammenkædet.
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
Vi opretter 3 tjenester i docker: til NodeJS, MongoDB og til statik på Vue. For at forbinde klient til server tilføjet afhænger af serveren. For at forbinde MongoDB med server-API'en skal du bruge links mongo. Server, klient, mongo er navnene på tjenesterne.
VueJS klient
I mappe /klient applikationen er placeret på VueJS. Applikation oprettet med
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"]
Bemærk, at package.json kopieres og installeres separat fra resten af projektfilerne. Dette gøres for ydeevnen, så indholdet af mappen /node_modules cachelagres ved genopbygning. Hver kommandolinje cachelagres separat.
Til sidst, når beholderen startes, udføres kommandoen npm run dev
. Denne kommando er beskrevet i package.json:
"scripts": {
"test:dev": "http-server dist -p 8081 -c 1 --push-state"
}
For at køre filer fra en mappe / dist, globalt indstillet http-server
, og i dev-dependencies-pakken spa-http-server
for at få Vue Router til at fungere korrekt. --push-state flaget omdirigerer til index.html. -c-flaget med en værdi på 1 sekund er blevet tilføjet http-server cachelagde ikke scripts. Dette er et testeksempel, på et rigtigt projekt er det bedre at bruge nginx.
Opret et felt i Vuex-butikken apiHost: 'http://localhost:3000'
, hvor NodeJS Api-porten er skrevet. Klientdelen er klar. Nu går alle anmodninger fra klienten til bagenden til denne url.
NodeJS Server API
I mappe /server
skab server.js og Dockerfile:
FROM node:10
WORKDIR /server
COPY ./package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
В server.js angivet url til database const url = 'mongodb://mongo:27017/';
. Vi tillader anmodninger på tværs af domæner fra klienten:
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));
});
Konklusion
Gå nu til projektbiblioteket og kør docker-compose build
til billeddannelse og docker-compose up
at køre containere. Kommandoen vil løfte 3 containere: server, klient, mongo. For en NodeJS-server kan du konfigurere hot-reload ved at linke den til brugermappen. Og klienten er under udvikling til at køre lokalt med hot reload, kørende separat server и mongo. For at starte en separat tjeneste skal du blot angive dens navn docker-compose up client
. Glem ikke at gøre det nogle gange prune
og fjernelse af containere (containere), netværk (netværk) og billeder (billeder) for at frigøre ressourcer.
Du kan se den fulde kode
Kilde: www.habr.com