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"]
명령어 하나 하나 마다 이미지 레이어가 생기는 이유가 바로
각 명령어 마다 커밋을 하기 때문이다.
- 임시 컨테이너 생성하고
- 해당 명령어 수행하고
- 결과를 커밋
이를 반복하는 구조다.
이미지의 레이어를 확인하는 명령어들이다.
이미지의 레이어 정보를 확인할 수 있다.
docker history python:3.9-slim
이미지의 메타데이터 전체를 JSON형태로 보여줌
여기서 레이어의 정보나 베이스 이미지, 사용된 명령어들을 볼 수 있다.
docker image inspect python:3.9-slim
이를 통해 어떤 명령어가 쓰이고 있고 뭐가 무거운지 확인할 수 있고 최적화를 할 수 있다.
도커파일을 사용안한 경우 이걸로 이미지 레이어 순서 같은거 확인 가능
용량 줄이기 / 성능 높이기
도커 이미지의 용량을 줄이거나 빌드 성능을 높이는 방법들이 존재한다.
용량 줄이기
1. COPY 남발 금지
2. RUN 명령어 병합으로 레이어 수 줄이기
명령어 당 레이어 하나가 만들어지니까, 명령어 하나로 수행할 수 있게
3. 멀티 스테이지 빌드 사용
앱 빌드 이미지와 실행 이미지 분리
4. 슬림 베이스 이미지 사용
빌드 성능 높이기
변경이 적은 명령어 위로 배치
변경이 안된 부분은 기존에 캐싱된 걸 사용해 성능이 높아지는 걸 이용
마무리
도커 강의의 5장을 정리한 포스팅이다.
여기서는 도커의 핵심인 이미지와 컨테이너에 대해 알아봤고,
컨테이너로 이미지를 만드는 방식과 더 효율적으로 만들 수 있는 방식에 대해도 공부했다.
'공부일지 > 개인학습' 카테고리의 다른 글
방화벽(Firewall), 골치 아프지만 필요한 (0) | 2025.04.23 |
---|---|
NGINX, 러시아에서 태어난 웹 서버 (0) | 2025.04.21 |
애플리케이션 빌드/ 도커 빌드 (1) | 2025.04.18 |
[Docker #1] 도커, 뭐가 다른가 (0) | 2025.04.17 |
라우터(Router) 구성요소들 분석 (0) | 2025.04.15 |