Docker 이미지 단계별 생성 가이드

DockerBeginner
지금 연습하기

소개

이 포괄적인 Docker 튜토리얼은 개발자 및 DevOps 전문가에게 Docker 이미지를 생성, 관리 및 이해하는 필수 지식을 제공합니다. 이미지 구성 요소, 계층 구조 및 실제 구현 기술을 탐색함으로써 학습자는 컨테이너화 및 애플리케이션 패키징에 대한 실질적인 기술을 습득하게 됩니다.

Docker 이미지 기본

Docker 이미지란 무엇인가요?

Docker 이미지는 컨테이너를 생성하는 데 사용되는 읽기 전용 템플릿입니다. 사전 구성된 소프트웨어 환경, 애플리케이션 코드, 종속성 및 런타임 설정을 포함합니다. Docker 이미지는 다양한 시스템에서 일관되고 재현 가능한 애플리케이션 환경을 배포하기 위한 청사진 역할을 합니다.

Docker 이미지의 주요 구성 요소

graph TD A[Docker 이미지] --> B[기본 계층] A --> C[애플리케이션 계층] A --> D[설정 계층]
구성 요소 설명 예시
기본 계층 기본 운영 체제 Ubuntu 22.04
애플리케이션 계층 소프트웨어 및 종속성 Python 3.9, nginx
설정 계층 런타임 설정 환경 변수

기본 Docker 이미지 생성

간단한 Python 웹 애플리케이션 이미지를 생성하는 예시입니다.

## 프로젝트 디렉토리 생성
mkdir docker-demo
cd docker-demo

## Dockerfile 생성
touch Dockerfile

## Dockerfile 내용
cat > Dockerfile << EOL
FROM ubuntu:22.04
RUN apt-get update && apt-get install -y python3 python3-pip
WORKDIR /app
COPY app.py .
RUN pip3 install flask
EXPOSE 5000
CMD ["python3", "app.py"]
EOL

## 샘플 Flask 애플리케이션 생성
cat > app.py << EOL
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    return "Docker 이미지 예시"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
EOL

## Docker 이미지 빌드
docker build -t python-web-app .

이미지 계층 및 저장

Docker 이미지는 여러 개의 읽기 전용 계층으로 구성됩니다. Dockerfile 의 각 명령은 새로운 계층을 생성하여 효율적인 저장 및 빠른 이미지 생성을 가능하게 합니다. 이미지가 빌드될 때 Docker 는 이러한 계층을 캐싱하여 빌드 시간을 최적화하고 디스크 공간 사용량을 줄입니다.

이미지 식별

Docker 이미지는 다음과 같이 고유하게 식별됩니다.

  • 리포지토리 이름
  • 태그
  • 이미지 ID

예: ubuntu:22.04 또는 python-web-app:latest

Docker 이미지 생성

Dockerfile: 이미지 생성 청사진

Dockerfile 은 Docker 이미지를 생성하기 위한 명령어가 포함된 텍스트 파일입니다. 각 명령어는 이미지에 새로운 계층을 생성하여 환경, 종속성 및 애플리케이션 구성을 정의합니다.

graph TD A[Dockerfile] --> B[기본 이미지] A --> C[종속성 설치] A --> D[애플리케이션 코드 복사] A --> E[런타임 설정]

Dockerfile 명령어 유형

명령어 목적 예시
FROM 기본 이미지 지정 FROM ubuntu:22.04
RUN 명령 실행 RUN apt-get update
COPY 파일 이미지로 복사 COPY app/ /application
WORKDIR 작업 디렉토리 설정 WORKDIR /app
EXPOSE 네트워크 포트 정의 EXPOSE 8080
CMD 기본 컨테이너 명령어 CMD ["python", "app.py"]

실제 Docker 이미지 생성 예시

## 프로젝트 구조 생성
mkdir -p /tmp/docker-nodejs-app
cd /tmp/docker-nodejs-app

## Dockerfile 생성
cat > Dockerfile << EOL
FROM node:16-alpine
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
EOL

