이미지는 앱 실행에 필요한 코드·런타임·라이브러리·설정을 묶은 읽기 전용 패키지이고, 컨테이너는 그 이미지를 실행한 격리된 프로세스다. 클래스와 인스턴스처럼 이미지 하나로 컨테이너를 여러 개 띄울 수 있다.
왜 쓰나
"내 컴퓨터에선 되는데"의 원인은 대개 실행 환경 차이(런타임 버전, OS 라이브러리, 환경변수)다. 컨테이너는 이 환경까지 통째로 묶어서, 노트북·CI·서버 어디서든 같은 방식으로 돈다.
VM과의 차이
- VM(Virtual Machine, 가상 머신)은 게스트 OS를 통째로 올린다. 무겁고(GB 단위) 부팅이 느리다
- 컨테이너는 호스트의 OS 커널을 공유하고 프로세스·파일시스템·네트워크만 격리한다. 가볍고(MB 단위) 거의 즉시 뜬다
- 그래서 수십~수백 개를 띄웠다 지우는 오케스트레이션(orchestration, 쿠버네티스 핵심 개념)이 가능하다. 대신 커널을 공유하므로 격리 강도는 VM보다 약하다
기본 흐름
docker build -t app . # Dockerfile로 이미지 만들기
docker run -d -p 3000:3000 app # 백그라운드 실행, 호스트 3000 → 컨테이너 3000
docker ps # 실행 중인 컨테이너
docker logs -f <id>
docker exec -it <id> sh # 컨테이너 안으로
docker rm -f <id> # 정지 + 삭제
docker tag app user/app:1.0 && docker push user/app:1.0 # 레지스트리(registry)에 올리기- 이미지는 레이어를 쌓아 만들고, 같은 레이어는 캐시·공유된다(Dockerfile: 레이어 캐시와 멀티 스테이지)
- 컨테이너 안에 쓴 데이터는 컨테이너를 지우면 사라진다. 남길 데이터는 볼륨에 둔다
- 컨테이너 하나에는 프로세스 하나(역할 하나)를 두고, 여러 컨테이너는 네트워크로 잇는다. 여러 개를 한 번에 정의할 때는 Docker Compose
- 이미지를 만들어 레지스트리에 올리고 운영 환경이 그 이미지를 받아 쓰는 것이 일반적인 CI 파이프라인이다(GitLab CI/CD 파이프라인, GitOps)