현대 개발을 위한 Docker 핵심 기술 익히기

DockerBeginner
지금 연습하기

소개

이 포괄적인 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 및 클라우드 네이티브 애플리케이션 아키텍처에서 없어서는 안 될 도구입니다.