NyangPolice's homepage

Bookmark this to keep an eye on my project updates!

View on GitHub
16 December 2025

0. Docker 기초: 개념 및 설치

by NyangPolice

Docker 기초: 개념 및 설치

Docker는 애플리케이션을 컨테이너라는 격리된 환경에서 실행할 수 있게 해주는 오픈소스 플랫폼이다. 이 글에서는 Docker의 핵심 개념을 전반적으로 살펴보고, 설치까지 마치는 것을 목표로 한다.

Docker란?

Docker는 2013년 dotCloud(현 Docker Inc.)에서 출시한 컨테이너 기반의 가상화 플랫폼이다. 애플리케이션과 그 실행에 필요한 모든 종속성(라이브러리, 설정 파일, 환경 변수 등)을 하나의 컨테이너로 패키징하여 어디서든 동일하게 실행할 수 있게 해준다.

가상 머신 vs Docker

Docker를 이해하는 가장 빠른 방법은 전통적인 가상 머신(VM)과 비교하는 것이다.

가상 머신 (Virtual Machine)

graph TD
    Hardware[Hardware]
    HostOS[Host OS]
    Hypervisor[Hypervisor]
    GuestOS1["Guest OS (Linux)"]
    GuestOS2["Guest OS (Windows)"]
    AppA[Application A]
    AppB[Application B]

    Hardware --> HostOS
    HostOS --> Hypervisor
    Hypervisor --> GuestOS1
    Hypervisor --> GuestOS2
    GuestOS1 --> AppA
    GuestOS2 --> AppB

Docker 컨테이너

graph TD
    Hardware[Hardware]
    HostOS[Host OS]
    DockerEngine[Docker Engine]
    ContainerA[Container A<br/>App + Libs]
    ContainerB[Container B<br/>App + Libs]

    Hardware --> HostOS
    HostOS --> DockerEngine
    DockerEngine --> ContainerA
    DockerEngine --> ContainerB

핵심적인 차이는 VM이 하드웨어 위에 완전한 OS를 올리는 반면, Docker는 호스트 OS의 커널을 공유한다는 점이다. 이 차이 덕분에 컨테이너는 VM보다 훨씬 가볍고, 빠르게 시작되며, 동일한 하드웨어에서 더 많은 인스턴스를 실행할 수 있다.

Docker의 주요 특징

1. 경량성 (Lightweight)

컨테이너는 호스트 OS의 커널을 공유하므로 VM보다 훨씬 가볍다. 이미지 크기가 작고(수십 MB ~ 수백 MB) 시작 시간이 빠르며, 동일한 하드웨어에서 더 많은 컨테이너를 실행할 수 있다.

2. 이식성 (Portability)

“Build once, run anywhere” — 한 번 만들면 어디서든 실행 가능하다. 개발 환경, 테스트 환경, 프로덕션 환경에서 동일하게 동작하므로 “내 컴퓨터에서는 되는데…“라는 문제를 해결해준다.

3. 격리성 (Isolation)

각 컨테이너는 독립적인 파일시스템, 네트워크, 프로세스 공간을 가진다. 컨테이너 간 간섭 없이 동일한 포트나 라이브러리를 사용할 수 있고, 보안 측면에서도 애플리케이션을 격리할 수 있다.

4. 확장성 (Scalability)

컨테이너를 쉽게 복제하고 배포할 수 있어 마이크로서비스 아키텍처에 최적화되어 있다. Kubernetes 등의 오케스트레이션 도구와 결합하면 대규모 서비스 운영도 가능하다.

5. 버전 관리 및 재사용

이미지 레이어 구조로 효율적인 버전 관리가 가능하며, Docker Hub를 통해 이미지를 공유하고 재사용할 수 있다. 롤백과 업데이트도 용이하다.

Docker 아키텍처

Docker는 클라이언트-서버 아키텍처를 사용한다. 전체 구조를 간단히 살펴보자.

