Docker 컨테이너 기본 및 수명주기 마스터 가이드

DockerBeginner
지금 연습하기

소개

이 포괄적인 Docker 컨테이너 튜토리얼은 개발자 및 DevOps 전문가에게 컨테이너 기본 사항, 수명주기 관리 및 컨테이너 생성, 실행, 그리고 정상적인 종료를 위한 최상의 실무에 대한 심층적인 통찰력을 제공합니다. 핵심 컨테이너 개념, 아키텍처 및 실제 구현 전략을 탐색함으로써 학습자는 컨테이너화 기술에 대한 탄탄한 이해를 얻게 될 것입니다.

Docker 컨테이너 기본

Docker 컨테이너란 무엇인가요?

Docker 컨테이너는 애플리케이션 실행에 필요한 모든 것을 포함하는 (코드, 런타임, 시스템 도구, 라이브러리 및 설정) 가벼우며 독립적인 실행 가능 패키지입니다. 일관되고 휴대 가능한 소프트웨어 개발 및 배포 환경을 제공합니다.

핵심 컨테이너 개념

컨테이너는 기존 가상 머신과 달리 호스트 시스템의 커널을 공유하여 더 효율적이고 빠르게 시작할 수 있습니다. 애플리케이션과 종속성을 캡슐화하여 다양한 컴퓨팅 환경에서 일관된 동작을 보장합니다.

graph TD A[애플리케이션 코드] --> B[컨테이너 이미지] B --> C[Docker 컨테이너] C --> D[호스트 운영 체제]

컨테이너 아키텍처

구성 요소 설명
Docker 엔진 컨테이너 생성 및 관리를 위한 런타임 환경
컨테이너 이미지 애플리케이션과 종속성이 포함된 읽기 전용 템플릿
컨테이너 런타임 컨테이너를 실행 및 구동

실제 예제: 간단한 컨테이너 생성

## Ubuntu 기반 이미지 가져오기
docker pull ubuntu:22.04

## 대화형 컨테이너 실행
docker run -it ubuntu:22.04 /bin/bash

## 컨테이너 내에서 패키지 설치
apt-get update
apt-get install -y nginx

## 컨테이너 종료
exit

주요 컨테이너 특징

  • 격리: 각 컨테이너는 독립적으로 실행됩니다.
  • 휴대성: 다양한 환경에서 일관되게 실행됩니다.
  • 효율성: 가볍고 빠르게 시작할 수 있습니다.
  • 확장성: 복제 및 배포가 용이합니다.

컨테이너 사용 사례

컨테이너는 다음과 같은 분야에서 널리 사용됩니다.

  • 마이크로서비스 아키텍처
  • 지속적 통합/지속적 배포 (CI/CD)
  • 클라우드 네이티브 애플리케이션 개발
  • DevOps 실무

컨테이너 수명주기 관리

컨테이너 상태 및 전환

Docker 컨테이너는 수명주기 동안 여러 상태를 가지며, 이는 실행 및 관리의 서로 다른 단계를 나타냅니다. 이러한 상태를 이해하는 것은 효과적인 컨테이너 운영에 필수적입니다.

stateDiagram-v2 [*] --> Created Created --> Running Running --> Paused Paused --> Running Running --> Stopped Stopped --> Removed Removed --> [*]

컨테이너 관리 명령어

명령어 기능 예시
docker create 새로운 컨테이너 생성 docker create nginx
docker start 중지된 컨테이너 시작 docker start container_id
docker run 컨테이너 생성 및 시작 docker run -d nginx
docker stop 실행 중인 컨테이너 중지 docker stop container_id
docker restart 컨테이너 재시작 docker restart container_id
docker rm 컨테이너 제거 docker rm container_id

실제 컨테이너 수명주기 예제

## Ubuntu 이미지에서 새로운 컨테이너 생성
docker create --name mycontainer ubuntu:22.04

## 생성된 컨테이너 시작
docker start mycontainer

## 실행 중인 컨테이너 내에서 명령 실행
docker exec mycontainer apt-get update

## 컨테이너 중지
docker stop mycontainer

## 컨테이너 제거
docker rm mycontainer

컨테이너 리소스 관리

컨테이너는 시스템 성능을 최적화하기 위해 리소스 제약 조건으로 관리될 수 있습니다.

## CPU 및 메모리 제한으로 컨테이너 실행
docker run -d \
  --cpus="1.5" \
  --memory="512m" \
  nginx

컨테이너 모니터링 및 검사

## 모든 컨테이너 목록
docker ps -a

## 컨테이너 세부 정보 보기
docker inspect container_id

## 컨테이너 리소스 사용량 모니터링
docker stats container_id

원활한 컨테이너 종료

컨테이너 종료 이해

원활한 컨테이너 종료는 실행 중인 프로세스를 적절하게 종료하여 컨테이너 중지 작업 중 데이터 손실을 방지하고 시스템 무결성을 유지합니다.

sequenceDiagram participant 컨테이너 participant Docker 엔진 Docker 엔진->>컨테이너: SIGTERM 신호 컨테이너->>컨테이너: 정리 프로세스 Docker 엔진->>컨테이너: SIGKILL 신호 (종료되지 않은 경우)

종료 신호 처리

신호 설명 기본 동작
SIGTERM 종료 요청 원활한 종료
SIGKILL 즉각적인 종료 강제 종료
SIGINT 키보드로부터의 중단 프로세스 종료

실제 종료 전략

## 기본 10초 타임아웃으로 원활하게 종료
docker stop container_name

## 컨테이너 종료에 대한 사용자 지정 타임아웃
docker stop -t 30 container_name

## 컨테이너 강제 제거
docker rm -f container_name

컨테이너에서 신호 처리 구현

## 예시 종료 스크립트
#!/bin/bash
trap 'shutdown_handler' SIGTERM

shutdown_handler() {
  echo "종료 신호를 받았습니다"
  ## 정리 작업 수행
  exit 0
}

## 메인 애플리케이션 시작
exec main_application

고급 종료 기법

## 실행 중인 모든 컨테이너 중지
docker stop $(docker ps -q)

## 중지된 모든 컨테이너 제거
docker container prune

컨테이너 종료 코드

종료 코드는 컨테이너가 종료된 방식에 대한 정보를 제공합니다.

## 컨테이너 종료 코드 확인
docker inspect --format='{{.State.ExitCode}}' container_name

요약

Docker 컨테이너는 탁월한 이식성, 효율성 및 격리 기능을 제공하며, 애플리케이션 배포에 대한 강력한 접근 방식을 나타냅니다. 컨테이너 수명주기 관리를 이해함으로써 개발자는 다양한 컴퓨팅 환경에서 더욱 강력하고 확장 가능하며 유지 관리 가능한 소프트웨어 솔루션을 만들 수 있습니다. 이 튜토리얼은 전문가들이 현대 소프트웨어 개발 및 배포 워크플로에서 컨테이너화 기술을 효과적으로 활용하는 데 필요한 필수적인 기술을 갖추도록 돕습니다.