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 작성 이유
위에서 작성한 nodejs 을 도커 환경에서 실행하기 위해서는 이미지를 만들고 컨테이너를 생헝 새야함.
이미지를 만들기 위해 Dockerfile작성
파일 형식은 상관 없음!
Dockerfile
용어
1. FROM
도커 이미지를 빌드시키기 위해서는 base Image를 갖고와서 base Image의 파일 스냅샷들을 활용하여 임시 컨테이너를 생성해야 함.
임시 컨테이너에서 사용 할 base Image로
node를 지정 node:<버전>
2. WORKDIR
이미지 안에서 애플리케이션 소스 코드를 갖고 있을 디렉토리를 생성하는것.
생성 이유는 로컬 디렉토리에서 컨테이너 안으로 copy한 것들이 컨테이너의 root 디렉 토리에 다 copy되는 것을 방지하기 위하여..
(정리 정돈 및 엄연히 공간을 분리해 둘 필요가 있음)
ex)
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가 바로 실행 되는 것이죠
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은 현재 컨테이너 안에서 실행되도록 해놓았기 때문에 컨테이너에 따로 로컬에 있는 것은 매핑하지 않도록 지정
잘 실행되는 것을 확인!