🎯 학습 목표
- 이미지와 컨테이너의 관계를 설명할 수 있다.
- 볼륨(volume)으로 데이터를 영속화하는 이유를 이해한다.
- 포트 매핑과 컨테이너 네트워크의 기본을 익힌다.
📖 개념 설명
이미지(Image)는 실행에 필요한 모든 것(OS 라이브러리, 런타임, 앱)을 담은 “설계도”이자 읽기 전용 템플릿입니다. 컨테이너(Container)는 그 이미지를 실제로 실행한 “인스턴스”입니다. 같은 이미지로 컨테이너를 여러 개 띄울 수 있습니다. 클래스와 객체의 관계와 비슷합니다.
컨테이너는 기본적으로 일회용입니다. 컨테이너를 삭제하면 그 안의 데이터도 사라집니다. 그래서 DB처럼 데이터를 보존해야 하는 경우 볼륨(Volume)을 사용합니다. 볼륨은 컨테이너 바깥(호스트)에 데이터를 저장해, 컨테이너를 지웠다 다시 만들어도 데이터가 유지되게 합니다.
네트워크는 컨테이너끼리, 그리고 컨테이너와 외부를 연결합니다. -p 호스트:컨테이너로 외부에 포트를 열고, 같은 사용자 정의 네트워크에 속한 컨테이너끼리는 컨테이너 이름으로 서로를 찾을 수 있습니다(뒤의 Spring Boot+MySQL 연동에서 핵심).
💻 실습 — 이미지와 컨테이너
# 이미지 받기 / 목록 / 삭제
docker pull alpine:3.20
docker images
docker rmi alpine:3.20
# 같은 이미지로 컨테이너 2개 실행 (이름만 다름)
docker run -d --name c1 nginx
docker run -d --name c2 nginx
docker ps
💻 실습 — 볼륨으로 데이터 영속화
# named volume 생성
docker volume create mydata
# 볼륨을 컨테이너의 특정 경로에 마운트
docker run -d --name keep -v mydata:/data alpine sleep 1000
# 컨테이너 안에서 파일 생성
docker exec keep sh -c 'echo "hello" > /data/test.txt'
# 컨테이너를 지워도
docker rm -f keep
# 새 컨테이너에서 같은 볼륨을 붙이면 데이터가 그대로!
docker run --rm -v mydata:/data alpine cat /data/test.txt # → hello
💻 실습 — 네트워크
# 사용자 정의 네트워크 생성
docker network create appnet
# 두 컨테이너를 같은 네트워크에 연결
docker run -d --name api --network appnet nginx
docker run --rm --network appnet alpine ping -c 2 api # 이름 'api'로 통신됨
⚠️ 주의사항
- 중요한 데이터를 다루는 컨테이너는 반드시 볼륨을 붙이세요. 안 그러면 컨테이너 삭제 시 데이터가 날아갑니다.
-v 호스트경로:컨테이너경로(바인드 마운트)도 가능하지만, WSL에서는 윈도우 경로보다 리눅스 경로나 named volume이 성능·호환성이 좋습니다.
💡 팁
- 안 쓰는 리소스 정리:
docker system df로 용량 확인 후docker system prune. - 이미지 태그(
:3.20)를 명시하면 “어제는 되던 게 오늘 안 되는” 버전 변동을 막을 수 있습니다.