Docker는 컨테이너 기반의 오픈소스 가상화 플랫폼이다. 쉽게 말해, 애플리케이션을 실행하는 데 필요한 모든 요소(코드, 라이브러리, 환경설정 등)를 하나의 '패키지'로 묶어서 컨테이너(Container) 라는 독립된 환경에서 실행할 수 있게 해주는 도구다.
| 항목 | 가상머신(VM) | 컨테이너(Docker) |
|---|---|---|
| 구조 | 하이퍼바이저 위에 전체 OS 설치 | 호스트 OS 위에서 격리된 프로세스 실행 |
| 부팅 속도 | 수 분 이상 | 수 초 이내 |
| 리소스 사용 | 무겁고 많은 리소스 사용 | 가볍고 효율적 |
| 용도 | 다양한 OS 환경이 필요한 경우 | 빠른 배포 및 테스트 환경 구성 |
| Docker는 개인 환경에서 사용하는 기존 OS를 매핑해준다.
컨테이너를 실행하기 위한 '설계도'.
우분투, 파이썬, Node.js 등 다양한 환경이 이미지로 제공된다.
이미지를 기반으로 실행된 인스턴스.
이미지가 설계도라면, 컨테이너는 실제 동작하는 집이다.
이미지를 만들기 위한 명세서.
"어떤 기반 이미지로 시작해서, 뭘 설치하고, 뭘 실행할 건지"를 적는다.
공식 이미지나 사용자 정의 이미지를 공유하는 저장소.
https://hub.docker.com에서 다양한 이미지 검색 가능.
컨테이너가 꺼져도 데이터가 유지되도록 하는 방법.
DB 데이터를 저장할 때 자주 사용한다.
# 버전 확인
docker --version
# 이미지 검색
docker search python
# 이미지 다운로드
docker pull python:3.10
# 컨테이너 실행 (터미널 접속 포함)
docker run -it python:3.10 bash
# 실행 중인 컨테이너 목록
docker ps
# 전체 컨테이너 목록 (중지된 것도 포함)
docker ps -a
# 컨테이너 정지
docker stop <컨테이너ID>
# 컨테이너 삭제
docker rm <컨테이너ID>
# 이미지 삭제
docker rmi <이미지ID>
간단한 Python Flask 앱을 Docker로 실행한다고 가정해보자.
# Dockerfile
# 1. Python 3.10 이미지를 기반으로
FROM python:3.10
# 2. 작업 디렉토리 설정
WORKDIR /app
# 3. 파일 복사
COPY . .
# 4. 의존성 설치
RUN pip install -r requirements.txt
# 5. 애플리케이션 실행
CMD ["python", "app.py"]
# bash
# 빌드
docker build -t myflaskapp .
# 실행
docker run -p 5000:5000 myflaskapp
두 개 이상의 컨테이너를 한 번에 관리하고 싶을 땐 docker-compose를 사용한다.
# yaml
# docker-compose.yml
version: "3"
services:
web:
build: .
ports:
- "5000:5000"
depends_on:
- redis
redis:
image: "redis:alpine"
# bash
docker-compose up --build
✅ 장점
어디서든 동일한 환경 제공 (OS 상관 없음)
빠른 배포 및 테스트 가능
CI/CD와도 잘 어울림
경량화된 환경
❌ 단점
초반 학습 곡선 존재
네트워크, 스토리지 등 복잡한 구성은 익숙해져야 함
GUI 환경과는 궁합이 좋지 않음