[Docker 입문] 도커, 컨테이너, 쿠버네티스

[2024] 처음 시작하는 도커와 컨테이너 [천강민] 강의 수강 후 정리한 내용입니다.

 

 

처음 시작하는 도커와 컨테이너 강의 | 천강민 - 인프런

천강민 | , 실무에서, '도커 잘하네!' 라는 얘기가 나오도록 짧고 굵게![사진]실제 서비스 제공을 기반으로 고민하며 해결할 수 있다면, 이 강의는 수강하지 마세요.실무 요구사항을 해결해보는

www.inflearn.com

 

Docker를 사용하기 전의 아주 옛날의 시대

 

 

과거에는 서버에서 애플리케이션을 실행하기 위해 Java나 Python과 같은 런타임을 직접 설치해야 했다.

 

하지만 여러 애플리케이션이 동시에 실행될 경우, 각 애플리케이션이 요구하는 런타임 버전이 다를 수 있어 패키지 및 종속성 충돌이 발생할 위험이 있었다.

 

이로 인해 애플리케이션을 업데이트할 때 예상치 못한 오류가 발생하는 경우도 많았다.

 

이를 해결하기 위해 두 가지 접근 방식이 사용되었다.

 

1. 인프라 환경에 맞춰 애플리케이션을 개발하는 방법

2. 애플리케이션이 요구하는 환경에 맞춰 인프라를 조정하는 방법

 

또한, 하나의 애플리케이션이 운영체제의 자원을 과도하게 사용할 경우, 특정 언어(Java 또는 Python)만 문제가 생기는 것이 아니라 같은 환경에서 실행되는 다른 애플리케이션에도 영향을 미칠 수 있다.

 

운영체제 단위로 분리

 

이러한 문제를 방지하기 위해, 하나의 큰 서버를 하이퍼바이저(Hypervisor)를 이용해 여러 개의 작은 서버로 소프트웨어적으로 분할하는 방식이 도입되었다.

 

하이퍼바이저란? 운영체제 위에서 다른 운영체제를 실행할 수 있도록 하는 기술

 

이 방식을 사용하면 하드웨어 자원의 활용 효율은 높아졌지만, 여전히 다음과 같은 문제는 해결되지 않았다.

 

  • 서로 다른 애플리케이션 간 종속성 및 패키지 충돌 문제
  • 특정 애플리케이션이 과도하게 자원을 사용할 경우, 같은 서버에서 실행되는 다른 애플리케이션도 영향을 받는 문제

 

또한, 애플리케이션의 배포 및 관리 측면에서도 새로운 문제가 발생했다.

 

 

 

  • 예: X 애플리케이션이 어느 서버에서 실행되고 있는지, Y 애플리케이션이 어느 서버에서 실행되고 있는지를 정확히 파악하기 어려움
  • 특정 애플리케이션(Y)이 서버 자원을 과도하게 사용하면, 같은 서버에서 실행 중인 다른 애플리케이션(X)도 영향을 받아 성능 저하가 발생할 수 있음

 

이러한 한계를 해결하기 위해 컨테이너 기술이 등장했다.

 

Docker의 등장

 

 

Docker는 커널을 공유하기 때문에, CPU 아키텍처만 동일하다면 실행이 가능하다.

 

또한, 이미지컨테이너 단위로 애플리케이션이 격리되어 실행되므로, 자원을 효율적으로 활용할 수 있다.

 

이러한 격리된 환경 덕분에 종속성 및 패키지 충돌 문제도 발생하지 않는다.

 

예를 들어, 특정 애플리케이션이 2개의 CPU와 4GiB 메모리만 사용하도록 제한하면, 다른 애플리케이션의 성능에 영향을 주지 않으면서 안정적으로 실행할 수 있다.

 

Docker를 사용할 때 발생할 수 있는 문제와 쿠버네티스

 

그러나 도커가 설치된 환경이 많아지거나, 컨테이너가 비정상적으로 동작할 경우 관리상의 문제가 발생할 수 있다.

 

이를 해결하기 위해 쿠버네티스(Kubernetes)라는 도구가 등장했다.

 

쿠버네티스는 여러 서버를 관리하고, 컨테이너의 생명 주기를 자동으로 조정하여 운영을 효율적으로 만들어준다.

 

쉽게 말해, 쿠버네티스는 컨테이너를 관리하는 도구이며, 이러한 역할 때문에 오케스트레이션(Orchestration) 툴이라고도 불린다.

 

Docker의 혁신

 

