Docker 1에서는 가상화가 뭐고 어떤 기술들이 있는지 정리했다.

또한 어떻게 도커가 동작하는지 대략적으로 알아봤다.

이번 포스팅에서 이미지와 컨테이너에 대해서 더 알아보겠다.

 


이미지와 컨테이너

이미지는 프로그램, 컨테이너는 프로세스라고 비유했었다.

공통점은 크게 

 

이미지는 상태가 정적

하나의 이미지로 여러 컨테이너를 실행 가능

저장위치

 

이러한 공통점을 만드는 가장 큰 요소가 바로 레이어 개념이다.

레이어의 불변 가변성이 이미지와 컨테이너를 나누는 가장 중요한 요소라고 생각된다.


레이어란?

이미지나 컨테이너를 구성하는 파일 시스템의 계층 구조

각 계층은 읽기 전용과 쓰기 전용이 있음

이런 구조를 쓰면 어떤 게 좋길래?

 

레이어 구조의 장점

  • 이미지의 불변성
  • 재사용성
  • 성능(캐싱)
  • 변경 추적 쉬움


이미지 레이어

  • 읽기 전용(불변)
  • Dockerfile의 명령어 하나 하나가 레이어로 만들어짐

컨테이너 레이어

  • 쓰기 가능 레이어
  • 이미지의 레이어들 중 수정을 한 레이어
  • 이때 수정한 것의 복사본에 수정함 

-> CoW 방식으로 불변성 보장

 

이미지는 불변이다. 여기서 사용하는 불변의 의미가 자바의 String과 비슷한 것 같다.

String도 불변 객체라고 한다. 한 번 만들면 수정이 불가능하다는 뜻이다.

"good" + "morning" => 'goodmorning"

이 경우 저 두 개가 하나가 되는게 아니다.

수정이 불가능하므로 저 문자열이 새로이 만들어지는 것 뿐

이게 이미지에 동일하게 적용되는거라고 이해했다.


 

커밋과 빌드

기존에 이미지을 컨테이너로 run 하여 여러 작업을 할 것이다.

변경 사항들이 만들어질 것이고 컨테이너 레이어 기록된다.

 

컨테이너 = 이미지 레이어 + 컨테이너 레이어

 

이렇게 기록된 것들은 컨테이너를 커밋 / 빌드 해 영구적으로 저장된다.

즉 컨테이너 레이어가 이미지 레이어로 되는 과정이 커밋 / 빌드이다.

 

커밋(Commit)

docker commit 컨테이너ID my-custom-image

컨테이너를 이미지로 저장하는 것

컨테이너에서 작업한 내용을 기반으로 새로운 이미지 생성

개발자가 명령어를 순차적으로 작성해서 이미지를 만들어야함

 

빌드(Build)

docker build -t my-image .

Dockerfile 기반 이미지 생성

명령어를 사용해 커밋하는 걸 스크립트화 한게 Dockerfile

이를 통해 개발자는 동일한 결과를 기대할 수 있다.

 

도커파일의 예시이다.

# 1. 베이스 이미지 선택
FROM python:3.9-slim

# 2. 작업 디렉토리 설정
WORKDIR /app

# 3. 필요한 파일 복사
COPY requirements.txt .

# 4. 패키지 설치
RUN pip install --no-cache-dir -r requirements.txt

# 5. 앱 소스 코드 복사
COPY . .

# 6. 환경변수 설정 (선택)
ENV PORT=5000

# 7. 컨테이너 시작 시 실행할 명령
CMD ["python", "app.py"]

 

명령어 하나 하나 마다 이미지 레이어가 생기는 이유가 바로
각 명령어 마다 커밋을 하기 때문이다.

 

  1. 임시 컨테이너 생성하고
  2. 해당 명령어 수행하고
  3. 결과를 커밋

이를 반복하는 구조다.

이미지의 레이어를 확인하는 명령어들이다.

이미지의 레이어 정보를 확인할 수 있다.
docker history python:3.9-slim

이미지의 메타데이터 전체를 JSON형태로 보여줌
여기서 레이어의 정보나 베이스 이미지, 사용된 명령어들을 볼 수 있다.
docker image inspect python:3.9-slim

이를 통해 어떤 명령어가 쓰이고 있고 뭐가 무거운지 확인할 수 있고 최적화를 할 수 있다.
도커파일을 사용안한 경우 이걸로 이미지 레이어 순서 같은거 확인 가능


용량 줄이기 / 성능 높이기

도커 이미지의 용량을 줄이거나 빌드 성능을 높이는 방법들이 존재한다.

용량 줄이기

1. COPY 남발 금지

2. RUN 명령어 병합으로 레이어 수 줄이기

    명령어 당 레이어 하나가 만들어지니까, 명령어 하나로 수행할 수 있게

3. 멀티 스테이지 빌드 사용

    앱 빌드 이미지와 실행 이미지 분리

4. 슬림 베이스 이미지 사용

 

빌드 성능 높이기

변경이 적은 명령어 위로 배치

변경이 안된 부분은 기존에 캐싱된 걸 사용해 성능이 높아지는 걸 이용

 

마무리

도커 강의의 5장을 정리한 포스팅이다.

여기서는 도커의 핵심인 이미지와 컨테이너에 대해 알아봤고,

컨테이너로 이미지를 만드는 방식과 더 효율적으로 만들 수 있는 방식에 대해도 공부했다.

 

 

+ Recent posts