Docker์—์„œ VueJS + NodeJS + MongoDB ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํŒจํ‚ค์ง•ํ•˜๋Š” ๋ฐฉ๋ฒ•

Docker์—์„œ VueJS + NodeJS + MongoDB ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํŒจํ‚ค์ง•ํ•˜๋Š” ๋ฐฉ๋ฒ•
์ด์ „ ๊ธฐ์‚ฌ์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ์ €๋Š” ๋‹ค์–‘ํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ํŒ€์˜ ์ฒซ ๋‚ ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋ฐฑ์—”๋”๊ฐ€ ๋‚˜์™€ ํ•จ๊ป˜ ์•‰์•„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ค์น˜ํ•˜๊ณ  ๋ฐฐํฌํ•˜๋Š” ๋งˆ๋ฒ• ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. Docker๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์—†์–ด์„œ๋Š” ์•ˆ๋˜๋Š” ์กด์žฌ์ž…๋‹ˆ๋‹ค. ๋ฐฑ์—”๋“œ๋Š” ๊ด‘๋ฒ”์œ„ํ•œ PHP/Java/Python/C# ์Šคํƒ์œผ๋กœ ์ž‘์„ฑ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์œผ๋ฉฐ, ํ”„๋ก ํŠธ๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์„ค์น˜ํ•˜๊ณ  ๋ฐฐํฌํ•  ๋•Œ๋งˆ๋‹ค ๋ฐฑ์—”๋“œ๋ฅผ ๋ฐฉํ•ดํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํˆฌ๋ช…ํ•œ ๋ฐฐํฌ, ๋กœ๊ทธ ๋ฐ ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฐ–์ถ˜ Docker-Jenkins ์กฐํ•ฉ์„ ํ•œ ๊ณณ์—์„œ๋งŒ ๋ณผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

Docker์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๊ธฐ์‚ฌ๊ฐ€ ๋งŽ์ด ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ์‚ฌ์—์„œ๋Š” VueJS/Vue Router๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹จ์ผ ํŽ˜์ด์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„ ๋ถ€๋ถ„์€ NodeJS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” RESTful API ํ˜•์‹์ด๋ฉฐ MongoDB๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. Docker Compose๋Š” ์—ฌ๋Ÿฌ ์ปจํ…Œ์ด๋„ˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ •์˜ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋„์ปค๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

Docker๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ๋” ์ด์ƒ ์Šค์Šค๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์ปดํ“จํ„ฐ์˜ ๋ฒ„์ „ ๋น„ํ˜ธํ™˜์„ฑ์„ ์ฒ˜๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. Docker๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์ฝ˜์†”์— 1~2๊ฐœ์˜ ๋ช…๋ น์„ ์ž…๋ ฅํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฐ€์žฅ ํŽธ๋ฆฌํ•œ ๋ฐฉ๋ฒ•์€ Linux๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‹œ์ž‘ํ•˜๊ธฐ

์„ธํŠธ ๋„์ปค ๊ณผ ๋„์ปค ์ž‘์„ฑ

ํด๋” ๊ตฌ์กฐ

ํด๋ผ์ด์–ธํŠธ ๋ฐ ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์šฉ์œผ๋กœ 2๊ฐœ์˜ ํด๋”๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. .yml ํ™•์žฅ์ž๋ฅผ ๊ฐ€์ง„ ํŒŒ์ผ์€ ๊ตฌ์„ฑ์ž…๋‹ˆ๋‹ค. ๋„์ปค ์ž‘์„ฑ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ •์˜๋˜๊ณ  ์—ฐ๊ฒฐ๋˜๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค.
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์—์„œ NodeJS, MongoDB ๋ฐ Vue์˜ ์ •์  ์„œ๋น„์Šค์˜ 3๊ฐ€์ง€ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋ฅผ ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€๋จ ์„œ๋ฒ„์— ๋”ฐ๋ผ ๋‹ค๋ฆ„. MongoDB๋ฅผ ์„œ๋ฒ„ API์™€ ์—ฐ๊ฒฐํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ๋งํฌ ๋ชฝ๊ณ . ์„œ๋ฒ„, ํด๋ผ์ด์–ธํŠธ, ๋ชฝ๊ณ  - ์„œ๋น„์Šค ์ด๋ฆ„.

