본문 바로가기
시스템(Linux)

Docker 란 무엇일까요 ?

by forward error correction Circle 2023. 9. 11.
반응형

들어가며 - "내 컴에선 되는데요?"

개발을 하다 보면 누구나 한 번쯤 듣게 되는 말이 있습니다.

💬 "제 컴퓨터에서는 잘 돌아가는데, 서버에 올리니까 안 돼요."

운영체제 버전이 다르거나, 라이브러리 버전이 살짝 다르거나, 환경 변수 하나가 빠졌거나 — 원인은 다양하지만 결과는 항상 같습니다. 시간이 녹아내리죠.

Docker는 바로 이 문제를 해결하기 위해 등장한 기술입니다. 애플리케이션과 그 실행 환경을 통째로 묶어서, 어디서 실행하든 똑같이 동작하게 만들어 주는 도구예요.


Ⅰ. Docker란?

Docker(도커) 는 애플리케이션을 컨테이너(Container) 라는 격리된 단위로 패키징해서 실행하는 오픈 소스 플랫폼입니다.

쉽게 비유하자면, Docker는 "운반용 컨테이너" 와 같습니다. 안에 무엇이 들어 있든(웹서버, 데이터베이스, 파이썬 앱 등) 컨테이너 규격만 맞으면 어떤 배·트럭·기차에도 실을 수 있는 것처럼, Docker 컨테이너에 담긴 애플리케이션은 어떤 OS·서버·클라우드에서도 동일하게 실행됩니다.

💡 한 줄 요약: "개발 환경과 실행 환경을 통째로 패키징해 어디서든 똑같이 돌아가게 하는 기술"


Ⅱ. 왜 Docker를 사용할까? (핵심 장점)


장점 설명
환경 일관성 개발·테스트·운영 환경이 모두 동일하게 동작
빠른 배포 이미지 하나로 어디든 즉시 실행 가능
가벼움 가상머신보다 훨씬 적은 리소스로 실행
격리성 컨테이너끼리 서로 영향을 주지 않음
확장성 트래픽 증가 시 컨테이너 복제로 즉시 확장
재현성 누구든 같은 결과를 얻을 수 있음

Ⅲ. 가상화(VM) vs 컨테이너 — 무엇이 다를까?

Docker를 이해하려면 기존 가상화(VM)와의 차이를 아는 것이 가장 빠릅니다.

구조 비교

 
[가상머신(VM)]                       [Docker 컨테이너]

  ┌─────────────────┐                ┌─────────────────┐
  │  애플리케이션    │                │  애플리케이션    │
  ├─────────────────┤                ├─────────────────┤
  │  라이브러리      │                │  라이브러리      │
  ├─────────────────┤                ├─────────────────┤
  │  Guest OS       │  ←── 무거움    │  (컨테이너 엔진) │
  ├─────────────────┤                ├─────────────────┤
  │  하이퍼바이저    │                │  Host OS 커널    │
  ├─────────────────┤                ├─────────────────┤
  │  Host OS        │                │  하드웨어        │
  ├─────────────────┤                └─────────────────┘
  │  하드웨어        │
  └─────────────────┘

핵심 차이

비교 항목 가상화 (VM) 컨테이너 (Docker)
격리 수준 OS 단위 격리 (강력) 프로세스 단위 격리
OS 구조 가상머신마다 별도 Guest OS Host OS 커널 공유
크기 수 GB 수십 ~ 수백 MB
부팅 속도 수 분 (느림) 수 초 (매우 빠름)
리소스 소모 적음
이식성 낮음 매우 높음
대표 도구 VMware, VirtualBox, Hyper-V Docker, Podman

💡 핵심: VM은 하드웨어 위에 OS를 통째로 가상화하고, Docker는 OS 위에서 프로세스를 격리합니다. 이 차이가 속도·크기·확장성의 모든 차이를 만들어요.


Ⅳ. Docker의 핵심 구성 요소

Docker를 이해하려면 다음 5가지 개념을 알아야 합니다.

1) 이미지 (Image)

  • 컨테이너를 만들기 위한 템플릿 (실행 가능한 패키지)
  • 애플리케이션 코드, 라이브러리, 환경 설정이 모두 포함됨
  • 한 번 만들면 어디서나 동일하게 사용 가능

