DOCKER - 기본 Dockerfile 작성 및 이미지 빌드 후 컨테이너 실행해보기

Sungjin·2021년 8월 19일
1

Docker

목록 보기
2/6
post-thumbnail

🎯 Test 내용

  1. 간단한 nodejs app 만들기 (화면에 Hell 출력)
  2. 도커 파일 작성
  3. 도커 이미지 빌드
  4. 이미지를 이용 해 컨테이너 만들기

🚀 간단한 node app 작성

vs code를 이용하여 작업하고자 하는 파일에
npm init 명령어를 실행하여 package.json 파일 작성

package.json

{
  "name": "nodejs-docker-app",
  "version": "1.0.0",
  "description": "simple node js app to study docker",
  "main": "server.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
    
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.17.1"
  }
}

express 모듈만 추가

index.js

const express=require('express');

const port=8080;

const app=express();
app.get('/',(req,res)=>{
    res.send("Hello")
});

app.listen(port);
console.log("Server is Running");

🚀 Dockerfile 작성

Dockerfile 작성 이유
위에서 작성한 nodejs 을 도커 환경에서 실행하기 위해서는 이미지를 만들고 컨테이너를 생헝 새야함.
이미지를 만들기 위해 Dockerfile작성

파일 형식은 상관 없음!

Dockerfile

  • 용어

    1. FROM
    도커 이미지를 빌드시키기 위해서는 base Image를 갖고와서 base Image의 파일 스냅샷들을 활용하여 임시 컨테이너를 생성해야 함.
    임시 컨테이너에서 사용 할 base Image로
    node를 지정 node:<버전>

    2. WORKDIR
    이미지 안에서 애플리케이션 소스 코드를 갖고 있을 디렉토리를 생성하는것.
    생성 이유는 로컬 디렉토리에서 컨테이너 안으로 copy한 것들이 컨테이너의 root 디렉 토리에 다 copy되는 것을 방지하기 위하여..
    (정리 정돈 및 엄연히 공간을 분리해 둘 필요가 있음)

    ex)

    1. WORKDIR을 정하지 않았을 때
    2. WORKDIR을 정했을 때

    3. COPY
    Local 에 있는 파일을 도커 컨테이너의 디렉토리에 복사를 하기 위해
    COPY를 해주지 않으면 컨테이너는 가상화 환경이므로 (독립된 공간)
    우리 로컬의 package.json 및 index.js를 인식 못할 수 있음

    4. RUN
    도커 컨테이너에서 추가적으로 필요한 설정의 명령어를 명시.
    npm install은 package.json의 내용을 반영하기 위해 사용

    COPY package.json ./ 와 COPY ./ ./을 나눠 준 이유
    도커는 build를 할 때

    이미 build된 것이 있으면 캐시를 이용해서 가져오게 됩니다.
    새로 build를 하는 것 보다 훨씬 효율이 좋습니다.
    여기서 COPY package.json ./ 와 COPY ./ ./을 나눠 주지 않고 COPY ./ ./만을 명시하게 되면 애플리케이션의 코드만을 바꾼 것인데 다시 빌드할 필요 없는 package.json을 빌드 하게 됩니다.
    따라서 이렇게 나눠서 사용하는 것이 효율적입니다.

    5. CMD
    컨테이너가 시작 될 시 실행될 명령어 입니다.
    docker run이 되면 node index.js가 바로 실행 되는 것이죠

🚀 Dockerfile build

docker built -t 도커허브아이디/이미지이름:버전 ./
-t 태그는 도커 이미지에 유용한 이름을 붙여주는 역할을 합니다.

🚀 컨테이너 실행

docker run -p 5000:8080 <이미지 아이디>
로컬 포트와 컨테이너 포트를 매핑 시켜줘야 함
or
docker run -p 5000:8080 -v /usr/src/app/node_modules -v $(pwd):/usr/src/app <이미지 아이디>
이미 컨테이너에 카피된 파일들이 로컬에서 수정이 되었다고 다시 빌드 후 컨테이너를 실행하는 과정은 굉장히 번거롭기 때문에
지정한 디렉토리에 파일들ㅇ을 매핑하도록 docker volume이라는 기능 사용
node-modules는 npm install 실행 시 종속성들이 보관되는 곳. npm install은 현재 컨테이너 안에서 실행되도록 해놓았기 때문에 컨테이너에 따로 로컬에 있는 것은 매핑하지 않도록 지정

🌟 실행 결과

잘 실행되는 것을 확인!

😍 이상으로 포스팅을 마치겠습니다. 감사합니다 :)

profile
WEB STUDY & etc.. HELLO!

0개의 댓글