graph LR
    Client["Docker Client (CLI)"]
    Daemon["Docker Daemon (dockerd)"]
    Registry[Image Registry]
    
    subgraph DaemonManage [Management]
        Images[Images]
        Containers[Containers]
        Networks[Networks]
        Volumes[Volumes]
    end

    Client -- REST API --> Daemon
    Daemon --- DaemonManage
    Daemon -- Pull/Push --> Registry

사용자가 docker run 같은 명령을 입력하면 Docker Client가 이를 Docker Daemon에 전달한다. Daemon은 이미지, 컨테이너, 네트워크, 볼륨 등을 실제로 관리하는 핵심 프로세스다. 이미지를 다운로드하거나 공유할 때는 Docker Registry(대표적으로 Docker Hub)와 통신한다.

각 구성 요소의 동작 방식은 이후 글에서 실습과 함께 자세히 다룬다.

Docker 핵심 개념 미리보기

Docker를 사용하면서 반복적으로 마주치게 될 핵심 개념들이다. 여기서는 각 개념이 무엇이고 왜 필요한지 감을 잡는 것을 목표로 하며, 상세한 사용법은 이후 글에서 다룬다.

이미지 (Image)

이미지는 컨테이너를 생성하기 위한 읽기 전용 템플릿이다. 애플리케이션 코드, 런타임, 라이브러리, 설정 파일 등 실행에 필요한 모든 것이 포함되어 있다. 이미지는 레이어(Layer) 구조로 되어 있어 여러 이미지가 동일한 레이어를 공유할 수 있고, 이를 통해 디스크 공간을 절약하고 다운로드 속도를 높인다.

graph BT
    Base["Ubuntu Base (80MB)"]
    Runtime["Python 3.9 (100MB)"]
    Deps["Dependencies (50MB)"]
    App["App Layer (10MB)"]

    Base --> Runtime
    Runtime --> Deps
    Deps --> App

컨테이너 (Container)

컨테이너는 이미지의 실행 가능한 인스턴스다. 이미지가 프로그램의 설치 파일이라면, 컨테이너는 그 프로그램이 실제로 실행되고 있는 상태라고 생각하면 된다. 하나의 이미지로 여러 개의 컨테이너를 생성할 수 있으며, 각 컨테이너는 서로 독립적으로 동작한다.

Dockerfile

Dockerfile은 이미지를 빌드하기 위한 스크립트 파일이다. 어떤 베이스 이미지를 사용하고, 어떤 파일을 복사하고, 어떤 명령을 실행할지를 텍스트로 정의한다. Dockerfile을 통해 이미지 생성 과정을 자동화하고 재현 가능하게 만들 수 있다.

# Dockerfile 예시
FROM python:3.9-slim
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
EXPOSE 8000
CMD ["python", "app.py"]

볼륨 (Volume)

볼륨은 컨테이너의 데이터를 영구적으로 저장하기 위한 메커니즘이다. 컨테이너는 기본적으로 삭제되면 내부 데이터도 함께 사라지는데, 볼륨을 사용하면 컨테이너의 생명주기와 관계없이 데이터를 유지할 수 있다. 데이터베이스처럼 상태를 보존해야 하는 경우에 필수적이다.

네트워크 (Network)

Docker는 컨테이너 간 통신을 위한 가상 네트워크를 제공한다. 예를 들어 웹 서버 컨테이너와 데이터베이스 컨테이너가 서로 통신해야 할 때, Docker 네트워크를 통해 이를 안전하고 간편하게 구성할 수 있다. bridge, host, overlay 등 여러 네트워크 모드를 제공하며, 용도에 따라 선택할 수 있다.

Docker 설치

Docker는 다양한 플랫폼에서 사용할 수 있다. 각 플랫폼별 빠른 설치 방법을 소개한다.

[!IMPORTANT] 상세 설치 가이드: 플랫폼별 상세한 설치 방법, 시스템 요구사항, 문제 해결은 Docker 설치 가이드 문서를 참고할 것.

Windows

  1. Docker Desktop for Windows 다운로드
  2. WSL 2 활성화 필요
  3. 설치 후 docker --version으로 확인

상세 가이드: Windows 설치 가이드

