소개
이 포괄적인 Docker 튜토리얼은 개발자 및 IT 전문가들에게 컨테이너 기술에 대한 심층적인 이해를 제공합니다. 기본 개념, 아키텍처 원칙 및 실제 구현 전략을 다룹니다. Docker 의 핵심 메커니즘을 이해하고 필수 명령어를 숙달하는 데부터, 이 가이드는 현대 소프트웨어 개발 및 배포를 위해 Docker 를 활용하는 구조적인 접근 방식을 제시합니다.
Docker 기본
Docker 기술 소개
Docker 는 소프트웨어 배포 및 가상화를 혁신하는 강력한 컨테이너 기술입니다. 오픈소스 플랫폼으로서 Docker 는 개발자가 다양한 컴퓨팅 환경에서 애플리케이션을 일관되게 패키징, 배포 및 실행할 수 있도록 지원합니다.
Docker 의 핵심 개념
컨테이너 대 가상 머신
graph TD
A[물리적 하드웨어] --> B[Docker 컨테이너]
A --> C[가상 머신]
B --> D[경량]
B --> E[공유 커널]
C --> F[중량]
C --> G[전체 OS]
| 특징 | Docker 컨테이너 | 가상 머신 |
|---|---|---|
| 자원 사용량 | 경량 | 중량 |
| 시작 시간 | 몇 초 | 몇 분 |
| 격리 수준 | 프로세스 수준 | 전체 OS 수준 |
Docker 아키텍처
Docker 는 클라이언트 - 서버 아키텍처를 사용하며 다음과 같은 주요 구성 요소를 포함합니다.
- Docker 데몬
- Docker 클라이언트
- Docker 레지스트리
- Docker 이미지
- Docker 컨테이너
기본 Docker 명령어
Ubuntu 22.04 에 Docker 설치:
## 시스템 패키지 업데이트
sudo apt update
## Docker 종속성 설치
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
## Docker 리포지토리 설정
echo "deb [arch=$(dpkg --print-architecture)] $(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 pull ubuntu:latest
## 이미지 목록
docker images
## 컨테이너 실행
docker run -it ubuntu:latest /bin/bash
## 실행 중인 컨테이너 목록
docker ps
## 컨테이너 중지
docker stop [컨테이너 ID]
Docker 활용 사례
Docker 기술은 다음과 같은 분야에서 중요합니다.
- 마이크로서비스 아키텍처
- 지속적 통합/지속적 배포 (CI/CD)
- 클라우드 네이티브 애플리케이션 개발
- 일관된 개발 환경
- 확장 가능한 인프라 관리
이미지 생성 가이드
Docker 이미지 이해
Docker 이미지는 컨테이너를 생성하는 데 사용되는 읽기 전용 템플릿입니다. 애플리케이션 실행에 필요한 파일 시스템 변경 사항과 구성을 나타내는 여러 레이어로 구성됩니다.
Dockerfile 기본
graph TD
A[Dockerfile] --> B[베이스 이미지]
A --> C[환경 설정]
A --> D[애플리케이션 코드]
A --> E[구성]
A --> F[실행 지시사항]
Dockerfile 구조
| 명령어 | 목적 | 예시 |
|---|---|---|
| FROM | 베이스 이미지 정의 | FROM ubuntu:22.04 |
| RUN | 명령 실행 | RUN apt-get update |
| COPY | 파일 복사 | COPY ./app /application |
| WORKDIR | 작업 디렉토리 설정 | WORKDIR /application |
| EXPOSE | 네트워크 포트 정의 | EXPOSE 8080 |
| CMD | 기본 컨테이너 명령어 | CMD ["python", "app.py"] |
샘플 Dockerfile 생성
## 공식 Ubuntu 베이스 이미지 사용
FROM ubuntu:22.04
## 시스템 패키지 업데이트
RUN apt-get update && apt-get install -y \
python3 \
python3-pip
## 작업 디렉토리 설정
WORKDIR /app
## 애플리케이션 파일 복사
COPY . /app
## 종속성 설치
RUN pip3 install -r requirements.txt
## 애플리케이션 포트 노출
EXPOSE 5000
## 시작 명령어 정의
CMD ["python3", "app.py"]
Docker 빌드 프로세스
Docker 명령어를 사용하여 이미지 빌드:
## Docker 이미지 빌드
docker build -t myapp:v1 .
## 생성된 이미지 목록
docker images
## 생성된 이미지 실행
docker run -p 5000:5000 myapp:v1
이미지 레이어 관리
graph LR
A[베이스 이미지 레이어] --> B[업데이트 레이어]
B --> C[종속성 레이어]
C --> D[애플리케이션 코드 레이어]
D --> E[구성 레이어]
이미지 레이어 최적화 기법
- 레이어 수 최소화
- 다단계 빌드 사용
- 빌드 캐시 활용
- 불필요한 파일 제거
- 특정 이미지 태그 사용
Docker 최적화
성능 최적화 전략
Docker 최적화는 컨테이너 성능 향상, 자원 소비 감소 및 배포 효율 증대에 초점을 맞춥니다.
이미지 크기 축소
graph TD
A[큰 이미지] --> B[다단계 빌드]
A --> C[Alpine 기반 이미지]
A --> D[불필요한 파일 제거]
이미지 크기 비교
| 이미지 유형 | 크기 | 빌드 시간 | 성능 |
|---|---|---|---|
| 표준 Ubuntu | 500MB | 느림 | 낮음 |
| Alpine 기반 | 50MB | 빠름 | 높음 |
| 다단계 | 100MB | 보통 | 최적 |
다단계 빌드 예시
## 빌드 단계
FROM golang:1.17 AS builder
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o myapp
## 프로덕션 단계
FROM alpine:latest
COPY --from=builder /app/myapp /usr/local/bin/
EXPOSE 8080
CMD ["myapp"]
컨테이너 자원 관리
## CPU 및 메모리 제한 설정
docker run -d \
--cpus="1.5" \
--memory="512m" \
--memory-reservation="256m" \
myapp:latest
Docker Compose 최적화
version: "3.8"
services:
webapp:
build:
context: .
cache_from:
- myregistry.com/base-image
deploy:
resources:
limits:
cpus: "0.50"
memory: 512M
reservations:
cpus: "0.25"
memory: 256M
CI/CD 통합 기법
## 캐시 최적화를 사용한 Docker 빌드
docker build \
--cache-from myregistry.com/myapp:latest \
-t myapp:${CI_COMMIT_SHA} .
## 최적화된 이미지 푸시
docker push myregistry.com/myapp:${CI_COMMIT_SHA}
런타임 성능 모니터링
## 실시간 컨테이너 통계
## 컨테이너 자원 사용량
## 컨테이너 성능 검사
요약
Docker 는 소프트웨어 개발에서 혁신적인 기술로, 다양한 컴퓨팅 환경에서 일관되고 효율적이며 확장 가능한 애플리케이션 배포를 가능하게 합니다. 컨테이너 기술을 숙달함으로써 개발자는 워크플로우를 간소화하고, 이식성을 높이며, 자원 활용을 최적화할 수 있습니다. 이러한 이유로 Docker 는 현대 DevOps 및 클라우드 네이티브 애플리케이션 아키텍처에서 없어서는 안 될 도구입니다.



