ááááşááąáŹááşá¸ááŤá¸áážáááşáá˝áąáˇááźááşáááŻááşáááşáĄáááŻááşá¸, ááŤáá˝á˛ááźáŹá¸ááźáŹá¸ááŹá¸ááąáŹáááąáŹááťááşááťáŹá¸áážááˇáşáĄááŻááşááŻááşáá˛áˇáááşá áĄáá˝á˛áˇáĄáá
áşáá
áşááŻá áááááŻáśá¸áááşááťáŹá¸áá˝ááş áĄááťáŹá¸áĄáŹá¸ááźááˇáş áá°ááŽáááş- back-end developer áááş ááťá˝ááşáŻááşáážááˇáşáĄáá°áááŻááşááźáŽá¸ áĄááşááşáááŻáááˇáşáá˝ááşá¸áááşáážááˇáş áĄááŻáśá¸ááźáŻáááş áážáąáŹáşáááşáááˇáşááŻááşááąáŹááşááťááşááťáŹá¸ááᯠááŻááşááąáŹááşáááşá Back-end ááᯠPHP/Java/Python/C# stacks áĄááťáŹá¸áĄááźáŹá¸áá˝ááş áááźáŹáá ááąá¸ááŹá¸ááŹá¸ááąáŹááźáąáŹááˇáş Front-end developer ááťáŹá¸áĄáá˝ááş ááážááááźá
áş áááŻáĄááşááźáŽá¸ áĄááŹáááşááááşá¸ááᯠáááˇáşáá˝ááşá¸áááşáážááˇáş áĄááŻáśá¸ááźáŻáááş áĄááŤáááŻááşá¸ áážáąáˇááŻáśá¸ááž back-end developer ááᯠáĄáŹááŻáśááźáąáŹááşá¸áááş ááááŻáĄááşááŤá áá˝ááˇáşáááşá¸ááźááşááŹá
á˝áŹáĄááŻáśá¸ááźáŻáážáŻá áážááşáááşá¸ááťáŹá¸áážááˇáş áá°á¸áá˝á˛ááŤáážáááąáŹ áĄáááŻáĄááťáąáŹááşá
ááşá¸áááşáážáŻááťáŹá¸ááŤáážáááąáŹ Docker-Jenkins áĄá
áŻáĄááąá¸ááᯠáá
áşááąááŹáááşá¸áá˝ááşáᏠááťá˝ááşáŻááşáá˝áąáˇáá˛áˇááááşá
Docker áážááˇáşáááşáááşááąáŹ áĄááąá¸á
áááşááąáŹááşá¸ááŤá¸ááťáŹá¸á
á˝áŹ áážáááŤáááşá á¤ááąáŹááşá¸ááŤá¸áá˝ááş VueJS/Vue Router áááŻáĄááŻáśá¸ááźáŻá Single Page Application áááźááˇáşááťááşáážáŻááᯠáá˝áąá¸áá˝áąá¸áááşááźá
áşááźáŽá¸á ááŹááŹáĄáááŻááşá¸áááş NodeJS ááźááˇáş RESTful API ááźá
áşááźáŽá¸ MongoDB ááᯠááąááŹááąáˇá
áşáĄááźá
áşáĄááŻáśá¸ááźáŻáááşá Docker Compose ááᯠáá˝ááşááááşáᏠáĄáááŽááąá¸áážááşá¸ááťáŹá¸á
á˝áŹááᯠááąáŹáşááźáááşáážááˇáş á
áááşáááşáĄáá˝ááş áĄááŻáśá¸ááźáŻáááşá
Docker ááᯠááŹááźáąáŹááˇáş áááŻáĄááşááŹáá˛á
Docker áááş áááˇáşáĄáŹá¸ áĄáááŽááąá¸áážááşá¸áá áşááŻááźááˇáşááťááşááźááşá¸ááŻááşáááşá¸á ááşááᯠáĄáááŻáĄááťáąáŹááşááŻááşááąáŹááşáááŻááşá áąááŤáááşá ááąáŹáˇááşáá˛ááąá¸ááŹá¸áá°áááş áá°áˇááŹááŹáá° ááááŻááááşááťáŹá¸ááᯠáááˇáşáá˝ááşá¸áááş ááááŻáĄááşááąáŹáˇáá˛á áá°áˇá ááşááąáŤáşáážá ááŹá¸áážááşá¸ááťáŹá¸á áááŻááşáááşáážáŻááážáááźááşá¸ááᯠáááŻááşááŻááşááŤá Docker áááŻáááˇáşáá˝ááşá¸ááźáŽá¸ console áá˝ááş 1-2 commands ááťáŹá¸áááŻááşáááˇáşáááşááŻáśááąáŹááşááŤáááşá áááşá¸ááᯠLinux áá˝ááşááźáŻááŻááşáááşáĄáááşááźáąááŻáśá¸ááźá áşáááşá
á áááşáá˛áˇáááş
áááˇáşáá˝ááşá¸á፠áážááˇáş
áááŻááŤáá˝á˛áˇá ááşá¸ááŻáś
ááááŻááşá¸áááˇáşáážááˇáş ááŹááŹáĄáááŽááąá¸áážááşá¸ááťáŹá¸áĄáá˝ááş áááŻááşáá˝á˛ á áᯠáááşááŽá¸ááŤá .yml extension ááŤááąáŹ áááŻááşáááş config ááźá
áşáááşá 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
ááťá˝ááşáŻááşáááŻáˇáááş Docker áá˝ááş áááşááąáŹááşáážáŻ 3 áᯠáááşááŽá¸áááş- NodeJSá MongoDB áĄáá˝ááş áážááˇáş Vue ááąáŤáşáážá statics áĄáá˝ááşá ááááŻááşá¸áááˇáşááᯠááŹááŹáážááˇáş ááťáááşáááşáááşá áááˇáşáá˝ááşá¸áá˛áˇáááşá server ááąáŤáşáá˝ááşáá°áááşáááşá. MongoDB ááᯠááŹáᏠAPI áážááˇáş ááťáááşáááşáááşá áĄááŻáśá¸ááźáŻááŤá mongo áááˇáşááşááťáŹá¸. ááŹááŹá clientá mongo â áááşááąáŹááşáážáŻááťáŹá¸ááĄáááşááťáŹá¸á
VueJS áá˝ááş ááąáŹááşáááş
áááŻááşáá˝á˛áá˛áážáŹ /ááąáŹááşáááş ááťážáąáŹááşáá˝ážáŹáááş VueJS áá˝ááşáááşáážááááşá áĄáááŽááąá¸áážááşá¸ááᯠáĄááŻáśá¸ááźáŻá áááşááŽá¸ááŹá¸áááşá . ááŻááşááŻáśáá áşááŻáááşááąáŹááşááąáŹáĄááŤá client áĄáááŽááąá¸áážááşá¸ááᯠáááŻááŤáážá static áááŻááşááťáŹá¸áĄá áŻáĄááąá¸áá˝ááşáááşááąáŹááşááŹá¸áááşá /dist. Dockerfile áááş ááŻáśáá áşááŻáááşááąáŹááşáááşáĄáá˝ááş command áĄá áŻáśááᯠááąáŹáşááźáááş-
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 áááŻááŤááĄááźáąáŹááşá¸áĄááŹááťáŹá¸ááᯠáááşáážáşááŻááşáááşáĄáá˝ááş á á˝ááşá¸ááąáŹááşáááşáĄáá˝ááş ááŻááşááąáŹááşááŤáááşá command line áá áşááŻá áŽááᯠááŽá¸ááźáŹá¸á Ꭰááááşá¸áááşá¸ááŹá¸áááşá
ááąáŹááşááŻáśá¸áá˝ááşá container á
áááşááąáŹáĄááŤá command áááŻááŻááşááąáŹááşáááşá npm run dev. á¤áĄááááˇáşááᯠpackage.json áá˝ááş ááąáŹáşááźááŹá¸ááŤáááşá
"scripts": {
"test:dev": "http-server dist -p 8081 -c 1 --push-state"
}
áááŻááŤáá
áşááŻááž áááŻááşááťáŹá¸ááᯠáá˝ááˇáşáááş /distáá
áşááášááŹááŻáśá¸áá˝ááş áááşáááşááŹá¸áááşá http-serveráážááˇáş dev-dependencies áá˝ááş package ááᯠspa-http-serveráááŻáˇááźáąáŹááˇáş Vue Router áážááşáááşá
á˝áŹáĄááŻááşááŻááşáááŻááşá
áąáááşá --push-state áĄááśáááş index.html áááŻáˇ ááźááşáá˝ážááşá¸áááşá áááŻáˇááźáąáŹááˇáş 1 á
áášáááˇáşáááşáááŻá¸áážáááąáŹ -c áĄááśááᯠááąáŤááşá¸áááˇáşáááşá http-server áááşáážáş scripts áá˝áą áááŤáá°á¸á á¤áááşáážáŹ á
ááşá¸áááşáážáŻáĽáááŹáá
áşááŻááźá
áşááźáŽá¸ ááááˇáşáááąáŹááťááşáá
áşááŻáá˝ááş nginx áááŻáĄááŻáśá¸ááźáŻááźááşá¸á áááŻááąáŹááşá¸áááşá
Vuex á
áááŻá¸áá˝ááş ááťá˝ááşáŻááşáááŻáˇáááş áĄáá˝ááşáá
áşááŻááᯠáááşááŽá¸áááşá apiHost: 'http://localhost:3000'NodeJS Api ááááşáááşá¸ááᯠáážááşááŻáśáááşááŹá¸ááŹá ááąáŹááşáááşáĄáááŻááşá¸ áĄáááşáááˇáşááźá
áşááŤááźáŽá ááᯠClient ááž ááąáŹááşááťáąáŹáááŻáˇ ááąáŹááşá¸áááŻááťááşááťáŹá¸áĄáŹá¸ááŻáśá¸ááẠᤠurl áááŻáˇáá˝áŹá¸ááŤá
NodeJS ááŹáᏠAPI
áááŻááşáá˝á˛áá˛áážáŹ /server ááŤáááŻáˇáááşááŽá¸áááşá server.js áážááˇáş Dockerfile-
FROM node:10
WORKDIR /server
COPY ./package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
Đ server.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 áá˝ááşááááşááŹááťáŹá¸áááŻáá˝ááˇáşáááşá command áááş container 3 ááŻáááŻá
áááşááááˇáşáááş- serverá clientá mongo. NodeJS ááŹááŹáĄáá˝ááşá áááşá¸ááᯠáĄááŻáśá¸ááźáŻáá°áááŻááşáá˝á˛áááŻáˇ ááťáááşáááşááźááşá¸ááźááˇáş hot-reload ááᯠáááş configure ááŻááşáááŻááşááŤáááşá áážááˇáş áá˝áśáˇááźááŻá¸áááŻá¸áááşáážáŻáĄáááˇáşáážá ááááŻááşá¸áááˇáşááᯠááŽá¸ááźáŹá¸á
áááşáá˝ááˇáşááźáŽá¸ hot reload ááźááˇáş ááźááşáá˝ááşá¸áá˝ááş á
áááşáááŻááşáááşá ááŹááŹá и MongoááŽá¸ááźáŹá¸áááşááąáŹááşáážáŻáá
áşáᯠá
áááşáááş áááşá¸ááĄáááşááᯠáááşáážááşááŤá docker-compose up client. áááŤáááśááŻááşáááşáááąáˇááŤáážááˇáş prune áĄáááşá¸áĄááźá
áşááťáŹá¸ááᯠáááşáážáŹá¸áááş áá˝ááşááááşááŹááťáŹá¸á áá˝ááşáááşááťáŹá¸áážááˇáş ááŻáśááťáŹá¸ááᯠáááşáážáŹá¸ááŤá
ááŻááşáĄááźááˇáşáĄá
áŻáśááᯠááźááˇáşáážáŻáááŻááşááŤáááşá áááąáŹááťááşáááş áá˝áśáˇááźááŻá¸áááŻá¸áááşááąá¸ áĄáááˇáşáá˝ááşáᏠáážáááąá¸áááşá
source: www.habr.com
