Ubuntu 에서 Docker 컨테이너 활용법

DockerBeginner
지금 연습하기

소개

이 포괄적인 Docker 튜토리얼은 개발자 및 시스템 관리자에게 컨테이너 기술을 이해하고 구현하는 실용적인 가이드를 제공합니다. Docker 의 핵심 개념, 아키텍처 및 필수 명령어를 탐색함으로써 학습자는 다양한 컴퓨팅 환경에서 애플리케이션을 효율적으로 패키징, 배포 및 관리하는 데 필요한 기술을 습득하게 됩니다.

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

## 안정적인 리포지토리 설정
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 버전 확인

## Ubuntu 이미지 가져오기

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

## 컨테이너 실행

## 실행 중인 컨테이너 목록

## 컨테이너 중지

Docker 의 주요 이점

  • 일관된 개발 환경
  • 더 빠른 애플리케이션 배포
  • 개선된 리소스 활용
  • 간소화된 종속성 관리
  • 향상된 확장성 및 이식성

Docker Compose 워크플로우

Docker Compose 이해

Docker Compose 는 여러 컨테이너로 구성된 Docker 애플리케이션을 정의하고 실행하는 도구입니다. YAML 파일을 사용하여 애플리케이션 서비스, 네트워크 및 볼륨을 구성하여 복잡한 애플리케이션 아키텍처를 간단한 구성으로 구현합니다.

graph TD A[Docker Compose YAML] --> B[서비스 구성] B --> C[컨테이너 오케스트레이션] B --> D[네트워크 설정] B --> E[볼륨 관리]

Ubuntu 22.04 에서 설치

## Docker Compose 설치
sudo apt update
sudo apt install docker-compose-plugin

## 설치 확인
docker compose version

Docker Compose 구성 파일

일반적인 docker-compose.yml 구조에는 서비스, 네트워크 및 볼륨이 포함됩니다.

version: "3.8"
services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
  database:
    image: postgres:13
    environment:
      POSTGRES_PASSWORD: mysecretpassword
    volumes:
      - postgres-data:/var/lib/postgresql/data

volumes:
  postgres-data:

주요 Docker Compose 명령어

명령어 설명
docker compose up 컨테이너 생성 및 시작
docker compose down 컨테이너 중지 및 제거
docker compose ps 컨테이너 목록
docker compose logs 컨테이너 로그 확인
docker compose build 서비스 빌드 또는 재빌드

여러 컨테이너 애플리케이션 예제

version: "3.8"
services:
  frontend:
    build: ./frontend
    ports:
      - "3000:3000"
  backend:
    build: ./backend
    ports:
      - "5000:5000"
    depends_on:
      - database
  database:
    image: mongo:latest
    volumes:
      - mongodb_data:/data/db

volumes:
  mongodb_data:

고급 구성 기법

services:
  web:
    restart: always
    environment:
      - DEBUG=True
    networks:
      - app_network
    deploy:
      replicas: 3
      update_config:
        parallelism: 1

networks:
  app_network:
    driver: bridge

고급 Docker 전략

Kubernetes 를 이용한 컨테이너 오케스트레이션

컨테이너 오케스트레이션은 여러 호스트에 걸쳐 복잡하고 분산된 애플리케이션을 관리하여 Docker 의 기능을 확장합니다.

graph TD A[Docker 컨테이너] --> B[Kubernetes 클러스터] B --> C[자동 배포] B --> D[확장] B --> E[자체 복구]

성능 최적화 기법

최적화 전략 구현 방법
다단계 빌드 이미지 크기 축소
레이어 캐싱 빌드 속도 향상
최소 기본 이미지 리소스 소비량 최소화

고급 Dockerfile 최적화

## 다단계 빌드 예제
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"]

컨테이너 모니터링 및 로깅

## Docker 모니터링 도구 설치
sudo apt update
sudo apt install prometheus node-exporter

## 고급 로깅 구성
docker run --log-driver=journald \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  myimage

지속적인 배포 워크플로우

version: "3.8"
services:
  app:
    image: myapp:${DEPLOY_VERSION}
    deploy:
      replicas: 3
      update_config:
        parallelism: 1
        delay: 10s
    networks:
      - production

networks:
  production:
    driver: overlay

보안 권장 사항

## 권한 축소된 컨테이너 실행
docker run --read-only \
  --tmpfs /tmp \
  --security-opt=no-new-privileges:true \
  myimage

리소스 관리

services:
  web:
    deploy:
      resources:
        limits:
          cpus: "0.50"
          memory: 512M
        reservations:
          cpus: "0.25"
          memory: 256M

요약

Docker 는 소프트웨어 배포 방식에 혁신을 가져오는 기술로, 애플리케이션 개발을 위한 가볍고 일관성 있고 격리된 환경을 제공합니다. Docker 의 기본 기술을 숙달함으로써 개발자는 작업 흐름을 간소화하고, 이식성을 향상시키며, 다양한 컴퓨팅 플랫폼에서 복잡한 배포 프로세스를 단순화할 수 있습니다.