Ubuntu 에서 Docker 컨테이너 설정 방법

DockerBeginner
지금 연습하기

소개

이 포괄적인 Docker 튜토리얼은 개발자 및 IT 전문가에게 컨테이너화 기술을 이해하는 데 필수적인 기술을 제공합니다. Docker 의 핵심 개념, 아키텍처 및 실제 구현 전략을 탐색함으로써 학습자는 애플리케이션 배포를 간소화하고 소프트웨어 개발 워크플로우를 개선하기 위한 실질적인 지식을 얻게 될 것입니다.

Docker 기본 개념

Docker 소개

Docker 는 컨테이너화를 위한 강력한 플랫폼으로, 소프트웨어 패키징 및 배포를 혁신하고 있습니다. 선도적인 컨테이너 기술로서 Docker 는 개발자가 다양한 컴퓨팅 환경에서 애플리케이션을 일관되게 생성, 배포 및 실행할 수 있도록 지원합니다.

컨테이너화의 핵심 개념

컨테이너화는 애플리케이션과 모든 종속성을 함께 패키징하여 다양한 시스템에서 일관된 성능을 보장합니다. 기존 가상 머신과 달리 컨테이너는 호스트 시스템의 커널을 공유하여 가볍고 효율적입니다.

graph TD
    A[애플리케이션 코드] --> B[Docker 컨테이너]
    B --> C[일관된 배포]
    B --> D[격리된 환경]

Docker 아키텍처

구성 요소 설명 기능
Docker 데몬 백그라운드 서비스 Docker 객체를 관리합니다.
Docker 클라이언트 명령줄 인터페이스 Docker 데몬에 명령을 전송합니다.
Docker 레지스트리 이미지 저장소 Docker 이미지를 저장하고 배포합니다.

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

## Docker 리포지토리 설정
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 Hub에서 이미지 가져오기
docker pull ubuntu:latest

## 사용 가능한 이미지 목록
docker images

## 컨테이너 실행
docker run -it ubuntu:latest /bin/bash

Docker 의 주요 이점

Docker 를 통한 컨테이너화는 다음과 같은 중요한 이점을 제공합니다.

  • 개발 및 프로덕션 환경에서의 일관성
  • 빠른 애플리케이션 배포
  • 효율적인 리소스 활용
  • 간소화된 종속성 관리
  • 향상된 확장성 및 이식성

컨테이너 수명주기

컨테이너 상태 및 관리

Docker 컨테이너는 생성부터 종료까지 수명주기 동안 여러 상태를 거칩니다. 이러한 상태를 이해하는 것은 효과적인 컨테이너 관리 및 배포에 필수적입니다.

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

컨테이너 생성 및 초기화

## 기본 이미지 가져오기
docker pull ubuntu:latest

## 컨테이너 생성 및 시작
docker run -d --name mycontainer ubuntu:latest

## 대화형 터미널로 컨테이너 실행
docker run -it ubuntu:latest /bin/bash

컨테이너 관리 명령어

명령어 기능 예시
docker create 새 컨테이너 생성 docker create ubuntu:latest
docker start 중지된 컨테이너 시작 docker start mycontainer
docker stop 실행 중인 컨테이너 중지 docker stop mycontainer
docker restart 컨테이너 재시작 docker restart mycontainer
docker pause 컨테이너 프로세스 일시 중지 docker pause mycontainer
docker unpause 컨테이너 일시 중지 해제 docker unpause mycontainer

컨테이너 배포 전략

## 여러 컨테이너 인스턴스 배포
docker run -d --name web1 nginx
docker run -d --name web2 nginx
docker run -d --name web3 nginx

## 실행 중인 컨테이너 확인
docker ps

Docker Compose 를 이용한 컨테이너 확장

version: "3"
services:
  webapp:
    image: nginx
    deploy:
      replicas: 3

리소스 관리

## 컨테이너 리소스 제한
docker run -d --cpus=0.5 --memory=512m nginx

컨테이너 제거

## 중지된 컨테이너 제거
docker rm mycontainer

## 실행 중인 컨테이너 강제 제거
docker rm -f mycontainer

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

컨테이너 최적화 가이드

Dockerfile 최적화

## 특정 이미지 태그 사용
FROM ubuntu:22.04

## 레이어 수 최소화
RUN apt-get update \
 && apt-get install -y python3 \
 && rm -rf /var/lib/apt/lists/*

## 다단계 빌드 사용
FROM python:3.9-slim
COPY --from=builder /app /app

컨테이너 모니터링 전략

graph TD
    A[컨테이너 모니터링] --> B[리소스 사용량]
    A --> C[성능 지표]
    A --> D[로그]

성능 지표 추적

지표 명령어 목적
CPU 사용량 docker stats 프로세서 사용량 모니터링
메모리 docker top 메모리 할당량 추적
네트워크 docker network inspect 네트워크 성능 분석

보안 최적화 가이드라인

## 최소 권한으로 컨테이너 실행
docker run --read-only --tmpfs /tmp nginx

## 컨테이너 기능 제한
docker run --cap-drop ALL --cap-add NET_BIND_SERVICE nginx

컨테이너 건강성 검사

HEALTHCHECK --interval=5m --timeout=3s \
 CMD curl -f || exit 1

로그 및 문제 해결

## 컨테이너 로그 확인
docker logs mycontainer

## 실시간 로그 모니터링
docker logs -f mycontainer

## 자세한 컨테이너 정보 확인
docker inspect mycontainer

리소스 관리

## 리소스 제약 설정
docker run -d \
  --cpus=1 \
  --memory=512m \
  --memory-reservation=256m \
  nginx

컨테이너 오케스트레이션 원칙

version: "3"
services:
  webapp:
    image: myapp
    deploy:
      replicas: 3
      restart_policy:
        condition: on-failure

요약

Docker 는 가볍고 일관성 있고 휴대 가능한 컨테이너 환경을 제공하여 소프트웨어 개발을 혁신합니다. 이 튜토리얼은 Docker 를 설치하고 컨테이너를 관리하며 다양한 컴퓨팅 플랫폼에서 컨테이너화 기술을 효과적으로 활용하는 기본적인 기술을 익히도록 돕습니다. 이러한 기술을 숙달함으로써 개발자는 애플리케이션의 안정성, 확장성 및 배포 효율성을 높일 수 있습니다.