macOS

  1. Docker Desktop for Mac 다운로드
  2. CPU 아키텍처(Apple Silicon/Intel) 확인 후 설치
  3. 설치 후 docker --version으로 확인

상세 가이드: macOS 설치 가이드

Linux (Ubuntu/Debian)

# 편리한 설치 스크립트 (개발/테스트 환경용)
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

# 사용자 권한 설정
sudo usermod -aG docker $USER
newgrp docker

# 설치 확인
docker --version

상세 가이드: Linux 설치 가이드

[!WARNING] 프로덕션 환경: 편리한 설치 스크립트는 테스트/개발 환경에서만 사용할 것. 프로덕션 환경에서는 공식 저장소를 통한 설치를 권장한다.

Docker Desktop 간단 소개

Windows와 macOS에서는 Docker Desktop이 설치된다. Docker Desktop은 Docker Engine뿐 아니라 GUI 대시보드를 함께 제공하여, 컨테이너 목록 확인, 로그 조회, 이미지 관리 등을 시각적으로 할 수 있다. 물론 CLI로도 모든 작업이 가능하며, 이 시리즈에서는 CLI 위주로 진행한다.

설치 확인

설치가 완료되었다면 정상적으로 동작하는지 확인해보자.

# Docker 버전 확인
docker --version

# Docker 정보 확인
docker info

Hello World 실행

Docker의 전통적인 첫 테스트는 hello-world 이미지를 실행하는 것이다.

docker run hello-world

이 명령을 실행하면 Docker는 다음과 같은 과정을 거친다:

  1. 로컬에서 hello-world 이미지를 찾는다
  2. 없으면 Docker Hub에서 자동으로 다운로드한다
  3. 해당 이미지로 컨테이너를 생성하고 실행한다
  4. 환영 메시지를 출력하고 컨테이너가 종료된다

아래와 같은 메시지가 출력되면 Docker가 정상적으로 설치된 것이다:

Hello from Docker!
This message shows that your installation appears to be working correctly.

다음 단계

Docker 설치를 완료하고 첫 컨테이너를 실행해보았다. 다음 글부터는 본격적으로 Docker를 다루게 된다.

Phase 1: 기초

  1. Docker 기본 명령어 — 컨테이너와 이미지를 다루는 핵심 명령어
  2. Docker 이미지 심화 — 레이어 구조, 태그, 명명 규칙, 이미지 내부 분석
  3. Dockerfile 작성 — 나만의 커스텀 이미지 만들기
  4. Dockerfile 최적화 및 베스트 프랙티스 — 멀티 스테이지 빌드, 캐싱 전략, 이미지 경량화

Phase 2: 데이터와 네트워크

  1. 볼륨과 바인드 마운트 — 컨테이너 데이터 영속성 확보
  2. Docker 네트워크 — 컨테이너 간 통신 구성

Phase 3: 멀티 컨테이너

  1. Docker Compose 기초 — 멀티 컨테이너 환경을 하나의 파일로 관리
  2. Docker Compose 심화 — 환경 변수, 헬스체크, 프로필, 오버라이드

Phase 4: 실무 활용

  1. Docker로 개발 환경 구축하기 — 실전 프로젝트의 로컬 개발 환경 세팅
  2. Docker 레지스트리와 이미지 배포 — Docker Hub, 프라이빗 레지스트리, CI 파이프라인
  3. Docker 보안 — 컨테이너 보안 원칙, 취약점 스캔, 시크릿 관리
  4. Docker 로깅과 모니터링 — 로그 관리 전략, Prometheus + Grafana 모니터링

Phase 5: 그 다음은

  1. Docker에서 Kubernetes로 — Docker의 한계와 Kubernetes로의 전환

Docker는 현대적인 애플리케이션 개발과 배포에 필수적인 도구가 되었다. 설치를 완료했다면 이제 컨테이너 기반 개발의 세계로 들어갈 준비가 된 것이다.

tags: docker - 기초 - 설치 - 개념 - 가상화 - 컨테이너

Docker 카테고리의 글 목록

Docker 카테고리 페이지로 이동 →