ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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 베이스이미지에서 사용할수있다. 

    https://hub.docker.com/

     

    Docker Hub

    Docker Certified:Trusted & Supported Products Certified Containers provide ISV apps available as containers. Certified Plugins for networking and volumes in containers. Certified Infrastructure delivers an optimized and validated Docker platform for enterp

    hub.docker.com

    이곳에가면 다양한 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

    댓글

Designed by Tistory.