Docker

[Docker] Dockerfile로 도커 이미지 생성

야챔 2021. 8. 3. 15:34

dockerfile -> 도커 클라이언트 -> 도커 서버 -> 이미지

 

- dockerfile은 도커이미지를 만들기 위한 설정파일이며 컨테이너가 어떻게 행동할지 설정들을 정의

- 도커 클라이언트 : 도커 파일에 입력된 것이 도커 클라이언트에 전달되어야함

- 도커 서버 : 도커 클라이언트에 전달된 모든 중요 작업들을 함

 

 

hello를 출력할 dockerfile을 작성

# 베이스이미지
FROM alpine

# 추가적으로 필요한 파일 다운로드
#RUN command

# 컨테이너 시작시 실행 될 명령어
CMD ["echo", "hello"]

위의 dockerfile 작성 후 아래와 같이 build 해줌

docker build ./

※※※※※※※docker build ./ 실행시 이미지 ID 나오지 않는 경우 더보기 클릭※※※※※※※

더보기

docker build ./ 를 하였을 때 [+] Building 0.1s (5/5) FINISHED 가 되는 경우

 

아래와 같이 나온다면

 

buildkit이 활성화 되었기 때문에 나오는 현상

docker setting에 들어가서 아래와 같이 buildkit을 false로 바꿔준다.

 

참고 https://prettyit.tistory.com/25

 

window의 경우 밑의 사진과 같이 경고가 뜰 수 있는데 dockerfile에 cmd가 있기 때문이란다.

빌드는 되어서 무시하고 넘어감

 

build 하여 나온 step 부분

Step 1/2 : FROM alpine    # alpine 이미지 가져옴 (많은 레이어들이 있음 / 시작시 실행될 명령어, 파일 스냅샷)
 ---> d4ff818577bc
Step 2/2 : CMD ["echo", "hello"]    # 임시 컨테이너 생성(하드디스크에 파일 시스템 스냅샷 추가, 시작시 실행될 명령어는 아직 없음) 그 다음 시작시 실행될 명령어에 echo hello를 줌
 ---> Running in 9c6c35f0c41c
Removing intermediate container 9c6c35f0c41c    # 임시 컨테이너로 이미지 만들어주고 임시 컨테이너 삭제
 ---> 32e00d5366a8
Successfully built 32e00d5366a8

 

이미지를 만들 때 베이스 이미지 먼저 임시 컨테이너 넣어주고, 레이어 넣어주고

시작시 실행될 명령어까지 넣어주고 임시 컨테이너 토대로 새로운 이미지가 생성된거임

>> 베이스 이미지에서 다른 종속이나 새로운 명령 추가할땐 임시컨테이너 만들고 이 임시컨테이너로 새로운 이미지 생성, 그 후에 임시컨테이너 삭제

 

이미지를 통해서 컨테이너 만든다고 했는데 위와같은 과정을 통해 컨테이너도 이미지를 만들 수 있다.

 

 

 

도커 이미지 이용해서 컨테이너 실행

hello 잘 나옴

 

도커 이미지에 이름주려면

docker build -t 도커아이디/저장소프로젝트이름:버전 ./

 

 

소스가 변경되고 적용하려면 위의 과정을 다시 해야한다.

COPY ./ ./ 에서 index.js 만 바꿨는데 다른 모듈까지 다시 설치 되기 때문에 비효율적

 

***** 소스 변경으로 재빌드할때 효율적으로..... *****

COPY ./ ./

RUN npm install

으로 종속성 계속 install 해주었던 것을

 

COPY package.json ./

RUN npm install

COPY ./ ./

으로 나누어 주면 캐시에 있는거 가져오기 때문에 빠름

 

 

docker volume 로 하면

docker run -d -p 5000:8080 -v /usr/src/app/node_modules -v  ${PWD}:/usr/src/app chaem0215/nodejs

컨테이너 다시 run하면 이미지 빌드 없이 변경가능 (기존의 컨테이너 꺼주고 run)

 

참고

https://darrengwon.tistory.com/797