nodejs.org/ko/docs/guides/nodejs-docker-webapp/
Node.js 에서 docker를 통해 배포하는 법이 node.js 공식 홈페이지에 나와있다.
먼저 간단하게
터미널 단에서 npm init으로 pacakge.json을 생성해준다.
package.json
npm i express |
그 후 index.js 에 express 기본 셋팅을 해준다.
const express = require("express");
const PORT = 8080;
//APP
const app = express();
app.get('/', (req, res) => {
res.send("Hello World");
});
app.listen(PORT, () => console.log(`this server listening on ${PORT}`));
먼저 node_modules 에 있는 내용들은 Docker를 build 할 때 사용하지 않기 때문에 일단
.dockerignore파일을 생성해준다
.dockerignore에는 도커 빌드시 포함시키지 않을 내용들이 담겨있다.
Dockerfile
FROM node:12 RUN npm install
CMD ["node", "index.js"] |
위와같이 Dockerfile을 만들고 빌드를 하게 되면
빌드는 되나
실행이 되지 않는다.
ls를 통해 내부 파일을 보면 package.json이 생성이 되지 않은 모습을 볼 수 있다.
따라서 package.json을 해당 컨테이너 안에 넣어줘야 한다.
Dockerfile
FROM node:12
#COPY 복사할 파일 경로, 컨테이너내에서 파일이 복사될 경로 COPY package*.json ./
RUN npm install
CMD ["node", "index.js"] |
package.json에 COPY를 통해 package.json 을 추가해보았다.
그리고 나서 빌드 후 실행을 하면
package.json은 이제 추가되어있지만 index.js가 존재하지 않는다
server.js와 package.json들을 추가해주기 위해 전반적인 디렉토리를 복사해주도록 하겠다.
Dockerfile
FROM node:12
#COPY 복사할 파일 경로, 컨테이너내에서 파일이 복사될 경로 COPY ./ ./
RUN npm install
CMD ["node", "index.js"] |
위와같이 변경해주고 빌드를 진행해 준다
빌드 완료 후 실행해준다.
서버가 정상적으로 동작하는것을 확인 할 수 있다.
서버 구동까지는 확인 했으나
해당 포트로 접근해서 확인해보면 연결을 할 수 없다.
이에 대한 이유는 도커는 내부 내트워크로 이루어져있는데 이를 외부에서 접속 할 수 있게 포트를 개방해줘야한다.
docker run -p 외부에서 접근 할 포트: 컨테이너 내부의 포트
추가적으로 WORKDIR를 설정해준다.
WORKDIR를 지정하지 않는 경우 기존에 있던 폴더들이 COPY에서 가져오는 폴더와 겹칠 경우
덮어씌워지기 때문에 WORKDIR를 지정해줘야 한다.
FROM node:12
WORKDIR /usr/src/app
#COPY 복사할 파일 경로, 컨테이너내에서 파일이 복사될 경로 COPY ./ ./
RUN npm install
CMD ["node", "index.js"] |
어플리케이션 소스 변경으로 재 빌드시 효율적으로 하는법
위의 Dockerfile을 아래와 같이 변경한다.
FROM node:12
WORKDIR /usr/src/app
COPY package.json ./
#COPY 복사할 파일 경로, 컨테이너내에서 파일이 복사될 경로
RUN npm install
COPY ./ ./
CMD ["node", "index.js"]
모듈을 다운로드 할 때에는 모듈에 변화가 생겨야만 다시 받아야 하는데
소스코드에 조금의 변화만 생겨도 모듈 전체를 다시 받는 문제점이 생긴다.
따라서 종속성 부분만 COPY로 가져오고
만약에 변경이 없다면 CACHE 처리로 인해 npm install이 실행되지 않는다.
위의 처리를 통해 package.json만 따로 변경을 해줘서 필요 없는 모듈을 받지 않게 진행해 주었습니다.
하지만 아직도 소스를 변경할 때마다 변경된 소스 부분은 COPY한 후 이미지를 다시 빌드를 해주고 컨테이너를 다시 실행해줘야지 변경된 소스가 화면에 반영이 됩니다. 이러한 작업은 시간 소요가 크고 이미지 빌드 수가 많아지기 때문에
Volume을 사용합니다.
Volume
도커 컨테이너가 local에 있는 파일 주소를 참조해서 나타낸다.
따라서 볼륨을 사용하면 컨테이너가 내려가더라도 영구적으로 저장및 관리 할 수 있다 .
docker run -p 5000:8080 -v /usr/src/app/node_modules -v $(pwd):/usr/src/app 이미지 아이디 |
-v /usr/src/app/node_modules
먼저 호스트 디렉토리에 module은 없기에 컨테이너에 매핑을 하지 말라고 두는 부분
-v $(pwd):/usr/src/app
/usr/src/app 경로는 현재 local의 pwd 경로에서 참조한다.
(window cmd :-v %cd%:/usr/src/app,
window powershell : -v ${PWD}:/usr/src/app
mac, linux : -v $(pwd):/usr/src/app
)
const express = require("express");
const PORT = 8080;
//APP
const app = express();
app.get('/', (req, res) => {
res.send("안녕 세상!");
});
app.listen(PORT, () => console.log(`this server listening on ${PORT}`));
코드를 변경하고 나서 docker 컨테이너를 한번 껐다 켜준다
위 글은
해당 강의를 듣고 정리하는 내용입니다.
'Docker, CI' 카테고리의 다른 글
Docker 를 활용한 react-nginx 실행하기 (0) | 2020.12.29 |
---|---|
docker - docker compose (0) | 2020.12.26 |
docker- docker Image 만들기 (Dockerfile 작성및 이미지 생성) (0) | 2020.12.25 |
docker - 기본 명령어 (0) | 2020.12.25 |
docker- docker 정의 및 docker 설치하기 (0) | 2020.12.25 |