본문 바로가기
Linux

Docker - 이미지, 컨테이너, 레이어, 가상화 이해

by 올엠 2024. 3. 3.
반응형

Docker를 사용하는 이유는 사용해보면 쉽게 알 수 있지만, 여기에서는 사용하기 전, 즉 왜 필요한지에 대해서 얘기해보고자 한다.

Docker는 현재 많은 업체에서 배포환경에 사용하고 있는 CI/CD 기술에 필수요소로 자리잡은 기술이라고 할 수 있다.

왜 이처럼 많은 사람들이 Docker를 사용하는 것일까?

만약 여러분이 웹 서비스를 개발한다고 생각해보자. 자신의 노트북에서 개발을 진행하고, 실제 서비스를 위해서 클라우드에 위치한 서버에 서비스를 올려야 할 것이다.

노트북에서 웹 서비스에서 개발할 때 개발 기간이 길고, 다양한 서비스를 활용했다면, 이를 클라우드 서버에도 동일하게 구성을 해야 한다. 그리고 만약 서비스를 업데이트한다면, 추가적인 구성들도 서버에 적용해야 할 것이다.

특히 환경 설정이 많아 질 수록 서버에서 제대로 동작하기란, 잘 만들어 놓은 메뉴얼을 통해서 작업을 하더라도 라이브러이 충돌이나 오타, 환경설정 누락등으로 정상적인 서버 환경을 구성하기란 쉽지 않다. 그런데 이러한 구성을 서버 자원 확보를 위해 여러 대를 진행해야 한다면... 개발자로써 맨탈한계를 느끼기 시작할 것이다.

방금 얘기한 부분은 단순해 보이지만, 현재의 개발자는 개발이 전부가 아닌, 서비스를 안전하게 운영할 책임도 가지고 있기 때문에 이러한 서버의 다양한 환경적 문제는 개발자의 손과 발을 잡고, 많은 자원을 할애하게 만드는 작업이다.

이를 해결할 수 있는 기술중 하나가 바로 Docker이며,  오늘 Docker가 중요한 3가지를 알아보도록 하자.

 

1. 운영체제 의존성 제거(격리된 환경)

Docker는 컨테이너라 기술을 이용해서 패키징된 격리된 환경을 제공한다.

즉 이말은 소프트웨어 구동에 필요한 모든 요소를 컨테이너에 포함함으로써, 운영체제에서 소프트웨어에 필요한 추가 요소(라이브러리나 관련 패키지들)을 따로 설치할 필요가 없고, 다른 환경에도 영향을 주지 않기 때문에 충돌이나 호환성 문제가 발생하지 않게 된다.

2. 우수한 확장성

Docker 컨테이너는 소프트웨어 실행에 필요한 모든 요소를 가지고 있기 때문에, 개발과 운영 환경이 동일하게 유지할 수 있고, 하나의 단일 이미지로 관리되어 다양한 환경(윈도우, 리눅스등)에 쉽게 배포가 가능하다.

3. 효율적인 관리

Docker는 가상화 기술을 사용하지만, 실제 Hyper-V처럼 완전 가상화가 아닌, CPU와 메모리등은 호스트와 공유하기 때문에 다른 가상화 시스템의 자원을 보다 효율적으로 자원을 관리하며 빠르게 동작할 수 있다.

그럼 여기에서 Docker를 사용할 때 가장 중요한 개념인 Image와 Container에 대해서 조금 더 알아보도록 하자.

이미지(Image)

Docker는 기본적으로 격리된 환경을 제공하기 위해서, 빌드라는 과정을 통해 하나의 이미지(Image)를 생성하게 된다.

이 이미지에는 개발을 하면서 필요한 모든 구성요소가 파일로 포함되게 된다.

만약 Python을 개발을 진행했다고 생각하면, Python 언어와 관련 라이브러리, 그리고 웹 서비스를 이용한 경우 Nginx 서비스도 포함할 수 있다. 그외 에도 Ubuntu의 특정 cron 혹은 기능을 사용했다면, Ubuntu 라이브러리도 설치를 하여 기능을 활용할 수 있으며, 실행에 필요한 환경 변수도 이미지에 등록 할 수 있다.



