🐳 컨테이너란?
Docker에서 컨테이너는 이미지를 실행한 결과물이에요.
이미지(Image) = 실행 전의 정적인 템플릿
컨테이너(Container) = 실행 중인 동적인 인스턴스
컨테이너는 다음과 같은 특징을 가져요:
- 이식성: 동일한 환경을 어디서나 재현 가능
- 경량성: 호스트 OS의 커널을 공유하므로 VM보다 경량
- 빠른 실행: 수 초 내로 부팅 및 종료 가능
도커 컨테이너는 “애플리케이션 + 실행환경”을 하나로 묶어, 기술적으로는 리눅스 커널 위에서 작동하는 프로세스지만, 외부와 격리된 파일 시스템, 네트워크, 환경변수 등을 갖고 있어 독립된 애플리케이션처럼 작동해요.
🐳 컨테이너를 실행하는 법: docker run
가장 많이 사용하는 명령어는 바로 docker run이에요.
docker run [OPTIONS] IMAGE [COMMAND]
예시:
$ docker run --name myweb nginx
이 한 줄 명령어는 사실 다음 3가지 동작을 순차적으로 실행해요.
- 이미지 존재 여부 확인 → 없다면 Docker Hub에서 자동으로 pull
- 컨테이너 생성(docker create): 이미지 기반으로 컨테이너 만들기
- 컨테이너 시작(docker start): 생성한 컨테이너 실행하기
즉, docker run = pull + create + start의 모든 기능을 포함한 명령어입니다.
# 예시: 개별 명령어로 실행
$ 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는 이미지의 레이어 구조와 메타데이터를 유지하지 않습니다. 단순히 파일 시스템만 유지합니다.