본문 바로가기
개발공부 개발새발/Docker

Docker ) 도커 이미지 기초

by 휴일이 2024. 2. 28.

Docker Image

  • 도커 이미지는 읽기 전용이다.
  • 이미지를 빌드한 시점에서 이미지 내용은 고정된다.
  • 단순히 애플리케이션 소스 코드를 변경해도 이미지를 다시 빌드하지 않으면 애플리케이션은 변경되지 않는다.
  • 도커 이미지는 레이어 기반이다.
    • → 이미지를 빌드하거나 다시 빌드할 때, 변경된 부분 명령과 그 이후 모든 명령이 재평가된다.

레이어 기반 아키텍쳐

  • 도커는 이미지 빌드에 대한 모든 명령 결과를 캐시한다.
  • 애플리케이션, 도커파일 내용이 변경되지 않았을 때 이미지를 재빌드하면 캐시에서 결과를 가져와서 사용한다. (그래서 빠름!)
  • 도커 파일 명령이 한 줄 한 줄 차례차례 레이어로 쌓인다. (레이어가 캐시된다.)

→ 그래서 만약 애플리케이션 소스 코드를 변경하고 다시 빌드하면 캐시의 일부만 사용하기 떄문에 다시 빌드가 느려진당…!!

이미지를 기반으로 컨테이너를 실행하면…

  • 컨테이너가 Dockerfile 로 만든 이미지(애플리케이션) 위에 새로운 추가 레이어를 추가한다.
    • 그러면 이미지를 레이어로 실행할 때만 활성화되는 최종 레이어가 추가된다!
    • 그것은 바로 CMD [] 명령어 !

캐시를 활용하지 않는 예

FROM node

WORKDIR /app

# 소스 코드를 복사하는 명령어
COPY . /app

# 노드에서 종속성을 설치하는 명령어
RUN npm install 

EXPOSE 80

CMD ["node", "server.js"]
  • COPY . /app 명령어는 소스코드가 변경되면 다시 복사해야되기 때문에 재실행된다.
  • 소스코드가 바뀌어도 종속성은 그대로이기 때문에 npm install 명령어는 재실행될 필요가 없다.
    • 하지만 RUN npm install 이 COPY . /app 이후에 실행되기 때문에, 소스코드가 변경되면 재실행 될 필요 없어도 무조건 재실행된다.

그렇다면 레이어 캐시를 활용해보자 !

FROM node

WORKDIR /app

# 1. 먼저 종속성을 복사하고
COPY package.json /app

# 2. npm install (dependency install) 을 하기 때문에
RUN npm install
# 3. 여기까지 명령어는 소스코드가 변경되어도 캐시에 들어있는 레이어가 무효화되지 않는다. !!

# 소스코드 복사하는 명령어
COPY . /app

EXPOSE 80

CMD ["node", "server.js"]
  1. COPY package.json /app 으로 종속성만 먼저 복사한다.
  2. RUN npm install 을 해도 종속성이 달라지는 것이 없기 때문에 레이어가 무효화되지 않는다.
  3. 그 다음에 소스코드를 복사하는 명령어 부터는 코드가 변경되면 다시 실행된다.
  • 순서만 바꿔도 캐시에 있는 레이어를 사용 가능하다 ^_^ !
  • 성능 uppppppp !!!

도커 기초 요약

  • 도커 ( 우리의 코드 )
    • 우리 코드를 “이미지”에 넣고, 실행 환경도 넣는다.
  • 도커파일에서 이미지 실행 세부 명령을 설정한다.
    • 집어넣을 것? 베이스 이미지? 어떤 코드와 종속성 사용? 설정 단계? 내부 포트 몇번? 등등..
  • 하지만 도커는 궁극적으로 이미지가 아니라 컨테이너
    • 이미지는 빌딩 블록, 컨테이너의 템플릿
  • 이미지에 기반한 여러 컨테이너를 만들 수 있다.
    • 이미지 위에 추가된 얇은 레이어 → 컨테이너
    • 이미지를 기반으로 하는 실행 애플리케이션
    • 일단 실행되면 다른 컨테이너와는 독자적인 stand alone
  • 컨테이너가 이미지에서 코드와 환경을 새 컨테이너로, 또는 새 파일로 복사하지 않는다.
    • 그저 이미지에 저장된 환경을 사용하고, 그 위에 “컨테이너 레이어”를 부가하는 것이다.

이미지란?

읽기/쓰기 엑세스 원한이 있는 인스턴스를 실행하는, 컨테이너의 “블루프린트” (템플릿)

컨테이너만으로 관리할 순 없나?

이미지 개념이 있기에 동일한 이미지를 기반으로 여러 컨테이너가 서로 간섭하지 않을 수 있는 것 ! 완전 격리!

컨테이너에서 “격리” ?

컨테이너끼리 서로 분리되어 있고, 디폴트로 공유 데이터 또는 상태가 없음.

컨테이너 ?

이미지를 기반으로 하는 격리된 SW 유닛, 이미지의 실행중인 인스턴스.

이미지 context 에서 layer 란?

이미지의 모든 명령은 캐시 가능한 레이어를 생성한다. 레이어는 이미지 재구축 및 공유를 돕는다.

728x90