Docker : 기초 편

Docker 2019. 1. 16. 19:42

[Docker : 기초 편]

[Docker : 설치 편]

[Docker : 컨테이너 편]



Docker란?


Docker(이하 도커)는 운영체제 급(Operation System Level)의 가상화를 수행하는 컴퓨터 프로그램이다.

여기서 운영체제 급 가상화 컨테이너 화(Containerization) 라고도 한다.



도커는 어플리케이션을 가상머신기반 게스트OS를 통해 구동되는 방식에서 도커엔진 기반의 컨테이너에서 구동 되도록

설계함으로써 게스트OS 없이 어플리케이션을 구동 할 수 있게 되었다. 

도커를 설명하기에 앞서 먼저 가상화 개념에 대한 설명부터 하고자 한다.





가상화(Virtualization)란?



가상화는 컴퓨터에서 컴퓨터 리소스의 추상화를 일컫는 단어로, 

쉽게 설명하면 컴퓨터 속에 가상의 컴퓨터를 만들어내는 기술이다.





가상화는 왜 사용하는걸까?


세 대의 서버가 있다고 가정 해보자 각각의 서버는 메일, 인증, 그룹웨어 서비스가 가동되고 있다.

자원은 각 서버별로 25%, 30%, 20%씩 사용하고 있고 서버별 자원 활용률이 90%가 최대치라고 가정 한다면 현재 65%, 60%, 70%의 자원이 놀고 있는 상태가 된다.


일단 구조는 아래와 같다. 각 서버에 OS가 설치 되어 있고 그 위에서 서비스가 가동중이다.


그렇다면 어떻게 자원낭비를 없앨 수 있을까?




"그냥 3개의 서비스를 하나의 OS로 몰아주면 될 것 같은데?"



좋은 생각이다. 그런데 여기서 미처 생각하지 못한 부분이 있다. 다음 예를 보자


메일 서비스에 신규 기능이 추가 되었다. 이 기능을 사용하려면 OS버전의 업데이트가 필요한 상황이다.

인증 서비스와 그룹웨어는 OS업데이트가 불필요한 상황이고 오히려 업데이트를 하면 OS버전 호환 문제로 서비스에 지장을 주게 된다.

결국 OS업데이트로 인하여 3개 서비스의 호환성을 모두 확인하고 서비스를 수정하는 작업이 발생하게 되었다.


다른 예로 A부서에서만 쓰던 서버를 B부서에서도 쓰겠다고 한다. 마침 A부서와 B부서는 별도의 인증 서비스를 운영하고 있었다. 

하필이면 서비스명이 같고 설정도 많이 겹친다. 어떤 일이 벌어질까?


"포트 겹치는건 기본이고 바꿔야 할 설정들이 너무 많습니다."



최악의 경우에는 서비스의 설정들을 모두 바꿔야 하는 일이 생겨버린다.

혹은 Host OS가 Windows Server 였는데 리눅스 서버가 필요한 상황이라면? 서버 한대로는 도저히 답이 안나온다.

그럼 각 OS와 서비스가 독립적일수는 없을까?


이러한 경우 가상화 기술을 사용하여 해결 할 수 있다.

한 대의 서버에서 하이퍼바이저를 통한 물리자원의 논리적 분할로 여러개의 Virtual Machine에서 각각의 Guest OS를 생성 할 수 있다.

생성된 Guest OS는 독립적으로 운용이 가능하다. 3개의 각 Virtual Machine에서 Guest OS를 3개 생성한다면 서버 한 대로 세 대의 서버를 가진것이 된다. 3천원어치같은 천원어치 떢볶이를 떠올리면 된다.



이제 서비스의 간섭과 충돌에서 자유로워졌다.

그러나 다른 문제가 또 있으니...




왜 Docker를 사용해야 하는가?


앞서 설명한 Virtual Machine 기반에서 Application을 구동 하려면 Guest OS가 필요하다.

기본적으로 OS에만 소모되는 자원이 상당하고 가상 OS를 통한 Application의 실행은 무겁고 느려서 실제 운영환경에 효율이 상당히 떨어졌다.


그 후 도커가 출시 되었다.

도커는 컨테이너를 기반으로한 가상화 플랫폼으로 컨테이너는 프로세스를 격리 시키는 기술이다.


Virtual Machine 기반의 Guest OS에서 Apache와 Mysql이 실행중이라고 할 때

도커 엔진이라면 하나의 컨테이너에 Apache 프로세스가, 또 다른 컨테이너에는 Mysql 프로세스가 독립적으로 실행 된다.

