Docker의 개념과 필요성#

Docker란 무엇인가?#

alt text Docker의 공식 홈페이지에서는 Docker를 아래와 같이 정의하고 있습니다.

Docker는 애플리케이션 개발, 배포 및 실행을 위한 개방형 플랫폼입니다.
Docker를 사용하면 애플리케이션과 인프라를 분리하여 소프트웨어를 신속하게 배포할 수 있습니다.
또한 애플리케이션 관리 방식과 동일한 방법으로 인프라를 관리할 수 있으며,
코드 배포·테스트·배포 방법론을 활용해 코드 작성부터 프로덕션 실행까지의 지연 시간을 크게 줄일 수 있습니다.

여기서 집중해야할 부분은 애플리케이션과 인프라를 분리하여 소프트웨어를 배포한다는 점입니다.

핵심 개념#

  • 컨테이너 기반 가상화 기술

    • 호스트 커널을 공유하면서도 프로세스·네트워크·파일시스템을 격리

    • 전통적 VM 대비 훨씬 가볍고 빠름

  • 이미지(Image)

    • 애플리케이션 실행에 필요한 파일·라이브러리 스냅샷

    • Dockerfile로 정의하고, 계층(layer) 단위로 캐시 활용

  • 컨테이너(Container)

    • 이미지의 실행 인스턴스

    • 생성·시작·중지·삭제가 자유롭고, 일관된 실행 환경을 보장

왜 Docker가 필요한가?#

환경 일관성 보장#

  • “제 PC에서는 잘 되는데요?” 문제 해결

  • 개발 · 테스트 · 프로덕션 전 단계에서 동일한 환경 제공

높은 이식성(Portability)#

  • 로컬 노트북, 온프레미스 서버, 퍼블릭 클라우드 어디서나 실행

  • 레지스트리(Docker Hub, Private Registry)에 이미지를 중앙화

빠른 배포 및 스케일링#

  • 컨테이너 단위로 서비스 확장·축소

  • 오케스트레이션(Kubernetes, Docker Swarm)과 연동해 자동 스케일링

리소스 효율성#

  • VM 대비 오버헤드 적음 → 동일 하드웨어에서 더 많은 워크로드 실행

  • cgroups를 통한 CPU·메모리 제한 가능

협업 및 CI/CD 최적화#

  • 컨테이너 이미지를 코드처럼 버전 관리

  • 파이프라인 내 docker builddocker pushdocker run을 통한 자동화

Image & Container#

이미지(Image)#

  • 정의
    읽기 전용 템플릿(스냅샷)으로, 컨테이너 실행에 필요한 애플리케이션 코드·라이브러리·설정 파일을 레이어(layer) 단위로 저장

  • 특징

    • 불변(Immutable): 한 번 빌드된 이미지는 변경되지 않음

    • 레이어 캐시: 변경 없는 레이어는 재빌드하지 않아 빌드 속도 및 저장 효율 증가

    • 공유 가능: 여러 이미지가 동일한 레이어를 참조

  • 주요 명령어

    • docker build -t <이름>:<태그> . → Dockerfile로 이미지 생성

    • docker images → 로컬 이미지 목록

    • docker pull <이미지> / docker push <이미지> → 레지스트리와 동기화

컨테이너(Container)#

  • 정의
    이미지에 읽기-쓰기 레이어를 더해 실제 프로세스가 실행되는 인스턴스

  • 특징

    • 격리(Isolation): 네트워크, 프로세스, 파일시스템이 분리

    • 라이프사이클: 생성(create) → 시작(start) → 중지(stop) → 삭제(rm)

    • 일관성: 어디서 실행해도 동일 동작 보장

  • 주요 명령어

    • docker run <이미지> → 컨테이너 생성·시작

    • docker ps / docker ps -a → 실행 중/전체 컨테이너

    • docker exec -it <컨테이너> → 내부 명령 실행

    • docker stop/start/rm <컨테이너> → 중지·재시작·삭제

지금까지 Docker의 개념과 필요성을 살펴보았습니다.
다음 세션에서는 Docker 기본 명령어(docker run, docker ps, docker exec, docker logs 등)를 직접 실습하며 컨테이너를 생성하고 관리하는 방법을 배워봅니다.