소개
이 튜토리얼에서는 Dockerfile 을 사용하여 효율적인 Docker 이미지를 구축하는 과정을 안내합니다. Docker 이미지와 Dockerfile 을 이해하고, 성능을 위해 Dockerfile 레이어를 최적화하고, 더 빠른 빌드를 위해 Docker 이미지 캐시를 관리하며, 최적화된 이미지를 생성하기 위해 다단계 빌드를 활용하는 방법을 배울 것입니다. 이 튜토리얼을 마치면 가볍고 효율적이며 관리하기 쉬운 Docker 이미지를 만드는 지식을 갖추게 될 것입니다.
Docker 기본 개념
Docker 란 무엇인가?
Docker 는 소프트웨어 배포 및 개발을 혁신하는 강력한 컨테이너화 기술입니다. 개발자는 모든 종속성을 포함한 애플리케이션을 컨테이너라는 표준화된 단위로 패키징하여 다양한 컴퓨팅 환경에서 일관된 성능을 보장할 수 있습니다.
컨테이너화의 핵심 개념
컨테이너화는 애플리케이션이 격리된 환경에서 실행되도록 하여 다음과 같은 주요 이점을 제공합니다.
| 개념 | 설명 |
|---|---|
| 격리 | 컨테이너는 서로 간섭하지 않고 독립적으로 실행됩니다. |
| 이식성 | 애플리케이션은 다양한 시스템에서 일관되게 배포될 수 있습니다. |
| 효율성 | 기존 가상 머신에 비해 경량입니다. |
Docker 아키텍처
graph TD
A[Docker 클라이언트] --> B[Docker 데몬]
B --> C[컨테이너 런타임]
B --> D[이미지 리포지토리]
C --> E[컨테이너]
Ubuntu 22.04 에서 설치
## 패키지 인덱스 업데이트
sudo apt update
## 종속성 설치
sudo apt install apt-transport-https ca-certificates curl software-properties-common
## Docker 공식 GPG 키 추가
curl -fsSL | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
## 안정적인 리포지토리 설정
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
## Docker 엔진 설치
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
Docker 설치 확인
## Docker 버전 확인
docker --version
## Docker 설치 테스트
sudo docker run hello-world
주요 Docker 구성 요소
- Docker 클라이언트: Docker 와 상호 작용하기 위한 명령줄 인터페이스
- Docker 데몬: 컨테이너와 이미지를 관리하는 백그라운드 서비스
- Docker 이미지: 컨테이너를 생성하는 데 사용되는 읽기 전용 템플릿
- Docker 컨테이너: Docker 이미지의 실행 가능한 인스턴스
기본 Docker 명령어
## 실행 중인 컨테이너 목록
docker ps
## 모든 컨테이너 목록
docker ps -a
## 이미지 가져오기
docker pull ubuntu
## 컨테이너 실행
docker run -it ubuntu /bin/bash
Docker 이미지 제작
Docker 이미지 이해
Docker 이미지는 컨테이너 생성의 기반이 되는 읽기 전용 템플릿입니다. 코드, 런타임, 라이브러리, 시스템 도구 등 애플리케이션 실행에 필요한 모든 것을 포함합니다.
Dockerfile 기본 개념
Dockerfile 은 Docker 이미지를 생성하기 위한 지침이 담긴 텍스트 문서입니다. 각 지침은 이미지에 새로운 레이어를 생성합니다.
graph TD
A[Dockerfile] --> B[베이스 이미지]
A --> C[애플리케이션 파일 복사]
A --> D[종속성 설치]
A --> E[환경 설정]
A --> F[시작 명령 정의]
Python 애플리케이션을 위한 샘플 Dockerfile
## 공식 Python 런타임을 베이스 이미지로 사용
FROM python:3.9-slim
## 컨테이너 내 작업 디렉토리 설정
WORKDIR /app
## requirements 파일 복사
COPY requirements.txt .
## 필요한 패키지 설치
RUN pip install --no-cache-dir -r requirements.txt
## 애플리케이션 코드 복사
COPY . .
## 포트 번호 지정
EXPOSE 5000
## 애플리케이션 실행 명령 정의
CMD ["python", "app.py"]
이미지 구축 전략
| 전략 | 설명 | 사용 사례 |
|---|---|---|
| 단일 단계 빌드 | 간단하고 직관적인 빌드 | 작고 복잡하지 않은 애플리케이션 |
| 다단계 빌드 | 이미지 크기 및 보안 최적화 | 복잡한 애플리케이션 및 빌드 종속성 포함 |
다단계 빌드 예제
## 단계 1: 빌드 단계
FROM maven:3.8.1-openjdk-11 AS build
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn package
## 단계 2: 런타임 단계
FROM openjdk:11-jre-slim
WORKDIR /app
COPY --from=build /app/target/myapp.jar .
EXPOSE 8080
CMD ["java", "-jar", "myapp.jar"]
Docker 이미지 빌드 및 관리
## 이미지 빌드
docker build -t myapp:v1 .
## 로컬 이미지 목록
docker images
## 이미지 삭제
docker rmi myapp:v1
## 이미지 태그
docker tag myapp:v1 myregistry/myapp:latest
이미지 최적화 기법
- 최소한의 베이스 이미지 사용
- 레이어 수 최소화
- 빌드 캐시 활용
- 불필요한 파일 제거
- .dockerignore 파일 사용
Docker 이미지 레이어
graph TD
A[베이스 이미지 레이어] --> B[종속성 설치 레이어]
B --> C[애플리케이션 코드 레이어]
C --> D[설정 레이어]
D --> E[엔트리포인트 레이어]
컨테이너 관리
컨테이너 수명주기 관리
Docker 컨테이너는 여러 상태와 관리 전략을 가진 복잡한 수명주기를 갖습니다. 효과적인 컨테이너 오케스트레이션을 위해 이러한 상태를 이해하는 것이 중요합니다.
graph LR
A[생성됨] --> B[실행 중]
B --> C[일시 중지됨]
B --> D[중지됨]
D --> E[제거됨]
기본 컨테이너 작업
| 작업 | 명령어 | 설명 |
|---|---|---|
| 시작 | docker start <컨테이너> |
중지된 컨테이너를 다시 시작합니다. |
| 중지 | docker stop <컨테이너> |
실행 중인 컨테이너를 정상적으로 중지합니다. |
| 재시작 | docker restart <컨테이너> |
컨테이너를 중지하고 다시 시작합니다. |
| 제거 | docker rm <컨테이너> |
컨테이너를 삭제합니다. |
고급 컨테이너 관리
## 분리된 모드로 컨테이너 실행
docker run -d --name webserver nginx
## 컨테이너 세부 정보 확인
docker inspect webserver
## 컨테이너 로그 보기
docker logs webserver
## 실행 중인 컨테이너 내에서 명령 실행
docker exec -it webserver /bin/bash
리소스 관리 및 제약 조건
## CPU 및 메모리 제한
docker run -d \
--cpus="1.5" \
--memory="512m" \
--name limited-container \
nginx
컨테이너 네트워킹
graph TD
A[호스트 네트워크] --> B[브리지 네트워크]
B --> C[사용자 지정 네트워크]
C --> D[오버레이 네트워크]
네트워크 구성 예제
## 사용자 지정 네트워크 생성
docker network create myapp-network
## 사용자 지정 네트워크에서 컨테이너 실행
docker run -d --network=myapp-network --name db postgres
docker run -d --network=myapp-network --name webapp nginx
컨테이너 확장
## Docker Compose를 사용하여 확장
version: '3'
services:
webapp:
image: nginx
deploy:
replicas: 5
성능 모니터링
## 실시간 컨테이너 통계
docker stats
## 리소스 사용량이 있는 실행 중인 컨테이너 목록
docker ps -q | xargs docker stats --no-stream
컨테이너 백업 및 마이그레이션
## 컨테이너를 tar 아카이브로 내보내기
docker export container_name > container.tar
## 아카이브에서 컨테이너 가져오기
docker import container.tar new_image_name
요약
이 자세한 튜토리얼에서는 Dockerfile 을 사용하여 효율적인 Docker 이미지를 구축하는 방법을 배웠습니다. Docker 이미지와 Dockerfile 의 기본 사항을 탐색하고, Dockerfile 레이어 최적화, Docker 이미지 캐시 관리 및 다단계 빌드 활용 기술을 발견했습니다. 이러한 최선의 방법을 따르면 더 작고, 빌드 속도가 빠르며, 유지 관리가 쉬운 Docker 이미지를 만들 수 있습니다. 궁극적으로 Docker 기반 애플리케이션 개발 및 배포 워크플로우를 개선할 수 있습니다.



