-
Docker 로 Node 서버 빌드, 실행하기개발/docker 2020. 4. 7. 21:00
Dockerfile을 사용해 node 서버 실행시키기
사전에 미리 index.js 노드 코드를 준비한후 Dockerfile 을사용해 npm 에서 express를 설치한다음 서버를 실행시키려한다.
const express = require('express'); const app = express(); app.get('/',(req,res)=>{ res.send('hi @@@@'); }); app.listen(8080,()=>{ console.log('listening port 8080'); });4
8080 포트 서버를 express 를 활용해 실행시키는 코드이다.
FROM alpine RUN npm install CMD ['npm' , 'start']
alpine 베이스 이미지에서 npm install 을실행시킨뒤 npm start 를 시켜보았다.
다음과같은 에러가 발생하는데 이유는 alpine 에 npm 이 존재하지 않기떄문이다.
npm 은 node 베이스이미지에서 사용할수있다.
이곳에가면 다양한 docker image 를 검색할수있다.
node 이미지의 여러 버전중 alpine 버전을 사용할것이다( alpine은 docker에서 가장 작고 컴팩트한것을말한다)
FROM node:alpine RUN npm install CMD [ "npm" , "start" ]
ganghwiui-MacBook:simpleweb hwi$ docker build . Sending build context to Docker daemon 2.007MB Step 1/3 : FROM node:alpine ---> 483343d6c5f5 Step 2/3 : RUN npm install ---> Using cache ---> 8d3fe1047d0b Step 3/3 : CMD [ "npm" , "start" ] ---> Using cache ---> 09276af1293e Successfully built 09276af1293e ganghwiui-MacBook:simpleweb hwi$ d
이번엔 성공적으로 빌드가되었다 그러나 run 을 해보면
ganghwiui-MacBook:simpleweb hwi$ docker run 09276af1293e npm ERR! code ENOENT npm ERR! syscall open npm ERR! path /package.json npm ERR! errno -2 npm ERR! enoent ENOENT: no such file or directory, open '/package.json' npm ERR! enoent This is related to npm not being able to find a file. npm ERR! enoent npm ERR! A complete log of this run can be found in: npm ERR! /root/.npm/_logs/2020-04-07T11_13_46_788Z-debug.log
package.json 을 찾지못한다는 에러가 발생한다. 하지만 실제로 package.json 파일은 동일폴더에 존재한다.
이유는 package.json 파일이 "Container" 에 존재하지 않기때문이다.
docker의 컨테이너와 우리의 하드드라이브는 철저히 구분되어져있다.
그러므로 해당 파일들을 컨테이너에 카피해주어야한다.
FROM node:alpine # 현재위치 복사할컨테이너 위치 COPY ./ ./ RUN npm install CMD [ "npm" , "start" ]
Copy 복사할파일위치 컨테이너위치 를 지정해주면 된다.
./ 은 현재위치를 의미한다.
ganghwiui-MacBook:simpleweb hwi$ docker build . Sending build context to Docker daemon 2.007MB Step 1/4 : FROM node:alpine ---> 483343d6c5f5 Step 2/4 : COPY ./ ./ ---> Using cache ---> 38184fa7cd53 Step 3/4 : RUN npm install ---> Using cache ---> 491e0f80bcae Step 4/4 : CMD [ "npm" , "start" ] ---> Using cache ---> 4d59c19b263e Successfully built 4d59c19b263e ganghwiui-MacBook:simpleweb hwi$ docker run 4d59c19b263e > @ start / > node index.js listening port 8080
다음과같이 무사히 run 까지 성공했다.
그러나 localhost 8080을 웹에서 켜보니 존재하지 않는페이지가 나왔다.
docker 을통해 포트매핑까지 해줘야한다.
docker run -p 8080:8080 khdrogba/simpleweb
앞에있는 8080은 내가 사용할 포트를 지정해주면된다. 다른숫자도 가능하다.
뒤의 8080 은 실제 포트를 넣어준다 index.js 에서 지정한 포트넘버를쓰면 된다.
마지막은 container id 를 넣어주면되는데 나의경우 태깅을 사용했다.
ganghwiui-MacBook:simpleweb hwi$ docker run -it khdrogba/simpleweb sh / # ls Dockerfile lib package.json sys bin media proc tmp dev mnt root usr etc node_modules run var home opt sbin index.js package-lock.json srv
지금까지 빌드한 컨테이너를 들여다보니 package.json , index.js 등등이 들어가있음을 볼수있다.
여기서 작업을 하기엔 여러 기존 폴더와 곂침이 발생할수있다.
그러므로 지정폴더에 다시 카피해야한다.
# base image FROM node:alpine # 작업폴더 지정 WORKDIR /usr/app # 현재위치 복사할컨테이너 위치 COPY ./ ./ RUN npm install CMD [ "npm" , "start" ]
WORKDIR 을 사용해 usr 폴더안에 app 안에 넣었다
새롭게 빌드한후 port 매핑으로 run 을했다.
ganghwiui-MacBook:~ hwi$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8865a00022b9 khdrogba/simpleweb "docker-entrypoint.s…" 39 seconds ago Up 38 seconds 0.0.0.0:8080->8080/tcp zen_heyrovsky
run 하는 동시에 새로운터미널에서 내부를 들여다보면
ganghwiui-MacBook:simpleweb hwi$ docker exec -it dcf3aaaa65e9 sh /usr/app # ls Dockerfile node_modules package.json index.js package-lock.json
작업시작부터가 /usr/app 으로 되어있다.
그리고 파일들이 그안에 잘들어가있음을 확인할수있다.
npm install 막기
만약 index.js 를 수정하면 어떻게될까?
간단한 수정뒤에 새롭게 빌드를 했더니
Step 1/5 : FROM node:alpine ---> 483343d6c5f5 Step 2/5 : WORKDIR /usr/app ---> Using cache ---> 9ec5b2415ae7 Step 3/5 : COPY ./ ./ ---> d737d02d0723 Step 4/5 : RUN npm install ---> Running in 774da5a27797 npm WARN app No description npm WARN app No repository field. npm WARN app No license field. audited 126 packages in 0.988s found 0 vulnerabilities Removing intermediate container 774da5a27797 ---> 79c931055ec9 Step 5/5 : CMD [ "npm" , "start" ] ---> Running in 6440a89148a4 Removing intermediate container 6440a89148a4 ---> b11064120664 Successfully built b11064120664 Successfully tagged khdrogba/simpleweb:latest
COPY 이후로 변경이됬음을 감지하고 캐시를 쓰지않고 새로 실행한다.
그런경우 밑에있는 npm install 은 변경이없지만 새롭게 다시 인스톨한다.
npm install은 오직 package.json 의영향을받는다.
index.js 등 다른 파일에서 수정이일어난들 npm install은똑같이실행된다.
그것을 사용해 이런방법을 쓸수있다.
# base image FROM node:alpine # 작업폴더 지정 WORKDIR /usr/app # 현재위치 복사할컨테이너 위치 COPY ./package.json ./ RUN npm install COPY ./ ./ CMD [ "npm" , "start" ]
'개발 > docker' 카테고리의 다른 글
travisCI - Github 연동해서 docker 빌드하기 (0) 2020.05.03 docker로 react 빌드하기 (0) 2020.05.03 Docker 로 react 실행및 자동변경 가능하게하는법 (0) 2020.04.28 docker-compose (0) 2020.04.14 docker image 생성 (0) 2020.03.30