Docker

GreenBean·2021년 8월 15일
0
post-thumbnail

Docker

Docker란?

  • 도커(Docker)는 Go언어로 작성된 리눅스 컨테이너 기반의 오픈소스 가상화 플랫폼
  • Docker는 가상화 컨테이너 실행 환경 위에서 Application 배포 엔진을 더함으로써 사용자의 코드를 어디서든 빠르고 가볍게 실행시킬 수 있는 기술을 제공
    • Docker는 한 컨테이너 당 하나의 Application이나 프로세스를 실행하는 것을 권장

Hypervisor 가상화 vs Docker 가상화

Hypervisor 가상화

  • 기존 OS에 가상환경에서 또 하나의 OS를 설치하는 것으로 완전한 독립적 OS로 운영되는 것
  • 한 서버에 하나의 OS만 운영을 하는 경우, 해당 OS가 서버의 모든 리소스를 항상 Full로 사용하기 어려우며 서버 리소스들이 Idle 상태로 낭비되어지는 경우가 있을 수 있음
    • Idle 상태는 실행되지 않은 상태로 존재하는 경우를 말함
  • 그러나 Hypervisor 가상화를 사용하면 Idle 상태로 두지 않고 필요한 OS나 서비스에 할당이 되어질 수 있으므로 리소스를 훨씬 효율적으로 사용 가능
  • 그러므로 고급 사양의 좋은 서버에 여러 가상화 OS를 운영하는 것이 저급이나 중급 사양의 여러 서버를 운영하는 것보다 훨씬 효율적
  • 단점으로는 기술적으로 무겁기 때문에 Booting 시간이 길어지고 리소스를 많이 차지할 수 밖에 없음

Tip! 요약
: Hypervisor 가상화의 장점은 CPU를 Idle 상태로 두지 않기 때문에 효율적이라는 것이지만, 단점으로 각기 다른 OS를 사용하기에 무겁다는 점이 존재

Docker와 같은 컨테이너 가상 기술

  • OS 커널 위의 유저 공간에서 실행
    • 운영체제를 가상화하는 것이 아닌 유저 공간을 가상화한다고 생각하면 쉬움
    • 즉 하나의 호스트 서버에 여러 독립적인 유저 공간을 가상적으로 실행할 수 있음
  • 이러한 컨테이너 가상화는 Hypervisor 가상화보다 훨씬 가볍기 때문에 빠르고 쉽게 독립적인 가상 환경을 실행시킬 수 있음
  • 또한 Hypervisor는 Base OS와 가상화 OS 사이에 커널 시스템을 연결해줄 Emulation Layer가 필요한데 컨테이너 가상화는 일반적인 시스템 API interface를 사용
  • 하지만 독립적인 OS가 아니기 때문에 운영체제가 다른 호스트에서는 실행 시킬 수 없음
    • 그러나 개발자라면 대부분 Windows를 사용하지 않기 때문에 크게 상관없음
  • 또한 독립적인 운영체제가 아니기 때문에 보안적인 측면에서 Hypervisor 가상화보다 약할 수 밖에 없음

Tip! 요약
: 컨테이너 가상화의 장점훨씬 가볍고 빠르고 쉽게 가상환경을 실행 시킬 수 있고 일반적인 시스템 API Interface를 사용한다는 것이지만, Base OS와 다른 운영체제에서는 실행시킬 수 없으며 보안적인 측면에서 약하다단점이 있음


Tip! 추가 내용

  • 기존의 VM 같은 경우엔 Host OS 위에 가상화를 시키기 위한 Hypervisor 엔진 그리고 그 위에 Guest OS를 올려 사용
    • 이는 가상화된 하드웨어 위에 OS가 올라가는 형태로 거의 완벽하게 Host와 분리된다고 봐도 무방
  • 반면에 컨테이너 기반 가상화Docker 엔진 위에 Application 실행에 필요한 바이너리만 올라가게 됨
  • OS 가상화를 보면 Host OS와 완전히 분리되는 장점은 있지만 OS위에 OS를 올리기 때문에 무겁고 느릴수 밖에 없음
  • 하지만 컨테이너 기반 가상화는 Host OS 그리고 Docker 엔진 위에서 바로 동작하며 Host의 커널을 공유
    • 커널을 공유하게 되면 IO 처리가 쉽게 되어 성능의 효율을 높일 수 있음
  • 컨테이너를 사용하는 것은 가상 머신을 생성하는 것이 아니라 Host OS가 사용하는 자원을 분리하여 여러 환경을 만들 수 있도록 하는 것
  • 한편, OS 가상화는 컨테이너기반 가상화보다 더 높은 격리 레벨을 지원하는데 이는 보안적인 측면에서 더욱 유리함
  • 또한 OS 가상화의 커널을 공유하지 않는 장점 또한 있음
    • 커널을 공유하지 않는 만큼 멀티 OS가 가능하다는 것
    • 컨테이너 기반 가상화가 커널을 공유하여 멀티 OS가 불가능 하다는 것은 Linux 위에 Window를 올릴 수 없다는 단점이 있다는 것
  • 그럼에도 불구하고 Docker를 쓰는 이유로는 성능 향상, 뛰어난 이식성, 쉽게 Scale Out을 할 수 있는 유연성을 꼽을 수 있음

Docker 구조

  • Docker Client와 Server
    • Server는 Docker Engine으로 불리기도 함
  • Docker Image
  • Docker Registries
  • Docker Containers

1. Docker Client & Server

  • Docker는 클라이언트와 서버 구조로 이루어져 있음
    • 클라이언트가 서버에 명령을 전달하고 서버가 실행시키는 구조
  • Docker Binrary 커맨드가 Docker 클라이언트이고 Docker Daemon 혹은 Docker Engine가 Docker 서버
  • 클라이언트와 서버는 동일한 호스트 안에서 운영 될 수 있으며 서로 다른 호스트에서 운영 될 수도 있음

2. Docker Image

  • Docker의 Life Cycle에서 Docker 이미지는 “Build”의 부분에 해당
  • Docker Container에서 실행시키고 싶은 Application을 Docker 이미지로 빌드해서 실행시키게 됨

3. Docker Registries

  • Docker Registires는 docker 이미지를 저장하는 Repository라고 보면 됨
  • Source Code를 Github에 저장하여 관리하듯 Docker 이미지는 Dockerhub 같은 Docker registries에 저장
    • Github과 마찬가지로 Public Registry 가 있고 Private Registry가 존재

4. Docker Containers

  • Docker Container에서 Docker 이미지가 실행
    • Docker 이미지를 실행시키는 가상화 공간
  • Docker Container는 하나 혹은 그 이상의 프로세스를 실행 시킬수 있지만 하나의 프로세스만 실행시키는 것을 권장

Tip! 추가 내용

  • 이미지는 컨테이너 실행에 필요한 파일과 설정값 등을 포함하고 있는 것으로 상태값을 가지지 않고 변하지 않는 특징(Immutable) 존재
  • 컨테이너는 이미지를 실행한 상태라고 볼 수 있고 추가되거나 변하는 값은 컨테이너에 저장됨
  • 즉, 같은 이미지에서 여러 개의 컨테이너를 생성할 수 있고 컨테이너의 상태가 바뀌거나 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아있음

Tip! 추가 내용

  • Docker File
    • Docker File은 이미지 생성 출발점으로, 이미지를 구성하기 위한 명령어들을 작성하여 이미지를 구성할 수 있음
    • Docker File을 읽을 수만 있다면 해당 이미지가 어떻게 구성되어 있는지도 알 수 있다는 의미
profile
🌱 Backend-Dev | hwaya2828@gmail.com

0개의 댓글