1. 개발 효율성 극대화

 

  • 격리된 환경 덕분에 버전, 패키지, 종속성 문제에서 자유로워짐
  • 컨테이너화를 통해 한 번 개발하면 어디서든 실행 가능

 

Docker 컨테이너는 애플리케이션과 해당 애플리케이션이 필요로 하는 모든 종속성, 라이브러리, 설정 등을 하나의 패키지로 묶어 격리된 환경에서 실행되도록 한다.

 

이를 통해 개발자는 특정 운영체제나 환경에 종속되지 않고, 개발, 테스트, 프로덕션 등 다양한 환경에서 일관된 방식으로 애플리케이션을 실행할 수 있다.

 

2. 환경에 의한 제약 탈피

 

  • 개발 환경과 운영 환경의 일관성이 유지됨
  • “개발 환경에서 정상 동작한 애플리케이션은 운영 환경에서도 동일하게 실행된다”

 

3. 마이크로서비스 아키텍처(MSA) 가속화

 

  • 필요한 만큼 컨테이너를 격리하여 독립적으로 실행 가능
  • 서비스 단위로 컨테이너를 나눠 관리하면서 마이크로서비스 기반 개발이 쉬워짐

 

4. 리소스 사용 최적화 및 스케일링 효율성 증대

 

  • 서비스 세분화로 사용량 예측이 용이
  • 컨테이너 단위로 자원을 최적화하여 효율적인 운영 가능
  • 스케일링이 쉬워지고, 수평 확장이 용이해짐

 

Docker는 애플리케이션을 경량 컨테이너로 실행하므로, 기존 가상화 기술보다 시스템 자원을 효율적으로 활용할 수 있다.

 

각 컨테이너는 필요한 자원만 사용하며, 필요에 따라 빠르게 확장(Scaling Up) 또는 축소(Scaling Down)할 수 있다.

 

이 덕분에 특정 서비스의 수요가 증가하면 해당 컨테이너를 추가 실행해 즉각적으로 대응 가능하며, 자원 낭비를 최소화할 수 있다.

 

수평 확장(Horizontal Scaling)란?

- 시스템 성능을 높이기 위해  여러 개의 동일한 인스턴스를 추가하는 방식
- Docker는 컨테이너를 쉽게 복제하고 배포할 수 있어, 클라우드 환경에서 필수적인 확장성 솔루션이 됨

 

5. DevOps 문화 확산

 

  • 일관된 환경을 유지하기 쉬워 CI/CD(자동화된 통합 및 배포)가 용이
  • 컨테이너 실행만으로 동일한 환경에서 배포 가능, 운영 자동화 가능

 

Docker는 단순한 컨테이너 기술을 넘어, 개발과 운영을 효율적으로 통합하고 클라우드 네이티브 환경에서 필수적인 요소로 자리 잡았다.

 

핵심 사항

 

컨테이너란?

 

컨테이너는 격리된 프로세스로, 특정 명령어를 실행하는 방식으로 동작한다.

 

컨테이너는 운영체제에서 독립적인 환경에서 실행되는 하나의 프로세스이며, 이 환경은 해당 프로세스가 사용하는 파일 시스템, 네트워크, 메모리, CPU 등 모든 자원을 독립적으로 관리한다.

 

덕분에 각 컨테이너는 작은 가상 시스템처럼 동작하지만, 실제로는 호스트 운영체제의 커널을 공유하기 때문에 기존의 가상 머신(VM)보다 훨씬 가볍고 빠르다.

 

컨테이너는 특정 명령어를 실행하는 것으로 시작된다. 예를 들어, docker run 명령어를 실행하면 지정된 이미지를 기반으로 컨테이너를 생성하고 그 안에서 지정된 명령어를 실행한다.

 

이 과정에서 생성된 컨테이너는 격리된 상태에서 동작하며, 외부 환경이나 다른 컨테이너와 독립적으로 실행된다.

 

 


 

Docker와 컨테이너의 관계

 

Docker는 컨테이너를 쉽고 효율적으로 생성, 관리, 배포할 수 있도록 해주는 플랫폼이다.

 

컨테이너 안에서 웹 서버와 같은 애플리케이션이 실행될 수 있으며, 이러한 애플리케이션은 HTTP 요청을 처리하는 방식으로 동작할 수 있다.

 

즉, 컨테이너는 애플리케이션을 실행하는 독립적인 환경 Docker는 이러한 컨테이너를 관리하는 도구로 이해하면 된다.