Container는 이미지를 실행한 순간 탄생하는 격리된 프로세스다. VM과 달리 OS 커널을 공유하지만, 파일시스템·네트워크·프로세스 공간은 완전히 분리된다. 하나의 이미지로 수십 개의 Container를 동시에 띄울 수 있다는 점이 Docker의 핵심 가치다.
Container는 이미지(Image)의 실행 인스턴스다. 이미지가 클래스라면 Container는 그 클래스로 생성한 객체에 해당한다. 각 Container는 자체 파일시스템 레이어를 가지며, 이미지 레이어 위에 쓰기 가능한 얇은 레이어가 추가된다.
Image: 읽기 전용 레이어의 스택. Container가 삭제되어도 Image는 유지된다.
[Image Layer - Read Only]
└─ ubuntu:22.04
└─ apt install nginx
└─ COPY ./config
[Container Layer - Read/Write]
└─ 런타임 변경사항 (로그, 임시 파일 등)
Container는 명확한 상태 전이를 가진다.
docker create
│
▼
[created]
│ docker start
▼
[running] ──── docker pause ────► [paused]
│ │
│ docker unpause ◄───────┘
│ docker stop
▼
[stopped]
│ docker rm
▼
[removed]
| 상태 | 설명 |
|---|---|
| created | Container가 생성됐지만 아직 실행 전 |
| running | 프로세스가 실행 중 |
| paused | SIGSTOP으로 프로세스 일시 정지 |
| stopped | 프로세스가 종료된 상태, 재시작 가능 |
| removed | Container가 삭제됨, 복구 불가 |
docker run 은 이미지를 내려받고 Container를 생성·시작하는 작업을 한 번에 수행한다.
# 기본 실행 (포그라운드)
docker run nginx
# 백그라운드 실행 + 포트 바인딩 + 이름 지정
docker run -d -p 8080:80 --name my-nginx nginx
# 컨테이너 안으로 진입
docker run -it ubuntu:22.04 bash
-d (detach): 백그라운드 실행. -p host:container 형태로 포트를 바인딩한다.
포트 바인딩은 호스트의 포트를 Container 내부 포트에 연결한다.
호스트 :8080 ──► Container :80 (nginx)
# 실행 중인 Container 목록
docker ps
# 전체 Container 목록 (stopped 포함)
docker ps -a
# Container 중지
docker stop my-nginx
# Container 삭제
docker rm my-nginx
# 실행 중인 Container에 명령 실행
docker exec -it my-nginx bash
docker exec 는 이미 실행 중인 Container 안에서 추가 프로세스를 실행한다. Container를 재시작하지 않고 내부 상태를 확인할 때 유용하다.
docker run은 새 Container를 생성하고, docker exec는 기존 Container에 접속한다. 혼동하기 쉬운 차이점이다.
docker stop은 Container를 종료할 뿐 삭제하지 않는다. docker ps -a에 계속 남아 있으며, docker start로 재시작할 수 있다. 완전히 제거하려면 docker rm이 필요하다. 실행 중인 Container를 강제 삭제할 때는 docker rm -f를 사용한다.
# 중지된 Container 전체 일괄 삭제
docker container prune
불필요한 stopped Container가 쌓이면 디스크를 차지하므로, CI/CD 환경에서는 --rm 플래그로 종료 시 자동 삭제하는 것이 일반적이다.
docker run --rm ubuntu:22.04 echo "done"