2) 컨테이너 (Container)

  • 이미지를 실행한 인스턴스
  • 하나의 이미지로 여러 컨테이너를 동시에 실행 가능
  • 컨테이너끼리는 격리되어 서로 영향 없음

3) Dockerfile

  • 이미지를 만드는 레시피 (텍스트 파일)
  • 어떤 OS 위에, 어떤 라이브러리를 깔고, 어떤 명령을 실행할지 정의

4) Docker Engine

  • Docker의 핵심 엔진으로 컨테이너를 생성·실행·관리
  • Docker Daemon, REST API, CLI로 구성

5) Docker Hub (Registry)

  • 이미지를 공유·배포하는 저장소 (GitHub의 이미지 버전)
  • 공식 이미지(nginx, mysql, python 등)를 누구나 무료로 받아 사용 가능
  • 사설 레지스트리(AWS ECR, Harbor 등)도 운영 가능

🔄 흐름 요약:
Dockerfile 작성 → docker build로 이미지 생성 → docker run으로 컨테이너 실행 → Docker Hub에 push로 공유


Ⅴ. 가장 간단한 Docker 사용 예시

말로만 설명하면 와닿지 않으니, 실제 명령어 흐름을 보여드릴게요.

# 1. Docker 정상 동작 확인 (Hello World)
docker run hello-world

# 2. nginx 웹서버를 백그라운드에서 실행
docker run -d -p 8080:80 --name myweb nginx

# 3. 브라우저에서 http://localhost:8080 접속 → nginx 화면 확인!

# 4. 실행 중인 컨테이너 목록 보기
docker ps

# 5. 컨테이너 중지 및 삭제
docker stop myweb
docker rm myweb

 

실행화면


#1. Docker 정상 동작 확인



#2. nginx 웹서버를 백그라운드에서 실행



#3. 브라우저에서 http://localhost:8080 접속 → nginx 화면 확인!



# 4. 실행 중인 컨테이너 목록 보기



# 5. 컨테이너 중지 및 삭제


 

 

위 다섯 줄만으로 나만의 웹서버가 켜졌다 꺼집니다. 별도 설치 없이, 환경 설정 없이, 단 1분 만에요. 이게 Docker의 힘입니다.


Ⅵ. Docker와 Kubernetes(쿠버네티스), 무엇이 다를까?

자주 묶여서 등장하는 두 기술의 관계를 짧게 짚어드립니다.

구분 Docker Kubernetes
역할 컨테이너 만들고 실행 컨테이너 관리·오케스트레이션
비유 컨테이너 박스 컨테이너를 다루는 항만 시스템
사용 시점 컨테이너 1개 ~ 수십 개 수십 ~ 수천 개 컨테이너 운영 시
주요 기능 빌드, 실행, 배포 자동 복구, 스케일링, 로드밸런싱

💡 둘은 경쟁이 아니라 보완 관계입니다. Docker로 컨테이너를 만들고, Kubernetes로 그 컨테이너들을 대규모로 운영하죠.


Ⅶ. 어떤 사람이 Docker를 배워야 할까?

직군 활용 사례
백엔드 개발자 로컬 개발 환경 통일, DB·Redis·Kafka 즉시 실행
프론트엔드 개발자 빌드 환경 통일, 다양한 Node.js 버전 테스트
데이터 엔지니어 Spark, Airflow, Jupyter 환경 격리
DevOps 엔지니어 CI/CD 파이프라인, 무중단 배포
시스템 관리자 서비스 격리, 장애 영향 최소화

한 줄로 말하면, "개발하거나 서비스를 운영하는 거의 모든 사람" 에게 도움이 됩니다.


Ⅷ. 마무리

Docker는 단순한 도구가 아니라 현대 소프트웨어 개발의 표준이 되었습니다. 처음 접하면 개념이 낯설지만, 일단 익숙해지면 "이전에는 이걸 어떻게 안 쓰고 살았지?" 라는 생각이 들 정도로 편리한 기술이에요.

이 글에서 개념을 잡으셨다면, 다음 단계는 실제로 명령어를 직접 쳐 보는 것입니다.

🔗 함께 보면 좋은 글

반응형