์ด์ ๊ธฐ์ฌ์์ ์ ์ ์๋ฏ์ด ์ ๋ ๋ค์ํ ํ๋ก์ ํธ๋ฅผ ์งํํ์ต๋๋ค. ์๋ก์ด ํ์ ์ฒซ ๋ ์ ์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ ๋ฐฉ์์ผ๋ก ์งํ๋ฉ๋๋ค. ์ฆ, ๋ฐฑ์๋๊ฐ ๋์ ํจ๊ป ์์ ์ ํ๋ฆฌ์ผ์ด์
์ ์ค์นํ๊ณ ๋ฐฐํฌํ๋ ๋ง๋ฒ ๊ฐ์ ์์
์ ์ํํฉ๋๋ค. 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๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ค์์ ์ฌ์ฉํ์ฌ ์์ฑ๋์์ต๋๋ค.
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-server
Vue 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