VueJS ํด๋ผ์ด์–ธํŠธ

ํด๋”์— /๊ณ ๊ฐ ์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ VueJS๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ทฐ ํด๋ฆฌ. ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•  ๋•Œ ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ํด๋”์˜ ์ •์  ํŒŒ์ผ ์„ธํŠธ์— ๋‚ด์žฅ๋ฉ๋‹ˆ๋‹ค. /๊ฑฐ๋ฆฌ. Dockerfile์€ ์ด๋ฏธ์ง€ ๋นŒ๋“œ๋ฅผ ์œ„ํ•œ ๋ช…๋ น ์„ธํŠธ๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

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, ๊ทธ๋ฆฌ๊ณ  ๊ฐœ๋ฐœ ์ข…์†์„ฑ์—์„œ ํŒจํ‚ค์ง€ spa-http-serverVue Router๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. --push-state ํ”Œ๋ž˜๊ทธ๋Š” index.html๋กœ ๋ฆฌ๋””๋ ‰์…˜๋ฉ๋‹ˆ๋‹ค. ๊ฐ’์ด 1์ดˆ์ธ -c ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋‹ค์Œ์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. http ์„œ๋ฒ„ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์บ์‹œํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ…Œ์ŠคํŠธ ์˜ˆ์‹œ์ด๋ฏ€๋กœ ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” nginx๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

Vuex ์Šคํ† ์–ด์—์„œ ํ•„๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. apiHost: 'http://localhost:3000', NodeJS Api ํฌํŠธ๊ฐ€ ๋“ฑ๋ก๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ ๋ถ€๋ถ„์ด ์ค€๋น„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ฐฑ์œผ๋กœ ๋ณด๋‚ด๋Š” ๋ชจ๋“  ์š”์ฒญ์ด ์ด URL๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

NodeJS ์„œ๋ฒ„ 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๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋“ค์–ด์˜ฌ๋ฆฝ๋‹ˆ๋‹ค. ์„œ๋ฒ„, ํด๋ผ์ด์–ธํŠธ, ๋ชฝ๊ณ . NodeJS ์„œ๋ฒ„์˜ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ํด๋”์— ์—ฐ๊ฒฐํ•˜์—ฌ ํ•ซ ๋ฆฌ๋กœ๋“œ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐœ๋ฐœ ์ค‘์ธ ํด๋ผ์ด์–ธํŠธ๋Š” ํ•ซ ๋ฆฌ๋กœ๋“œ๋ฅผ ํ†ตํ•ด ๋กœ์ปฌ์—์„œ ์‹œ์ž‘๋˜์–ด์•ผ ํ•˜๋ฉฐ ๋ณ„๋„๋กœ ์‹คํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์„ฌ๊ธฐ๋Š” ์‚ฌ๋žŒ ะธ ๋ชฝ๊ณ . ๋ณ„๋„์˜ ์„œ๋น„์Šค๋ฅผ ์‹œ์ž‘ํ•˜๋ ค๋ฉด ์ด๋ฆ„์„ ์ง€์ •ํ•˜์„ธ์š”. docker-compose up client. ๊ฐ€๋” ์žŠ์ง€ ๋ง๊ณ  ๊ผญ ํ•ด๋ณด์„ธ์š” prune ์ปจํ…Œ์ด๋„ˆ, ๋„คํŠธ์›Œํฌ, ์ด๋ฏธ์ง€๋ฅผ ์‚ญ์ œํ•˜์—ฌ ๋ฆฌ์†Œ์Šค๋ฅผ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค.

์ „์ฒด ์ฝ”๋“œ๋ฅผ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ์—ฌ๊ธฐ์—. ์ด ํ”„๋กœ์ ํŠธ๋Š” ์•„์ง ๊ฐœ๋ฐœ ์ค‘์ž…๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€