개발박사가 되고싶은 척척학사

[Docker] Docker란? (컨테이너, 도커의 개념 및 장단점) 본문

Docker

[Docker] Docker란? (컨테이너, 도커의 개념 및 장단점)

척척학사 2023. 12. 29. 14:10

 

 

요즘 Docker는 개발자들이 기본적으로 알고 있어야하는 기술이 되어가고 있다. 나도 현업에서 많이 사용하게 되어 필요한 명령어만 외워 사용하고 있었는데 이번 기회에 이론부터 정리해보려고 한다. 쉽게 설명하려고 노력을 많이 하였으니, 가볍게 읽어보면 좋을 것 같다.

 

우선 Docker를 이해하기 위해서는 컨테이너가 무엇인지부터 알아야한다. 


컨테이너란?

컨테이너란 Host 서버의 OS를 논리적인 구역으로 나누어, 애플리케이션을 작동시키기 위해 필요한 라이브러리나 애플리케이션 등을 하나로 모아, 마치 별도의 서버인 것처럼 사용할 수 있도록 만든 것이다. 따라서, 컨테이너 기술을 사용하면 OS나 디렉토리, IP 주소 등과 같은 시스템 자원을 마치 각 애플리케이션이 점유하고 있는 것처럼 보이게 할 수 있다. 

 

일반적으로 개인의 컴퓨터나 서버에는 여러 프로그램이 동시에 실행되고 있는 상태다. 컴퓨터로 카톡도 켜두고, 동시에 인터넷도 하는 것과 같이 서버도 아파치, 톰캣 등 여러가지 소프트웨어가 동시에 동작하는데, 컨테이너는 이런 각각의 소프트웨어를 각각 독립된 환경에 격리하는 기능을 제공한다.

그렇다면 왜 애플리케이션을 격리시켜야하는걸까?

 

하나의 서버에 애플리케이션 A,B 두 개를 올려야하는 상황이라고 치자. A는 Z프로그램 1버전 기반으로 개발이 되었고 B는 5버전 기반으로 개발되었을 때, 한 서버에 Z프로그램을 한 벌만 설치할 수 있다. 이 서버에는 Z프로그램을 몇 버전으로 설치해야할까?

애플리케이션 A, B를 따로 묶어 컨테이너로 만들어서 서버에 올린다면, 한 서버에서 실행되면서 발생하는 문제를 대부분 해결할 수 있다.

 

 또, 컨테이너는 가상 네트워크를 통해 외부에 노출되지 않고 서로 통신할 수 있다. 다시 말해, 기존 모놀리식 설계로 개발된 하나의 통짜 애플리케이션을 분할해 기능별로 별도의 컨테이너에 배치할 수 있고, 애플리케이션의 실행에 필요한 모듈을 하나의 컨테이너로 모을 수 있기 때문에 여러 개의 컨테이너를 조합하여 하나의 애플리케이션을 구축하는 MSA로 구성된 프로젝트에서 사용하면 좋다. 

 

가상머신(VM)과 컨테이너의 차이

 

VMware같은 가상화 기술은 물리서버 안에 가상의 물리서버를 만드는 것과 같다. VM에는 호스트 서버에 운영체제가 설치되어있다고 하더라도 VM마다 따로 OS를 설치해서 사용해야하는데 컨테이너에는 OS를 따로 설치하지 않는다.

다시 말해, VM은 하나씩 늘어날때마다 생성된 VM의 OS를 위해 호스트서버의 자원을 할당해줘야하는데, 컨테이너는 운영체제 설치가 필요 없기 때문에 OS를 위한 자원을 할당할 필요가 없다. 따라서 애플리케이션에 필요한 모든 패키지만 있으면 컨테이너를 구동할 수 있고, VM에 비해 가볍고 고속으로 동작한다는 것이 특징이다. 


Docker 란?

Docker(도커)는 애플리케이션의 실행에 필요한 환경을 하나의 이미지로 모아두고, 그 이미지를 사용하여 다양한 환경에서 애플리케이션 실행 환경을 구축 및 운용하기 위한 오픈소스 플랫폼이다. Docker 내부에서 컨테이너 기술을 사용하고 있는 것이 특징이다.

쉽게 말해, 컨테이너를 다루는 기능을 제공하는 소프트웨어라고 보면 된다.

 

