"내 컴퓨터에서는 됩니다"
팀에서 가장 흔한 문제:
개발자 A: "제 Mac에서는 잘 돼요"
개발자 B: "제 Windows에서는 에러 나요"
서버: "배포하니까 또 다른 에러..."
Docker는 이 문제를 해결합니다. 어디서든 동일한 환경을 제공합니다.
가상머신 vs 컨테이너
flowchart TB
subgraph VM["가상머신 (VM)"]
HOST1["호스트 OS"]
HYP["하이퍼바이저"]
VM1["Guest OS 1\n앱 A"]
VM2["Guest OS 2\n앱 B"]
HOST1 --> HYP --> VM1 & VM2
end
subgraph CONTAINER["컨테이너"]
HOST2["호스트 OS"]
DOCKER["Docker Engine"]
C1["컨테이너 A\n앱 A"]
C2["컨테이너 B\n앱 B"]
HOST2 --> DOCKER --> C1 & C2
end
| VM | 컨테이너 | |
|---|---|---|
| 크기 | GB 단위 | MB 단위 |
| 시작 시간 | 분 | 초 |
| OS | 게스트 OS 포함 | 호스트 OS 공유 |
| 격리 | 강함 | 프로세스 수준 |
Docker 설치
# Mac: Docker Desktop 설치
# https://docs.docker.com/desktop/install/mac-install/
# 설치 확인
docker --version
# Docker version 26.0.0
docker info
첫 컨테이너 실행
# Hello World
docker run hello-world
# Ubuntu 컨테이너 실행
docker run -it ubuntu bash
# -i: 인터랙티브
# -t: 터미널 연결
# 컨테이너 안의 bash 실행됨
# 컨테이너 안에서
uname -a # Linux ...
exit # 컨테이너 종료
핵심 개념
flowchart LR
DOCKERFILE["Dockerfile\n(설계도)"]
IMAGE["이미지\n(읽기 전용)"]
CONTAINER["컨테이너\n(실행 중인 인스턴스)"]
DOCKERFILE -->|"docker build"| IMAGE
IMAGE -->|"docker run"| CONTAINER
CONTAINER -->|"docker commit"| IMAGE
- 이미지 (Image): 컨테이너의 설계도. 읽기 전용.
- 컨테이너 (Container): 이미지를 실행한 인스턴스. 추가 레이어 생성.
- Dockerfile: 이미지를 만드는 스크립트.
기본 명령어
# 이미지 다운로드
docker pull nginx:latest
docker pull python:3.12-slim
# 이미지 목록
docker images
# 컨테이너 실행
docker run nginx # 포그라운드
docker run -d nginx # 백그라운드 (-d: detach)
docker run -d -p 8080:80 nginx # 포트 연결
docker run -d --name my-nginx nginx # 이름 지정
# 실행 중인 컨테이너
docker ps
# 모든 컨테이너 (종료된 것 포함)
docker ps -a
# 컨테이너 중지/시작/삭제
docker stop my-nginx
docker start my-nginx
docker rm my-nginx
docker rm -f my-nginx # 실행 중이어도 강제 삭제
# 컨테이너 안에서 명령 실행
docker exec -it my-nginx bash
# 로그 확인
docker logs my-nginx
docker logs -f my-nginx # 실시간 스트림
정리
| 개념 | 설명 |
|---|---|
| 이미지 | 컨테이너 실행을 위한 읽기 전용 패키지 |
| 컨테이너 | 이미지의 실행 인스턴스 |
| Dockerfile | 이미지 빌드 스크립트 |
| Docker Hub | 공개 이미지 저장소 |
다음 편에서는 Dockerfile 작성 — 내 앱을 이미지로 만드는 방법을 배웁니다.