[Docker] 도커 컨테이너 완벽 가이드: 개념부터 명령어, 실전 활용까지

🐳 컨테이너란?

Docker에서 컨테이너는 이미지를 실행한 결과물이에요.

이미지(Image) = 실행 전의 정적인 템플릿
컨테이너(Container) = 실행 중인 동적인 인스턴스

 

컨테이너는 다음과 같은 특징을 가져요:

  • 이식성: 동일한 환경을 어디서나 재현 가능
  • 경량성: 호스트 OS의 커널을 공유하므로 VM보다 경량
  • 빠른 실행: 수 초 내로 부팅 및 종료 가능

도커 컨테이너는 “애플리케이션 + 실행환경”을 하나로 묶어, 기술적으로는 리눅스 커널 위에서 작동하는 프로세스지만, 외부와 격리된 파일 시스템, 네트워크, 환경변수 등을 갖고 있어 독립된 애플리케이션처럼 작동해요.

 

🐳 컨테이너를 실행하는 법: docker run

가장 많이 사용하는 명령어는 바로 docker run이에요.

docker run [OPTIONS] IMAGE [COMMAND]

예시:

$ docker run --name myweb nginx

이 한 줄 명령어는 사실 다음 3가지 동작을 순차적으로 실행해요.

  1. 이미지 존재 여부 확인 → 없다면 Docker Hub에서 자동으로 pull
  2. 컨테이너 생성(docker create): 이미지 기반으로 컨테이너 만들기
  3. 컨테이너 시작(docker start): 생성한 컨테이너 실행하기

즉, docker runpullcreatestart의 모든 기능을 포함한 명령어입니다.

# 예시: 개별 명령어로 실행
$ docker pull nginx
$ docker create --name myweb nginx
$ docker start myweb

💡 CI/CD 환경이나 운영에서 정확한 흐름을 통제하려면 create와 start를 따로 쓰는 것을 고려할 수 있습니다.

 

docker run 자주 쓰는 옵션들

옵션 설명
--name myapp 컨테이너에 이름 설정
-d 백그라운드 모드로 실행 (detach 모드)
-it 터미널을 연결 (interactive + TTY)
--rm 컨테이너 종료 후 자동 삭제 (테스트용으로 좋음)
-p 8080:80 포트 바인딩 (호스트:컨테이너)
-v ~/data:/app/data 볼륨 마운트로 호스트 디렉터리 연결
--env MODE=dev 컨테이너에 환경 변수 주입
--network 컨테이너가 연결될 네트워크 지정
--cpus=0.5 CPU 자원 제한
--memory=512m 메모리 자원 제한
# 예시
$ docker run -d --name web -p 8080:80 nginx
$ docker run --rm -it ubuntu:22.04 /bin/bash

 

 

🐳 Docker 컨테이너 Lifecycle (생명주기)

Docker 컨테이너는 여러 상태를 오가며 동작해요:

상태 설명 명령어
생성 (Created) create로 생성만 된 상태 docker create
실행 (Running) 실제 실행 중인 상태 docker start, docke run
일시 정지 (Paused) CPU 사용 중지됨 docker pause, docker unpause
종료 (Exited) 정상/비정상 종료 docker stop, docker kill
삭제 (Removed) 컨테이너 자체 삭제 docker rm
$ docker create [OPTIONS] IMAGE [COMMAND]     # 컨테이너 생성
$ docker start [OPTIONS] CONTAINER            # 정지된 컨테이너 시작
$ docker stop [OPTIONS] CONTAINER             # 실행 중인 컨테이너 정상 종료 (SIGTERM)
$ docker kill [OPTIONS] CONTAINER             # 즉시 종료 (SIGKILL)
$ docker restart [OPTIONS] CONTAINER          # 컨테이너 재시작
$ docker pause CONTAINER                      # CPU 사용 중지 (정지 상태)
$ docker unpause CONTAINER                    # 정지된 컨테이너 재개
$ docker rm [OPTIONS] CONTAINER               # 컨테이너 삭제

 

 

🐳 컨테이너 관련 명령어 정리

✅ 컨테이너 생성과 실행

$ docker pull ubuntu                   # 이미지 다운로드
$ docker create --name test ubuntu     # 컨테이너 생성
$ docker start test                    # 컨테이너 실행
$ docker run -it --rm ubuntu bash      # 실행 + 인터랙티브 + 종료 시 삭제

✅ 상태 확인 및 프로세스

$ docker ps                            # 실행 중인 컨테이너 목록
$ docker ps -a                         # 모든 컨테이너 목록 (종료 포함)
$ docker inspect myweb                 # 상세 정보 (IP주소, mount 정보 등 JSON 형식)
$ docker top myweb                     # 컨테이너 내부 프로세스 확인
$ docker stats                         # 실시간 리소스 사용량

✅ 컨테이너 접속 및 명령 실행

$ docker exec -it myweb /bin/bash     # 쉘로 접속
$ docker exec myweb ls /app           # 컨테이너 내에서 명령 실행

✅ 로그 및 상태

$ docker logs myweb
$ docker logs -f myweb                # 실시간 로그
$ docker inspect -f '{{.State.ExitCode}}' myweb

✅ 정지, 삭제, 재시작

$ docker stop myweb                   # 정상 종료 (SIGTERM)
$ docker kill myweb                   # 강제 종료 (SIGKILL)
$ docker pause myweb                  # 일시 정지
$ docker unpause myweb                # 일시 정지 해제
$ docker restart myweb                # 재시작
$ docker rm myweb                     # 컨테이너 삭제

 

 

🐳 변경사항 추적 및 이미지화

변경 내용 확인

$ docker diff myweb                   # 파일시스템 변경 사항

이 명령어는 컨테이너가 생성된 이후에 컨테이너 내부에서 어떤 파일이 추가(A), 수정(M), 삭제(D) 되었는지를 보여줘요.

이 결과를 통해 컨테이너 실행 중 어떤 파일이 바뀌었는지 알 수 있기 때문에, 테스트 중 변경된 설정 파일이나 로그 등을 추적할 때 유용해요.

새로운 이미지 생성

$ docker commit myweb myimage:latest

⚠️ commit은 이미지 히스토리가 남지 않아 협업에는 부적절하고 테스트엔 유용합니다.

 

 

🐳 컨테이너 백업 및 복원

# 컨테이너 백업 (파일 시스템만 저장)
$ docker export myweb > backup.tar

# tar 파일로부터 새로운 이미지 생성
$ docker import backup.tar newimage:1.0
export/import이미지의 레이어 구조와 메타데이터를 유지하지 않습니다. 단순히 파일 시스템만 유지합니다.