Docker 는 무엇이며, 왜 사용해야할까 ?

버건디·2024년 1월 9일
0

도커

목록 보기
1/10
post-thumbnail

도커에 대해서 이야기는 많이 들었었지만, 도대체 왜 사용해야하는 것이며, 어디 부분에 필요한것인지 감이 잡히지 않았다.
혼자서만 로컬에서 코드를 짜보며 공부하다보니 중요성과 필요성에 대해서 깨닫기 힘들수밖에 없었고, 이는 자연스럽게 Docker에 대한 무관심으로 이어졌다.
하지만 이번 기회에 Docker에 대해서 전체적인 부분들을 기록해놓고 상기시켜보려고 한다.


- Docker란 무엇인가 ?

Docker란 컨테이너라는 개념을 도입하여서 어플리케이션을 격리된 환경에서 실행시키기 위한 오픈소스 가상화 플랫폼이다.

컨테이너는 말그대로, 배에 많은 컨테이너들이 선적되어있는 화물선을 생각하면 된다.

이런식으로 배 안에 많은 컨테이너들이 존재하는데, 각 컨테이너들은 서로의 내용물을 알지도 못할뿐더러 영향을 주지도 못한다.

이런식으로 한 컨테이너 안에 어플리케이션의 설정, 운영 환경 등 어플리케이션에 필요한 값들을 모두 이미지화 해서 넣어줌으로써 독립적인 환경에서 운영될수 있도록 하는것이다.

- 독립적인 환경이란 것은 무엇인가 ?

독립적인 환경이란, 각 애플리케이션이나 서비스가 다른 애플리케이션의 환경, 설정, 라이브러리 등에 영향을 받지 않고 독자적으로 실행되는 환경을 의미한다.

이는 각 애플리케이션이 자신만의 리소스(메모리, CPU 등)를 사용하며, 서로 간섭하지 않도록 보장한다.

보통 배포를 하며 서버를 띄울때 원초적인 방법으로는 컴퓨터를 직접 켜서 서버를 띄우는 방법도 존재하지만, 요즘에는 그렇지 않다.

aws 같은 클라우드 시스템을 많이들 사용하는데, 로컬에서 잘만 돌아가더라도 이런 외부 클라우드에 배포를 하려고하면 로컬 환경과 클라우드 환경의 불일치로 인해서 에러가 발생할 가능성이 크다.

이런 로컬 환경과 클라우드 환경 간의 일관된 실행 환경을 제공하고, 이를 통해 환경에 따른 에러를 최소화하는 역할을 Docker가 보장해준다고 생각하면 된다.

- 가상화 플랫폼이란 ?

위에서 말한 원초적인 방법으로 서버를 띄운다고 생각해보자.

한 컴퓨터는 한 어플리케이션의 서버만 담당할수도 있겠지만, 이렇게 되면 리소스 낭비가 심해진다.

또한 컴퓨터의 성능이 고도화 되면서 한 컴퓨터는 여러개의 어플리케이션을 담당할수 있게 되었다.

하지만 이때 한 컴퓨터가 모든 서비스들을 담당하게 된다면 안정성에 문제가 생길수 있다.

이렇게 된다면 각 어플리케이션의 독립 된 환경을 보장해주지 못한다.

이때 가상화 플랫폼을 통한 OS 가상화를 통해서 리소스도 최대한 활용하고 안정성을 높일 수 있다.

가상화 플랫폼은 물리적 하드웨어 리소스를 추상화하여 여러 운영 체제나 애플리케이션을 동시에 실행할 수 있게 해주는 기술이다.

이때 사용되는 방식이 대표적으로 전체 가상화를 해주는 vm(virtual machine)과 컨테이너를 기반으로 가상화를 해주는 Docker가 있다.

- 그럼 vm과 Docker의 차이점은 무엇인가 ?

대표적으로 vm docker를 검색해보면 나오는 이미지이다.

vm은 하이퍼바이저 기반 가상화 플랫폼이다.

하이퍼바이저란 ?
하이퍼바이저는 물리적 호스트 시스템에서 여러 개의 가상 머신(VM)을 생성하고 관리하는 소프트웨어 또는 펌웨어이다.
이퍼바이저는 물리적 리소스를 가상화하여 각 VM에 할당하고, 이 VM들이 독립적으로 운영 체제와 애플리케이션을 실행할 수 있도록 한다.

하이퍼바이저의 역할중 하나는 논리적으로 분리된 공간에서 가상 환경을 만들어주는 것인데,

각 서비스에 맞는 게스트 os, 시스템 설정 등을 독립적으로 보장해주는 것이다.

즉, 각 어플리케이션마다 1부터 100까지 철저하게 해당 어플리케이션에 맞는 환경설정을 해준다고 이해하면 된다.

하지만 어플리케이션마다 가상 os 를 설정해주기때문에 무겁고 느릴수밖에 없다.

하지만 Docker는 그렇지 않다.

Docker는 게스트 OS가 존재하지 않는다.

Docker는 호스트 OS의 커널을 공유한다.

- 호스트 OS의 커널을 공유한다는건 무슨 의미인가 ?

커널은 하드웨어와 소프트웨어 사이의 통신을 담당한다.

이는 시스템 호출을 통해 프로그램이 하드웨어 리소스(메모리, CPU 등)에 접근할 수 있게 도와주며, 여러 프로세스 간의 안정적이고 효율적인 실행을 관리할수 있도록 한다.

즉 커널은 하드웨어의 리소스들을 접근할수 있도록 해주는 중개자 역할을 하는 것이다.

사실 vm을 사용하는 것이 더욱 독립적이고 안정된 환경을 보장해줄수 있다.

하지만 왜 vm 보다 docker를 사용하는 것일까 ?

  1. 경량화
    Docker 컨테이너는 각각의 운영 체제를 가지고 있지 않기 때문에, 전통적인 VM에 비해 훨씬 적은 리소스를 소모한다. VM은 각각 완전한 게스트 OS를 실행하기 때문에 더 많은 메모리와 저장 공간이 필요하다.

  2. 빠른 시작 시간
    컨테이너는 호스트 OS의 커널을 공유하기 때문에, 새로운 컨테이너를 시작하는 데 걸리는 시간이 매우 짧다. 반면, VM은 게스트 OS를 부팅하는 데 시간이 더 오래 걸린다.

  3. 효율적인 자원 사용
    Docker는 호스트 OS의 커널 기능을 그대로 사용할 수 있으므로, 메모리 사용량과 CPU 오버헤드를 최소화한다.
    또한, 여러 컨테이너가 호스트 OS의 커널을 공유하면서도 서로 독립적으로 실행될 수 있다.

  4. OS에 대한 의존성 감소
    Docker의 컨테이너는 기본적으로 OS, 운영체제의 세부 구현에 크게 영향받지 않는다.
    그렇기때문에 다양한 환경에서도 동일한 컨테이너를 실행할수 있도록하여 일관성을 유지할수 있도록 한다.

profile
https://brgndy.me/ 로 옮기는 중입니다 :)

0개의 댓글

관련 채용 정보