Docker 컨테이너 빌드 및 구성 가이드

DockerBeginner
지금 연습하기

소개

이 포괄적인 Docker 튜토리얼은 개발자 및 IT 전문가에게 컨테이너 기술을 이해하고 구현하는 실용적인 가이드를 제공합니다. Docker 의 핵심 개념, 설치 프로세스 및 기본 명령어를 탐색함으로써 학습자는 현대적인 소프트웨어 배포 및 개발 환경을 위한 필수적인 기술을 습득하게 될 것입니다.

Docker 기본 개념

Docker 란 무엇인가?

Docker 는 소프트웨어 배포 및 개발을 혁신하는 강력한 컨테이너 기술입니다. 개발자는 애플리케이션과 모든 종속성을 컨테이너라는 표준화된 단위에 패키징하여 다양한 컴퓨팅 환경에서 일관적인 성능을 보장할 수 있습니다.

Docker 의 핵심 개념

컨테이너화 기술

컨테이너화는 애플리케이션이 격리된 환경에서 실행되도록 하여 여러 가지 주요 이점을 제공합니다.

특징 설명
격리 컨테이너는 서로 간섭하지 않고 독립적으로 실행됩니다.
이식성 애플리케이션은 다른 시스템 간에 원활하게 이동될 수 있습니다.
효율성 기존 가상 머신보다 가볍고 빠릅니다.
graph TD A[애플리케이션 코드] --> B[Docker 컨테이너] B --> C[일관된 배포] B --> D[자원 효율성]

Ubuntu 22.04 에서 Docker 설치

Ubuntu 에 Docker 를 설치하려면 다음 명령어를 사용합니다.

## 패키지 인덱스 업데이트
sudo apt-get update

## 종속성 설치
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common

## Docker 공식 GPG 키 추가
curl -fsSL | sudo apt-key add -

## Docker 리포지토리 설정
sudo add-apt-repository "deb [arch=amd64]  $(lsb_release -cs) stable"

## Docker CE 설치
sudo apt-get update
sudo apt-get install docker-ce

첫 번째 Docker 컨테이너 예제

간단한 nginx 컨테이너를 생성하고 실행합니다.

## nginx 이미지 가져오기
sudo docker pull nginx

## nginx 컨테이너 실행
sudo docker run -d -p 80:80 nginx

이 명령은 nginx 이미지를 다운로드하고 컨테이너를 실행하며, 컨테이너의 포트 80 을 호스트 시스템의 포트 80 으로 매핑합니다.

주요 Docker 구성 요소

  • Docker 엔진: 핵심 실행 환경
  • Docker 이미지: 컨테이너를 위한 읽기 전용 템플릿
  • Docker 컨테이너: 이미지의 실행 가능한 인스턴스
  • Dockerfile: 사용자 지정 이미지를 빌드하기 위한 스크립트

환경 변수

Docker 환경 변수 이해

환경 변수는 Docker 컨테이너에 대한 구성 및 실행 정보를 제공하는 키 - 값 쌍입니다. 컨테이너의 소스 코드를 수정하지 않고도 동적으로 애플리케이션을 구성할 수 있도록 합니다.

환경 변수 구성 유형

구성 방법 설명 사용 사례
Dockerfile ENV 이미지 빌드 시 정적 환경 변수를 정의 기본 구성 설정
Docker Run 명령어 실행 시점 특정 변수를 전달 기본 설정 재정의
Docker Compose 구성 파일에서 환경 변수를 정의 복잡한 멀티 컨테이너 설정
graph TD A[환경 변수 소스] --> B[Dockerfile] A --> C[Docker Run 명령어] A --> D[Docker Compose]

Dockerfile 환경 변수 예제

환경 변수가 포함된 간단한 Dockerfile 을 만듭니다.

## 기본 이미지
FROM ubuntu:22.04

## 환경 변수 설정
ENV APP_HOME=/opt/myapp
ENV DATABASE_URL=localhost
ENV LOG_LEVEL=info

## 애플리케이션 디렉토리 생성
RUN mkdir -p $APP_HOME

## 작업 디렉토리 설정
WORKDIR $APP_HOME

실행 시 환경 변수 주입

컨테이너 실행 시 환경 변수를 전달합니다.

## 사용자 지정 환경 변수로 컨테이너 실행
docker run -e DATABASE_URL=postgresql://user:pass@db.example.com \
  -e LOG_LEVEL=debug \
  myapp:latest

Docker Compose 환경 구성

환경 변수가 포함된 docker-compose.yml 예제:

version: "3"
services:
  web:
    image: myapp
    environment:
      - DATABASE_URL=postgresql://user:pass@db
      - LOG_LEVEL=info

환경 변수 사용에 대한 권장 사항

  • 민감한 정보는 환경 변수를 사용합니다.
  • 자격 증명을 하드코딩하지 않습니다.
  • 로컬 개발을 위해 .env 파일을 활용합니다.
  • 안전한 변수 관리 전략을 구현합니다.

Docker 최적화 가이드

컨테이너 이미지 최적화

성능과 보안을 위해 효율적인 Docker 이미지를 구축하는 것이 중요합니다. 이미지 크기와 복잡성을 줄이기 위해 다단계 빌드를 구현하세요.

## 다단계 빌드 예제
FROM golang:1.17 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp

FROM alpine:latest
COPY --from=builder /app/myapp /usr/local/bin/
EXPOSE 8080
CMD ["myapp"]

보안 고려 사항

보안 관행 설명 구현 방법
최소한의 기본 이미지 가벼운 기본 이미지 사용 Alpine Linux
비 루트 사용자 컨테이너를 비 루트 사용자로 실행 USER 지시어
이미지 스캐닝 취약점 감지 Trivy, Docker Scout
graph TD A[Docker 보안] --> B[최소 이미지] A --> C[비 루트 실행] A --> D[정기 스캐닝]

컨테이너 리소스 관리

컨테이너 과부하를 방지하기 위해 리소스 제약을 구현하세요.

## CPU 및 메모리 사용량 제한
docker run -d \
  --cpus="0.5" \
  --memory="512m" \
  --memory-reservation="256m" \
  myapp:latest

Dockerfile 최적화 기법

이미지 레이어를 줄이고 빌드 프로세스를 최적화하세요.

## 명령어 결합하여 레이어 최소화
RUN apt-get update \
 && apt-get install -y python3 \
 && apt-get clean \
 && rm -rf /var/lib/apt/lists/*

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

복잡한 배포를 위해 Docker Compose 를 활용하세요.

version: "3"
services:
  web:
    image: myapp
    deploy:
      replicas: 3
      restart_policy:
        condition: on-failure
    ports:
      - "8080:80"

로깅 및 모니터링 전략

중앙 집중식 로깅 및 모니터링을 구성하세요.

## JSON 파일 로깅 및 크기 제한
docker run --log-driver json-file \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  myapp:latest

요약

Docker 는 소프트웨어 배포에 혁명적인 접근 방식을 제시하며, 개발자들이 다양한 컴퓨팅 환경에서 애플리케이션을 생성, 관리 및 확장하는 강력한 도구를 제공합니다. 컨테이너화 기술을 숙달함으로써 개발자들은 소프트웨어 개발 및 배포 워크플로우에서 더 큰 일관성, 이식성 및 효율성을 달성할 수 있습니다.