Όπως μπορείτε να δείτε από το προηγούμενο άρθρο, δούλεψα με διαφορετικά έργα. Οι πρώτες μέρες σε μια νέα ομάδα συνήθως πάνε με τον ίδιο τρόπο: το backender κάθεται κοντά μου και εκτελεί τα μαγικά βήματα για την εγκατάσταση και την ανάπτυξη της εφαρμογής. Το Docker είναι απαραίτητο για προγραμματιστές front-end, γιατί. Το backend είναι συχνά γραμμένο σε ένα ευρύ φάσμα στοίβων PHP/Java/Python/C# και το μπροστινό μέρος δεν χρειάζεται να αποσπά την προσοχή του πίσω μέρους κάθε φορά για να εγκαταστήσει και να αναπτύξει τα πάντα. Μόνο σε ένα μέρος είδα ένα σωρό Docker-Jenkins με διάφανη ανάπτυξη, κούτσουρα, βιδωμένα με autotests.
Πολλά αναλυτικά άρθρα έχουν γραφτεί για το docker. Αυτό το άρθρο θα επικεντρωθεί στην ανάπτυξη μιας εφαρμογής μιας σελίδας χρησιμοποιώντας VueJS / Vue Router, το τμήμα διακομιστή με τη μορφή RESTful API με NodeJS και το MongoDB χρησιμοποιείται ως βάση δεδομένων. Το Docker Compose χρησιμοποιείται για την περιγραφή και την εκτέλεση πολλαπλών εφαρμογών κοντέινερ.
Γιατί χρειάζεστε το Docker
Το Docker σάς επιτρέπει να αυτοματοποιήσετε τη διαδικασία ανάπτυξης μιας εφαρμογής. Ο προγραμματιστής δεν χρειάζεται πλέον να εγκαθιστά προγράμματα μόνος του, να αντιμετωπίζει την ασυμβατότητα της έκδοσης στον υπολογιστή του. Αρκεί να εγκαταστήσετε το Docker και να πληκτρολογήσετε 1-2 εντολές στην κονσόλα. Είναι πιο βολικό να το κάνετε αυτό στο Linux.
Ξεκινώντας
Σετ
Δομή φακέλου
Δημιουργούμε 2 φακέλους για εφαρμογές πελάτη και διακομιστή. Ένα αρχείο με επέκταση .yml είναι μια ρύθμιση παραμέτρων Docker Composeόπου ορίζονται και συνδέονται τα κοντέινερ της εφαρμογής.
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
Δημιουργούμε 3 υπηρεσίες στο docker: για NodeJS, MongoDB και για στατικά στο Vue. Για σύνδεση πελάτη με διακομιστή προστέθηκε εξαρτάται από τον διακομιστή. Για να συνδέσετε το MongoDB με το API διακομιστή, χρησιμοποιήστε συνδέσεις mongo. Διακομιστής, πελάτης, mongo είναι τα ονόματα των υπηρεσιών.
Πελάτης VueJS
Σε φάκελο /πελάτης η εφαρμογή βρίσκεται στο VueJS. Η εφαρμογή δημιουργήθηκε με
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"]
Σημειώστε ότι το package.json αντιγράφεται και εγκαθίσταται ξεχωριστά από τα υπόλοιπα αρχεία του έργου. Αυτό γίνεται για απόδοση, ώστε τα περιεχόμενα του φακέλου /node_modules να αποθηκευτούν στην προσωρινή μνήμη κατά την ανακατασκευή. Κάθε γραμμή εντολών αποθηκεύεται στην κρυφή μνήμη ξεχωριστά.
Στο τέλος, κατά την εκκίνηση του κοντέινερ, εκτελείται η εντολή npm run dev
. Αυτή η εντολή περιγράφεται στο package.json:
"scripts": {
"test:dev": "http-server dist -p 8081 -c 1 --push-state"
}
Για να εκτελέσετε αρχεία από έναν φάκελο /διστ, σε παγκόσμιο επίπεδο http-server
και σε πακέτο εξαρτήσεων dev spa-http-server
για να λειτουργήσει σωστά το Vue Router. Η σημαία --push-state ανακατευθύνει στο index.html. Προστέθηκε η σημαία -c με τιμή 1 δευτερόλεπτο http-διακομιστής δεν έκανε προσωρινή αποθήκευση σεναρίων. Αυτό είναι ένα παράδειγμα δοκιμής, σε ένα πραγματικό έργο είναι καλύτερο να χρησιμοποιήσετε το nginx.
Δημιουργήστε ένα πεδίο στο κατάστημα Vuex apiHost: 'http://localhost:3000'
, όπου είναι γραμμένη η θύρα NodeJS Api. Το τμήμα πελάτη είναι έτοιμο. Τώρα όλα τα αιτήματα από τον πελάτη προς το πίσω μέρος πηγαίνουν σε αυτό το url.
NodeJS Server API
Σε φάκελο /server
δημιουργώ διακομιστής.js και Dockerfile:
FROM node:10
WORKDIR /server
COPY ./package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
В διακομιστής.js υποδεικνύεται url για βάση δεδομένων const url = 'mongodb://mongo:27017/';
. Επιτρέπουμε αιτήματα μεταξύ τομέων από τον πελάτη:
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));
});
Συμπέρασμα
Τώρα μεταβείτε στον κατάλογο του έργου και εκτελέστε docker-compose build
για απεικόνιση και docker-compose up
να τρέχουν δοχεία. Η εντολή θα σηκώσει 3 κοντέινερ: διακομιστής, πελάτης, mongo. Για έναν διακομιστή NodeJS, μπορείτε να ρυθμίσετε τις παραμέτρους της hot-reload συνδέοντάς τον με το φάκελο χρήστη. Και ο πελάτης βρίσκεται υπό ανάπτυξη για να εκτελείται τοπικά με hot reload, που εκτελείται χωριστά διακομιστής и Mongo. Για να ξεκινήσετε μια ξεχωριστή υπηρεσία, απλώς καθορίστε το όνομά της docker-compose up client
. Μην ξεχνάτε να το κάνετε μερικές φορές prune
και αφαίρεση κοντέινερ (κοντέινερ), δικτύων (δίκτυα) και εικόνων (εικόνων) για την απελευθέρωση πόρων.
Μπορείτε να δείτε τον πλήρη κωδικό
Πηγή: www.habr.com