즉 Guest OS의 의존 없이 격리된 하나의 프로세스를 만들 수 있게 되었는데, 이는 성능향상뿐만 아니라 엄청난 비용절감 효과를 가져올 수 있다.




Virtual Machine 대비 도커 컨테이너의 장점 요약


1. 가볍다

Virtual Machine 기반에서 Application을 구동하기 위해서는 반드시 Guest OS가 존재 해야하므로 그만큼 이미지의 사이즈도 커진다. 반면 도커 컨테이너는 Host OS에서 도커엔진을통해 구동되고 필요한 만큼의 자원만 사용하므로 Virtual Machine 대비 매우 가볍다.



2. 빠르다

Virtual Machine 기반에서는 무조건 Guest OS를 경유하여 Application을 실행 해야만 했다. 때문에 처음부터 하나의 Application을 실행하기 위해서는 Guest OS부터 구동해야 하는데 부팅시간은 최소 분 단위이다. 도커 컨테이너는 Guest OS를 경유하지 않으므로 몇 초만에 실행된다.



3. 배포가 용이하다

Virtual Machine에서 이미지 배포를 위해서는 Guest OS가 필요하므로 이를 포함하여 이미지로 만든 후 배포 해야한다. OS 기본설치만 해도 기가단위의 용량이 넘어가므로 이미지 배포는 용량이 적은 도커 컨테이너와 비교하면 매우 비효율적이다. 도커 컨테이너는 필요한 Application의 용량만큼을 이미지로 만들어 배포하므로 효율적이다.





Docker : 기초 편

끝.

'Docker' 카테고리의 다른 글

Docker : Dockerfile 실습 편  (0) 2019.03.22
Docker : Dockerfile 편  (0) 2019.03.07
Docker : 이미지 편  (0) 2019.02.22
Docker : 컨테이너 편  (1) 2019.02.15
Docker : 설치 편  (0) 2019.01.31
Docker : 기초 편  (2) 2019.01.16
Posted by DevStream

댓글을 달아 주세요

  1. MJ 2020.06.16 12:08  댓글주소  수정/삭제  댓글쓰기

    VM기반의 Guest OS에서 Application을 실행시키는 게 그 실행하고자 하는 어플리케이션이 Guest OS에 의존적이기 때문아닌가요? 만약 Windows OS만 지원하는 Application인 경우에는 Docker 엔진에서는 가동할 수 있나요? 만약 그렇다면 어떻게 가동할 수 있나요??

    • DevStream 2020.06.18 15:12 신고  댓글주소  수정/삭제

      "VM기반의 Guest OS에서 Application을 실행시키는 게 그 실행하고자 하는 어플리케이션이 Guest OS에 의존적이기 때문아닌가요?"
      -> 맞습니다. 실행하고자 하는 어플리케이션은 OS에 의존적입니다. 예를들어 윈도우즈용 exe파일을 리눅스에서 그냥 실행하면 실행이 되지 않습니다. 해당 어플리케이션이 Windows OS에 종속적이기 때문입니다. (물론 리눅스에서 exe프로그램을 아예 실행할 수 없는건 아닙니다만 wine이라는 별도의 패키지를 설치해야 하는 등 우회에 가까우므로 이것은 논외로 하겠습니다.)

      "만약 Windows OS만 지원하는 Application인 경우에는 Docker 엔진에서는 가동할 수 있나요? 만약 그렇다면 어떻게 가동할 수 있나요??"
      -> 가능합니다. Windows OS에서 도커엔진을 통해 Windows 컨테이너를 생성할 수 있습니다. Windows OS전용 어플리케이션이므로 Windows OS에 설치된 도커엔진을 기반으로 구동됩니다.

      아래 링크는 1809버전의 도커엔진으로 간단한 웹 서버를 구현하는 예제입니다.
      https://stefanscherer.github.io/how-to-run-lightweight-windows-containers-on-windows-10/

      덧붙여서..
      각 어플리케이션들은 각각의 OS에 종속적입니다. 예를들어 nginx 웹서버 어플리케이션은 윈도우즈용, 리눅스용 두 가지 버전을 지원합니다. 윈도우즈에서 리눅스용 nginx는 일반적으로는 실행할 수 없습니다. 이것을 가능하게 하려면 네이티브 리눅스환경을 구축하거나 윈도우즈OS에서 VM을 통한 리눅스OS 환경을 만들거나 윈도우10에서 지원하는 WSL을 이용해야 합니다.