이렇게 생성된 이미지는 기본적으로 변경이 불가능한 하나의 파일처럼 생성이 된다.

그리고 실제 생성한 이미지는 직접 변경이 불가능한 상태가 된다.

이후 컨테이너의 활용이 필요한데 바로 컨테이너로 넘어가도록 하겠다.

컨테이너(Container)

이미지를 생성하였다면, 실제 구동을 해야 하는데 이때 만들어진 이미지를 기본으로해서 컨테이너를 만들게 된다.

즉 이미지는 하나의 읽기 CD라고 할 수 있고, 이를 실행한 것이 바로 컨테이너이다.

컨테이너는 실행하면서 변경되는 내용들을 하드 디스크처럼 계속 저장하고 유지하게 된다.

따라서 실제 서비스는 컨테이너에서 실행되고 유지된다고 할 수 있다.

 

컨테이너를 파일을 내부적으로 보면, 레이어라는 파일 처럼 관리가 되는다.
 
기존 파일 레이어(Layer)에 변경되는 내용을 레이어를 이용해서 관리되며, 이를 그림으로 표현 한다면, 아래와 같이 레이어가 겹겹이 겹쳐지는 방식으로 관리되어 진다.
 

 

이러한 레이어는 Docker의 변경관리로 활용되어 지는 것으로 보여지는데, 
 
컨테이너는 이미지에 존재하는 모든 Low-layer 를 모두 Upper-layer에 병합한 후에 컨테이너가 실행되어지는 구조이다.

조금 더 깊이 들어가면, Docker가 파일 단위로 관리하는 부분도 확인이 가능하므로 이부분은 다른 자료를 통해 확인해보면 좋을 듯 하다. 그리고 우리는 컨테이너에 대해 조금 더 알아보자.

가상머신?

Docker에서 실행되는 컨테이너에는 앞서 얘기 했듯이 Ubuntu 기능을 활용할 수도 있다.
 
Ubuntu의 시스템 파일을 이미지에 생성하여, 컨테이너에서 사용이 가능하지만, 가상 머신으로 활용하는 것이 아닌 파일 기반으로 활용한다는 점이다.
 
따라서 기본적으로 Docker를 사용하게 되면, Docker 자체를 실행하는 운영체제의 환경을 이용하게 된다.
 
즉 Docker는 CPU나 메모리 같은 OS 자원을 직접 사용 (앱 실행에 필요한 자원만 사용)도록 구성되어 있다.
 
그리고 Docker가 사용하는 컨테이너라는 가상화 기술은, Linux Kernel에서 기본적으로 제공하는 컨테이너 기술을 사용하는 것이다. Linux Kernel 관련된 세부적인 내용을 위키를 참고하기 바란다.
 

만약 기존 가상 머신 방식이라면 다음과 같다.
 
Hypervisor라는 가상화 레이어가 추가되며, 각 소프트웨어인 App은 개별 운영체제를 통해서 사용되어 진다.
 
이는 Guest OS에 따른 디스크 저장 공간 뿐만 아니라 Hypervisor의 추가 가상화로 인해 CPU나 메모리과 같은 자원 접근시 추가적인 리소스들 들어가 Docker 보다 성능적으로 손실이 발생하게 된다.

다만 이러한 이유로 Docker가 Windows 환경에서 제약이 많았으나, Windows에서 WSL 기능을 제공하면서 현재는 많은 부분이 해소된 상태이다. WSL(Windows Support Linux)의 약자로, 최근 Windows 10부터 Ubuntu 쉘등을 완벽하게 사용할 수 있게 된 부분도 WSL의 도움으로 가능하다.
 
Docker 역시 Windows WSL를 이용해서 구동이 가능하며, 이를 통해 완벽하게 Windows에서 구동이 된다.
이렇게 짧지만 Docker를 왜 사용하는지 이유와 가장 기본되는 이미지, 컨테이너, 그리고 가상화 부분에 대해서 알아보았다. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
반응형