Infra

Docker 기본 개념

후후후하하하 2024. 4. 24. 16:52

도커 : 컨테이너 기반의 오픈소스 가상화 플랫폼

 

도커를 사용하면 OS 환경 설정, 언어, 라이브러리, 시스템 도구 등이 설치된 환경을 그대로 이미지로 빌드할 수 있다.

개발 환경에서 만들어진 이미지를 프로덕션 서버에 전달하고, 이미지를 기반으로 컨테이너를 생성하고 실행하면 된다.

 

표준성 : 다양한 언어와 프레임워크를 사용한 서비스들은 제각기 다른 배포 방법을 가지고 있다. 하지만 이를 도커를 통해 패키징하여 컨테이너를 만든다면, 어떤 언어, 프레임워크, 런타임을 사용하던 관계없이 모두 동일한 배포 프로세스를 갖게 된다.

 

확장성, 이식성 : 도커가 설치된 환경이라면 어디서든 컨테이너를 실행 가능하다. 이를 통해 프로덕션 서버는 물론 개발 및 테스트 서버 구축과 운영도 매우 쉬워진다. 컨테이너의 설정은 보통 환경변수로 제어하므로, 환경에 따라 환경 변수 다르게 설정하여 관리할 수 있다.

 

단, 도커의 컨테이너는 삭제되면 모든 데이터가 초기화된다. 이를 막기 위해 외부 저장장치에 링크를 하거나, AWS S3 등 별도의 클라우드 스토리지를 사용해야한다.

 

 

 

 

=============================

 

도커 : 컨테이너 기술을 기반으로 한 일종의 가상화 플랫폼.

가상화 : 물리적 자원인 하드웨어를 효율적으로 활용하기 위해서 하드웨어 공간 위에 가상의 머신을 만드는 기술.

가상화

  • 가상화를 관리하는 소프트웨어(주로 Hypervisor)를 사용하여 하나의 물리적 머신에서 가상 머신(VM)을 만드는 프로세스.
  • Hypervisor는 가상화 층을 구현하여 물리적 머신의 컴퓨팅 리소스로부터 가상 환경을 분리하고 가상 머신을 생성한다. VM은 물리적 머신과 동일한 역할 및 성능을 수행하지만, CPU와 메모리 및 스토리지와 같은 물리적 머신의 컴퓨팅 리소스를 사용한다. Hypervisor는 필요에 따라 각 VM에 이러한 컴퓨팅 리소스를 할당한다.

    •  
Non-Virtualized System Virtualized System
1개의 OS가 모든 하드웨어 자원을 관리한다. 1개의 하드웨어 상에서 여러 개의 가상 머신을 구동할 수 있다.
1개의 머신에서 여러 개의 애플리케이션을 구동하는 것은 충돌 등의 문제를 일으킬 수 있다. 하드웨어와 무관하게 원하는 운영체제나 그에 맞는 애플리케이션을 실행할 수 있다.
유연하지 못하여 인프라의 비용이 높아질 수 있다. 어떠한 시스템에서도 가상 머신이 프로비저닝 될 수 있다.

 

  • 장점
    • Server Consolidation : 물리적인 서버의 개수를 줄여 1개의 서버로 통합함으로써 서버의 전력 및 냉각 비용, 하드웨어 공간 비용 등을 줄일 수 있다.
    • Isolation : 기능에 맞게 여러 개의 머신으로 분리하여 Failures나 Security Leaks 등에 더욱 잘 대처할 수 있다.
    • Efficiency : 컴퓨팅 자원의 사용을 최대화하고 보다 쉽게 관리할 수 있다.
    • Flexibility : 한 서버의 데이터를 마이그레이션하기에 용이해진다.
    • 그 외, 가상화를 통해 동일한 머신에서 다양한 유형의 앱, 데스크탑 및 운영체제를 실행할 수 있거나 새로운 애플리케이션을 프로비저닝하는데 걸리는 시간을 줄일 수 있다.

