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"]
- COPY package.json /app 으로 종속성만 먼저 복사한다.
- RUN npm install 을 해도 종속성이 달라지는 것이 없기 때문에 레이어가 무효화되지 않는다.
- 그 다음에 소스코드를 복사하는 명령어 부터는 코드가 변경되면 다시 실행된다.
- 순서만 바꿔도 캐시에 있는 레이어를 사용 가능하다 ^_^ !
- 성능 uppppppp !!!
도커 기초 요약
- 도커 ( 우리의 코드 )
- 우리 코드를 “이미지”에 넣고, 실행 환경도 넣는다.
- 도커파일에서 이미지 실행 세부 명령을 설정한다.
- 집어넣을 것? 베이스 이미지? 어떤 코드와 종속성 사용? 설정 단계? 내부 포트 몇번? 등등..
- 하지만 도커는 궁극적으로 이미지가 아니라 컨테이너
- 이미지는 빌딩 블록, 컨테이너의 템플릿
- 이미지에 기반한 여러 컨테이너를 만들 수 있다.
- 이미지 위에 추가된 얇은 레이어 → 컨테이너
- 이미지를 기반으로 하는 실행 애플리케이션
- 일단 실행되면 다른 컨테이너와는 독자적인 stand alone
- 컨테이너가 이미지에서 코드와 환경을 새 컨테이너로, 또는 새 파일로 복사하지 않는다.
- 그저 이미지에 저장된 환경을 사용하고, 그 위에 “컨테이너 레이어”를 부가하는 것이다.
이미지란?
읽기/쓰기 엑세스 원한이 있는 인스턴스를 실행하는, 컨테이너의 “블루프린트” (템플릿)
컨테이너만으로 관리할 순 없나?
이미지 개념이 있기에 동일한 이미지를 기반으로 여러 컨테이너가 서로 간섭하지 않을 수 있는 것 ! 완전 격리!
컨테이너에서 “격리” ?
컨테이너끼리 서로 분리되어 있고, 디폴트로 공유 데이터 또는 상태가 없음.
컨테이너 ?
이미지를 기반으로 하는 격리된 SW 유닛, 이미지의 실행중인 인스턴스.
이미지 context 에서 layer 란?
이미지의 모든 명령은 캐시 가능한 레이어를 생성한다. 레이어는 이미지 재구축 및 공유를 돕는다.
728x90
'개발공부 개발새발 > Docker' 카테고리의 다른 글
Docker ) Network (0) | 2024.03.29 |
---|---|
Docker ) ARG 와 ENV (0) | 2024.03.18 |
Docker ) 도커 볼륨과 바인드 마운트 (0) | 2024.03.18 |
Docker ) 이미지, 컨테이너 관리. (0) | 2024.03.03 |
Docker ) 도커 이미지를 만들고 컨테이너를 실행하자. with Dockerfile (1) | 2024.02.26 |