Dockerfile
FROM node:18-alpine
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
COPY index.js ./
ENTRYPOINT [ "node", "index.js" ]
- 프로젝트 최상단에 Dockerfile 생성
- FROM
base가 될 image, 내가 nodejs 프로젝트를 생성해서 node를 기본 이미지로 작성했다. django, ubuntu, tomcat 등 여러가지가 올 수 있다.
- WORKDIR
컨테이너 안에서 Root가 될 디렉토리. 이 경로 이하에 내 프로젝트가 설치된다고 생각하면 된다. docker 실행 후 터미널에 접속해 보면 /app 디렉토리가 생성되어 있는 것을 확인할 수 있다.
- COPY
package.json은 내가 /app에 copy할 source이고 ./ 는 destination 경로 (paste할 위치). Dockerfile은 상단을 layer0으로 보고 레이어를 쌓아 올려가듯 작성한다. 이 때 변화가 적은 파일에서 변화가 많은 파일 순으로 작성하게 된다. 상위 레이어에서 변화가 생겼더라도 하위 레이어는 변화되지 않은 이상 캐싱된 값을 유지한다.
- RUN
실행할 명령어
- ENTRYPOINT
컨테이너가 실행될 때 default로 실행되는 명령어, 만약 컨테이너 실행 시 기존에 작성된 값이 아닌 인자값을 받아서 동적으로 실행해야할 경우 ENTRYPOINT 대신 CMD를 쓴다.
cf1. Dockerfile을 쓰는 규칙
https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
cf2.🧐 npm ci?
npm install과의 차이점
1. package.json, package-lock.json 파일이 변경되지 않음
2. package-lock.json 파일 기반으로 dependency 설치
3. package.json과 버전 비교해서 매칭 되지 않을 경우 에러 발생
4. 실행 시 node_modules 삭제 후 설치
5. CI/CD 환경에서 안정적
build: 이미지 생성
docker build -f Dockerfile -t test-docker .
- -f Dockerfile의 이름 (보통 Dockerfile로 짓는다.)
- -t 내가 만들 Repository의 name. 여기서 말하는 repository의 개념은 git과 유사하다.
- Dockerfile의 위치 (현재 경로여서 .)
images: 생성된 이미지 확인
docker images
run: 컨테이너 생성
docker run -d -p 9080:9080 test-docker
- -d detach하여 백그라운드에서 동작
- -p 내 로컬의 port: docker port 연동
tag: 이름 변경
Docker tag test-docker:latest $(docker계정)/$(repo이름):$(버전)
push: 이미지 배포
docker push $(docker계정)/$(repo이름):$(버전)