컨테이너

  • 컨테이너가 실행되고 있는 호스트 os의 기능을 그대로 사용하면서 프로세스를 격리해 독립된 환경을 만드는 기술.
  • 즉, 도커는 독립된 환경을 만들어서 하드웨어를 효율적으로 활용하는 기술.
  • 가상화는 하나의 하드웨어를 여러 개의 가상 머신으로 분할해 효율적으로 사용할 수 있는 기술.
  • 분할된 가상 머신들은 각각 독립적인 환경으로 구동된다. 이때 베이스가 되는 기존의 환경을 Host OS, 가상 머신으로 분할된 각각의 환경을 Guest OS라고 부른다.
  • 가상 머신을 생성하기 위해서는 하이퍼바이저 또는 가상 머신 모니터라고 불리는 소프트웨어를 이용한다. 
  • 하이퍼바이저는 호스트 하드웨어에 설치되어 호스트와 게스트를 나누는 역할을 하고, 각각의 게스트는 하이퍼바이저에 의해 관리되며 시스템 자원을 할당받는다. 이 때 하이퍼바이저에 의해 생성된 게스트는 호스트나 다른 게스트와 상호 간섭하지 않고 완전히 분리된 환경에서 구동된다. 하이퍼바이저를 활용하면 마치 하드웨어가 여러 개인 것처럼 하나의 서버를 여러 명이 나눠 쓸 수도 있고, 컴퓨터 한 대에서 서로 다른 OS를 동시에 사용할 수도 있다.
  • 하지만 가상 머신을 사용하려면 반드시 하이퍼바이저를 거쳐야 하기 때문에 속도 저하가 필연적이다. 또 가상머신은 해당 환경을 구동하는 데 필요한 파일을 모두 포함하고 있기 때문에, 가상 머신을 배포할 때 만들어지는 이미지의 크기가 매우 커지는 한계 존재.

  • 하이퍼바이저와 달리 컨테이너는 가상의 OS를 만드는 것은 아니다. 컨테이너는 베이스 환경의 OS를 공유하면서 필요한 프로세스만 격리하는 방식. 커널을 공유하기 때문에 호스트 OS의 기능을 모두 사용할 수 있다.
  • 그렇기 때문에 컨테이너 위에서는 호스트 OS와 다른 OS를 구동할 수 없다.
  • 대신 격리시킬 애플리케이션과 거기에 필요한 파일이나 특정 라이브러리 등 종속 항목만 포함하기 때문에 배포를 위해 생성되는 이미지의 용량이 작아진다.
  • 운영체제가 아닌 프로세스이며, 하이퍼바이저를 거칠 필요가 없어 실행 속도가 빠르다.

이미지

  • 가상 머신이나 컨테이너 또는 프로그램을 실행하는 데 필요한 파일이나 라이브러리, 설정 등을 가지고 있는 파일이다. 이미지는 레이어라는 계층 구조로 이루어져 있는데, 변경 사항이 생기면 새로운 레이어를 추가해서 기록한다. 이미지 전체를 새로 받지 않고 해당 레이어만 받는 것으로 이미지를 업데이트할 수 있다는 장점이 있다.
  • 이미지를 실행하면 프로세스, 즉 컨테이너가 된다.

 

도커

  • 컨테이너 기반의 가상화 플랫폼.
  • 컨테이너를 잘 다룰 수 있게 도와 주는 도구
  • 이미지를 실행시켜 컨테이너로 만들거나, 생성된 컨테이너를 관리하거나, 컨테이너를 다시 이미지로 만드는 작업 가능
  • 개발 과정에서 다른 라이브러리와 충돌하는 것을 방지하기 위해 격리된 환경이 필요할 때, 완성된 서비스를 배포할 때, 혹은 배포 중인 서비스를 받아서 실행해볼 때도 유용하다. 특히 배포 과정에서 도커를 사용해 필요한 파일들만 예쁘게 포장해서 이미지로 만들면 지긋지긋한 종속성 이슈에서 벗어날 수 있다.

 

 

 

 

 

  1. Docker의 기본 개념은 무엇이며, 가상 머신(VM)과 어떻게 다른가요?
    1. 도커는 애플리케이션을 컨테이너라는 격리된 환경에서 실행하기 위한 도구이다. 각 컨테이너는 애플리케이션 실행에 필요한 파일, 라이브러리, 환경 설정 등을 포함하고 있어, 어디에서든 동일한 환경을 구현할 수 있다. 가상머신과의 주요 차이점은 가상화 수준에 있다. VM은 하드웨어 수준의 가상화를 제공하여 각 VM에 운영 체제를 전체적으로 설치하지만, Docker는 운영 체제 수준의 가상화를 제공하여 호스트 OS의 커널을 공유하면서도 애플리케이션 간의 격리를 유지한다. 이로 인해 Docker는 VM에 비해 더 가볍고, 빠르며, 효율적인 자원 사용이 가능하다.
  2. Docker 이미지와 컨테이너의 차이점은 무엇인가요?
    1. 도커 이미지는 애플리케이션과 그 애플리케이션을 실행하는데 필요한 모든 종속성을 포함하고 있는, 읽기 전용의 템플릿이다. 반면 도커 컨테이너는 이미지를 기반으로 실행된 실제 인스턴스이다. 즉, 이미지는 애플리케이션을 배포하기 위한 기본 단위이며, 컨테이너는 이 이미지를 실행한 실제 환경이다. 이미지는 변경할 수 없지만, 컨테이너의 상태는 시작, 정지, 삭제 등으로 변경될 수 있다.
  3. Dockerfile은 무엇이고, 어떻게 사용하나요?
    1. Dockerfile은 Docker 이미지를 자동으로 빌드하기 위한 스크립트 파일이다. 이 파일 내에는 이미지를 생성하기 위한 명령어들이 순서대로 기술되어 있다. 명령어를 통해 기본 이미지 선택, 애플리케이션 파일 복사, 의존성 설치, 실행 명령어 설정, 포트 노출 등의 작업을 자동화할 수 있다. 도커파일이 준비되면 docker build 명령어를 사용하여 Docker 이미지를 생성할 수 있다.