Docker를 사용하기 위해서는 Docker Engine을 설치해야하며, Docker Engine을 이용해 컨테이너를 생성하고 실행할 수 있다. 컨테이너를 만들기 위해서는 도커 엔진 뿐만아니라, 컨테이너를 만들기 위한 빵틀과도 같은 이미지가 필요하다.

이미지 : 가상머신을 생성할 때 사용하는 ISO파일과 비슷한 개념으로, 소스코드, 라이브러리, 도구 등 애플리케이션을 실행하는데 필요한 파일을 포함하고 있는 변경 불가한 파일이다. 이미지는 1개만 있으면 똑같은 컨테이너를 여러 개 만들 수 있다. 

 

(도커 이미지에 관한 자세한 내용은 따로 포스팅해두었으니 참고해주세요!)

2024.01.10 - [Docker] - [Docker] Docker Image 이해하기 (도커 이미지란, 이미지의 종류, Docker Hub, 도커 이미지의 특징)

 

애플리케이션을 개발한 후에, 서버에서 가동시키기 위해서는 다음 요소들이 필요하다. 

  1. 애플리케이션 소스
  2. 미들웨어나 라이브러리
  3. OS, 네트워크 등 인프라 환경설정

도커는 위와 같은 요소들을 컨테이너로 관리한다. 애플리케이션 실행에 필요한 모든 파일 및 디렉토리들을 컨테이너로서 모아, 컨테이너의 바탕이 되는 Docker 이미지를 Docker Hub와 같은 리포지토리에서 공유한다. 

 

Docker의 장점

 

개발자는 Docker를 사용하여 개발한 애플리케이션의 실행에 필요한 모든 것이 포함되어있는 Docker 이미지를 작성하는데, 이 이미지가 바로 컨테이너의 바탕이 되어 컨테이너를 생성하고, 가동시킨다. 이 이미지는 Docker가 설치되어있는 환경이라면 기본적으로 어디서든지 작동되므로 개발/테스트 환경에서는 잘 되던게 상용에서 동작하지 않는 것과 같은 불상사를 줄일 수 있다.

 

또, 애플리케이션 개발부터 테스트~제품 환경에 대한 전개를 모두 애플리케이션 엔지니어가 수행하는 것이 가능해짐으로써, 지속적 딜리버리를 가능하게 하고 변화에 강한 시스템을 구축할 수 있다.

 

한 번 만들면 어디서든 실행이 잘 되어 이관이 쉬운 소프트웨어의 특성을 “이식성이 높다”고 한다.

Docker는 이식성이 높기 때문에 클라우드 시스템과의 친화력도 높은 것이 특징이다. Docker 이미지만 있으면 모든 환경에서 애플리케이션을 가동시킬 수 있다. 즉, 이식성이 높기 때문에 개발한 애플리케이션을 온프레미스 환경에 대한 이전 뿐만 아니라 온프레미스 → 클라우드 또는, 클라우드 → 온프레미스 간에도 시스템 요건이나 예산에 따라 비교적 쉽게 실행 환경을 변경할 수 있다. 

 

하지만 모든 상황에서 도커가 좋은 것만은 아니기 때문에 아래에서 도커의 단점에 대해서도 살펴보려고 한다.

 

Docker의 단점

 

위에서 하나의 서버에 여러 개의 컨테이너를 올려 MSA를 구축하기에 좋다고 설명했는데, 만약 클라우드 환경이 아닌 온프레미스 환경에서 이와 같이 구성을 한다면 호스트 서버에 문제가 생기게 될 때, 그 문제가 호스트 서버에 올라와있는 모든 컨테이너에 영향을 미치게 된다. 

 

추가적으로, 도커는 리눅스 운영체제를 사용하는 기술이기 때문에, 리눅스용 소프트웨어밖에 지원되지 않는다. 

도커는 밑바탕에서 리눅스 운영체제가 동작하는 것을 전제로 하는 구조로 되어있기 때문에 리눅스 운영체제에서만 동작할 수 있으며, 컨테이너에서 실행할 소프트웨어 역시 리눅스용 소프트웨어이어야 한다. 윈도우나 macOS용 소프트웨어는 컨테이너에 넣어도 동작하지 않는다.

이 이론대로라면 윈도우나 macOS의 경우, 도커를 사용할 수 없어야하지만 이런 경우는 VMware와 같은 가상환경에 리눅스를 설치하여 그 위에서 도커를 실행하거나 Docker Desktop과 같이 리눅스를 포함하는 패키지를 설치해 사용할 수 있다.