소개
이 포괄적인 Docker 튜토리얼은 개발자들에게 컨테이너화 기본 원리, Docker 설치 및 컨테이너 관리에 대한 실질적인 가이드를 제공합니다. 특히 Ubuntu 에서 Python Flask 애플리케이션에 맞춰져 있습니다. 핵심 Docker 개념, 설치 절차 및 필수 명령어를 탐색함으로써 학습자는 애플리케이션 개발 및 배포 워크플로우를 효율화하는 실질적인 기술을 습득하게 될 것입니다.
Docker 기본
Docker 기본 개념 소개
Docker 는 소프트웨어 개발 및 배포를 혁신하는 강력한 컨테이너 플랫폼입니다. 컨테이너 기술로서 Docker 는 애플리케이션과 모든 종속성을 패키징하여 다양한 컴퓨팅 환경에서 일관된 성능을 보장합니다.
컨테이너화의 핵심 개념
graph TD
A[Docker 이미지] --> B[컨테이너]
A --> C[Dockerfile]
B --> D[격리된 런타임 환경]
| 개념 | 설명 |
|---|---|
| Docker 이미지 | 애플리케이션 코드와 종속성이 포함된 읽기 전용 템플릿 |
| 컨테이너 | 이미지의 가벼운 실행 가능한 인스턴스 |
| Dockerfile | 이미지 생성 단계를 정의하는 텍스트 파일 |
Ubuntu 22.04 에서 Docker 설치
## 시스템 패키지 업데이트
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 Hub에서 이미지 가져오기
## 로컬 이미지 목록
## 컨테이너 실행
## 실행 중인 컨테이너 목록
## 컨테이너 중지
Docker 아키텍처 이해
Docker 는 Docker 클라이언트가 Docker 데몬과 통신하는 클라이언트 - 서버 아키텍처를 사용합니다. Docker 데몬은 컨테이너, 이미지, 네트워크 및 저장소 볼륨을 관리합니다.
컨테이너 수명주기 관리
컨테이너는 애플리케이션을 위한 격리되고 재현 가능한 환경을 제공합니다. 컨테이너는 쉽게 생성, 시작, 중지, 이동 및 삭제할 수 있으며, 소프트웨어 배포에 전례 없는 유연성을 제공합니다.
Flask 애플리케이션 빌드
Flask 웹 애플리케이션 컨테이너화
Flask 는 웹 애플리케이션을 컨테이너화하기에 적합한 가벼운 Python 웹 프레임워크입니다. Docker 는 일관된 환경에서 Flask 프로젝트를 패키징하고 배포하는 효율적인 방법을 제공합니다.
프로젝트 구조 및 준비
graph TD
A[프로젝트 루트] --> B[app.py]
A --> C[requirements.txt]
A --> D[Dockerfile]
A --> E[templates/]
| 파일 | 용도 |
|---|---|
| app.py | 주요 Flask 애플리케이션 스크립트 |
| requirements.txt | Python 패키지 종속성 |
| Dockerfile | 컨테이너 빌드 지침 |
| templates/ | HTML 템플릿 디렉토리 |
샘플 Flask 애플리케이션
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def home():
return render_template('index.html')
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
Dockerfile 생성
## 공식 Python 런타임 사용
FROM python:3.9-slim
## 작업 디렉토리 설정
WORKDIR /app
## 프로젝트 파일 복사
COPY . /app
## 종속성 설치
RUN pip install --no-cache-dir -r requirements.txt
## 애플리케이션 포트 노출
EXPOSE 5000
## 애플리케이션 실행
CMD ["python", "app.py"]
Docker Compose 구성
version: "3"
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/app
컨테이너 빌드 및 실행
## Docker 이미지 빌드
docker build -t flask-app .
## 컨테이너 실행
docker run -p 5000:5000 flask-app
## 또는 docker-compose 사용
docker-compose up
컨테이너화의 이점
Docker 는 Flask 개발자가 다른 시스템에서도 격리된 종속성과 일관된 런타임 환경을 갖춘 재현 가능하고 휴대 가능한 웹 애플리케이션을 만들 수 있도록 지원합니다.
Docker 프로덕션 환경
Kubernetes 를 이용한 컨테이너 오케스트레이션
graph TD
A[Docker 클러스터] --> B[마스터 노드]
A --> C[워커 노드]
B --> D[API 서버]
B --> E[스케줄러]
C --> F[컨테이너 Pod]
프로덕션 배포 전략
| 전략 | 설명 |
|---|---|
| 롤링 업데이트 | 중단 없이 배포 |
| 블루 - 그린 배포 | 즉각적인 트래픽 전환 |
| 캐니리 릴리스 | 점진적인 트래픽 마이그레이션 |
Ubuntu 서버 구성
## 시스템 패키지 업데이트
sudo apt update && sudo apt upgrade -y
## Docker 설치
sudo apt install docker.io kubernetes-cli -y
## Docker 데몬 구성
sudo systemctl enable docker
sudo systemctl start docker
확장성을 위한 Docker Compose
version: "3"
services:
web:
image: myapp:latest
deploy:
replicas: 4
update_config:
parallelism: 2
ports:
- "80:8000"
컨테이너 모니터링 구성
## Prometheus 설치
docker run -d \
-p 9090:9090 \
-v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus
## Grafana 설치
docker run -d \
-p 3000:3000 \
grafana/grafana
보안 권장 사항
## 제한된 권한으로 컨테이너 실행
docker run --read-only \
--tmpfs /tmp \
--tmpfs /run \
-d myimage
## Docker 시크릿 관리 사용
echo "mysecretpassword" | docker secret create db_password -
성능 최적화
## 컨테이너 리소스 제한
docker run -d \
--cpus=2 \
--memory=4g \
myapplication
네트워크 구성 관리
## 사용자 정의 브리지 네트워크 생성
docker network create \
--driver bridge \
--subnet 192.168.0.0/24 \
production_network
요약
Docker 는 컨테이너화를 통해 일관되고 휴대 가능한 애플리케이션 환경을 제공하여 소프트웨어 개발을 혁신합니다. 이 튜토리얼은 이미지 생성, 컨테이너 관리 및 배포 전략을 포함한 Docker 핵심 기술을 개발자들에게 제공했습니다. 이러한 기술을 숙달함으로써 개발자는 다양한 컴퓨팅 플랫폼에서 Flask 애플리케이션을 효율적으로 패키징, 배포 및 실행하여 안정성과 성능을 향상시킬 수 있습니다.