## package.json 생성
cat > package.json << EOL
{
  "name": "nodejs-docker-app",
  "version": "1.0.0",
  "dependencies": {
    "express": "^4.17.1"
  }
}
EOL

## 간단한 Express 서버 생성
cat > server.js << EOL
const express = require('express');
const app = express();
const PORT = 3000;

app.get('/', (req, res) => {
  res.send('Docker 이미지 생성 예시');
});

app.listen(PORT, () => {
  console.log($(서버가 포트 ${PORT}에서 실행 중));
});
EOL

## Docker 이미지 빌드
docker build -t nodejs-web-app .

## 이미지 생성 확인
docker images

이미지 빌드 컨텍스트

빌드 컨텍스트는 Dockerfile 과 참조된 파일이 포함된 디렉토리입니다. Docker 는 이미지 생성 중 이 전체 디렉토리를 Docker 데몬으로 전송하여 포괄적인 이미지 생성을 가능하게 합니다.

다단계 빌드

다단계 빌드는 단일 Dockerfile 에서 여러 FROM 문을 사용하여 빌드 시간 종속성을 런타임 환경과 분리함으로써 더 작고 효율적인 이미지를 생성할 수 있습니다.

이미지 관리 기법

Docker 이미지 최적화 전략

효율적인 이미지 관리에는 이미지 크기 축소, 계층 수 최소화, 이미지 생성 및 저장을 위한 최적의 방법 구현이 포함됩니다.

graph TD A[이미지 관리] --> B[크기 축소] A --> C[계층 최적화] A --> D[이미지 버전 관리] A --> E[레지스트리 관리]

이미지 크기 축소 기법

기법 설명 예시
Alpine 기반 이미지 최소한의 Linux 배포판 FROM alpine:3.15
다단계 빌드 빌드 및 런타임 환경 분리 여러 FROM 문 사용
.dockerignore 불필요한 파일 제외 큰 파일 전송 방지

Docker 이미지 수명주기 관리

## 로컬 이미지 목록
docker images

## 사용되지 않는 이미지 제거
docker image prune

## 이미지 태그 및 버전 지정
docker tag original-image:latest myregistry/image:v1.0

## Docker 레지스트리에 푸시
docker push myregistry/image:v1.0

## 특정 이미지 버전 풀
docker pull myregistry/image:v1.0

고급 이미지 최적화 예시

## 최적화된 Dockerfile 생성
cat > Dockerfile << EOL
## Python 애플리케이션을 위한 다단계 빌드
FROM python:3.9-alpine AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

FROM python:3.9-alpine
WORKDIR /app
COPY --from=builder /usr/local/lib/python3.9/site-packages /usr/local/lib/python3.9/site-packages
COPY . .
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser
CMD ["python", "app.py"]
EOL

## requirements 파일 생성
cat > requirements.txt << EOL
flask==2.1.0
gunicorn==20.1.0
EOL

## 최적화된 이미지 빌드
docker build -t optimized-python-app:slim .

## 이미지 크기 분석
docker images | grep optimized-python-app

Docker 레지스트리 관리

Docker 레지스트리는 중앙 집중식 이미지 저장 및 배포를 제공합니다. 버전 관리, 액세스 제어 및 개발 팀 및 환경 간의 효율적인 이미지 공유를 지원합니다.

이미지 계층 캐싱

Docker 는 이미지 계층을 캐싱하여 이후 빌드 속도를 높입니다. Dockerfile 명령어를 가장 자주 변경되는 명령어에서 가장 적게 변경되는 명령어 순서로 정렬하면 재빌드 시간을 최소화하고 이미지 생성 프로세스를 최적화합니다.

요약

Docker 이미지는 현대 소프트웨어 배포에 필수적입니다. 종속성과 함께 애플리케이션을 패키징하는 일관되고 효율적인 방법을 제공합니다. 이미지 생성 기법을 숙달하고, 계층 메커니즘을 이해하며, Dockerfile 명령어를 활용함으로써 개발자는 개발 워크플로우를 간소화하고, 다양한 시스템에서 안정적이고 휴대 가능한 애플리케이션 환경을 보장할 수 있습니다.