Docker란 무엇인가?

    이 글은 "그림과 실습으로 배우는 도커 & 쿠버네티스"를 공부하며 작성한 글입니다. 


    Docker란 무엇인가?

    Docker는 Container 개념을 도입해서 데이터/프로그램을 격리시키는 기능을 제공하는 소프트웨어다. Docker는 컨테이너 환경을 손쉽게 만들 수 있는 기능과 각 컨테이너를 손쉽게 동작할 수 있는 Docker Engine을 제공한다. 

    Docker는 기본적으로 Linux 운영체제에서 사용되는 것을 가정하고 만들어진 SW다. 따라서 Docker Engine은 반드시 Linux 위에서 동작하게 된다. Window/Mac에서도 사용이 가능하며, 이 경우에는 가상환경에 Linux OS를 띄우고, 그 위에서 Docker Engine을 사용하도록 동작한다. 

    DockerEngine 위에는 각각의 컨테이너를 띄울 수 있다. 그리고 이 컨테이너는 일반적으로는 Linux의 라이트한 버전의 "유사 Linux"를 포함하고 있다. 각 컨테이너끼리는 서로 격리가 되어있고, 만약 데이터를 주고 받기를 원한다면 커널을 이용하는 것처럼 Docker Engine을 이용하면 된다. 


    데이터/프로그램의 격리가 필요한 이유?

    앞서 컨테이너는 데이터/프로그램의 격리를 손쉽게 지원하기 위해 도입된 개념이라고 했다. 그렇다면 왜 데이터/프로그램의 격리가 필요한 것일까? 데이터/프로그램이 격리되지 않으면 1) 서로에게 영향을 줄 수 있고 2) 서로에게 강한 의존성을 가질 가능성이 있다는 점이다. 

    하나의 컴퓨터에서 시스템 A/B를 모두 동작시켜야 한다고 가정해보자. 그리고 시스템 A/B는 시스템 C가 있어야만 돌아가는 프로그램이다. 그런데 시스템 A/B가 필요로 하는 시스템 C의 버전이 다르다고 가정해보자. 이 때 문제가 발생할 수 밖에 없다. 기본적으로 한 컴퓨터에 설치될 수 있는 버전은 하나기 때문이다. 

    Docker는 이 문제를 컨테이너 개념을 이용해서 손쉽게 풀어낸다. 컨테이너로 격리된 환경을 만들어주고, 각 컨테이너에서 서로 다른 버전의 시스템 C를 동작시키게 한다. 그리고 각 컨테이너를 Docker Engine에 올리고, Docker Engine을 하나의 PC에서 실행시켜주면 이런 문제가 훌륭하게 해결된다. 


    자유롭게 옮길 수 있는 컨테이너

    Docker Engine 위에 있는 컨테이너는 다른 PC의 Docker Engine으로 손쉽게 옮길 수 있다. 내 PC에서 사용하고 있는 컨테이너를 다른 PC로 그대로 옮겨서 사용할 수 있다. 앞서 이야기한 것처럼 Container는 격리된 새로운 환경이고, Docker Engine을 이용해서 실행되기 때문에 Docker Engine 위에 컨테이너를 옮기기만 하면 어떤 환경에서든 동일한 개발 환경을 가질 수 있다. 

    Docker 컨테이너를 옮기는 것은 1) 컨테이너의 정보를 내보내서 2) 다른 Docker Engine에서 복구 하는 형식으로 처리가 된다고 한다. 아무튼 Docker의 컨테이너 기술은 개발환경을 통일하는데도 많은 도움을 준다.


    Docker의 기본 구조

    Docker는 기본적으로 다음과 같은 구조로 이루어져있다. Linux 위에 도커 엔진이 돌아간다. 그리고 도커 엔진 위에 Container가 있다. Container에는 Linux 주변 부분이 들어있다. 왜 Container에는 Linux 주변 부분이 들어있어야만 할까? 컨테이너 내의 프로그램에서 발생하는 명령어를 Linux에 전달해줘야하는데, 컨테이너로 격리가 되어있기 때문이다. 

    Linux는 커널과 주변 부분으로 구성된다. Linux 운영체제의 동작은 Linux의 주변 부분이 프로그램의 연락 내용을 커널에 전달하고, 커널이 하드웨어를 다루는 방식으로 동작한다. 이 때문에 컨테이너 안에는 프로그램의 연락 내용을 전달하기 위한 "Linux의 주변 부분"만이 들어있다. 그리고 Linux의 주변 부분만 있기 때문에 도커는 "가볍다"라는 큰 특징을 얻을 수 있다. 

     

    컨테이너 내부는 Linux 환경

    위에서 이야기 한 것처럼 컨테이너는 Linux의 주변 부분을 가지고 있으며, Linux의 주변 부분을 이용해서 Linux와 통신한다. 즉, 컨테이너에서 실행되는 모든 프로그램은 반드시 Linux 전용이어야 실행이 된다는 것을 의미한다. 예를 들어 컨테이너 내부에서 Power Point, Excel 등을 실행하면 실행되지 않는다. 


    도커 허브, 이미지, 컨테이너

    도커는 이미지를 제공하고, 이미지를 이용해서 컨테이너를 만들 수 있다. 도커의 이미지는 "붕어빵 틀"로 이해할 수 있고, 컨테이너는 "붕어빵"으로 이해할 수 있다. 즉, 도커의 이미지를 이용해서 동일한 컨테이너를 여러개 만들 수 있다. 

    반대로 컨테이너를 이용해서 이미지를 만드는 기능도 제공된다. 예를 들어 어떤 이미지로 컨테이너를 만든다. 그리고 그 컨테이너를 약간 수정한다. 이 수정된 컨테이너로 새로운 이미지를 만드는 기능도 제공된다. 이 경우, 변경점이 발생한 컨테이너를 위한 이미지를 일일이 만들지 않아도 된다는 편의성이 존재한다. 

     

    이미지를 이용한 컨테이너 이동

    도커는 컨테이너를 이용해서 이미지를 생성할 수 있다. 생성된 이미지를 다른 PC에 전달하고, 이 PC에서 이미지를 이용해서 컨테이너를 만들어 도커 엔진에 올릴 수 있다. 이처럼 도커는 이미지를 이용해서 컨테이너를 이동시킨다.

     

    도커 허브(https://hub.docker.com/)

    도커는 도커 허브를 통해서 필요한 이미지를 제공한다. 따라서, 도커를 처음 사용하는 사람들은 컨테이너의 이미지를 밑바닥부터 만들 필요가 없다. 도커 허브는 굉장히 다양한 이미지를 제공해준다.

    단순히 OS만 설치된 이미지, 하나의 소프트웨어만 포함된 이미지, 여러 소프트웨어가 포함된 이미지 등 굉장히 다양한 이미지 등을 제공한다. 문제점은 누구나 이미지를 올릴 수 있기 때문에 검증되지 않은 이미지를 사용할 수 있다는 위험성이 존재한다. 그렇지만 이런 문제는 도커에서 직접 배포하거나, 소프트웨어를 개발 하는 조직에서 직접 배포한 공식 이미지를 사용하면서 해결할 수 있다. 


    컨테이너는 하나의 프로그램만 포함하자! 

    도커를 사용할 때의 가장 기본적인 원칙은 "1 컨테이너 = 1 프로그램"이라는 것이 있다. 이는 보안 및 유지보수 관점에서 이점을 가지기 때문이다. 각 프로그램은 다른 프로그램과의 영향성이 최소화되기 때문에 사이드 이펙트가 적어 손쉽게 업데이트를 할 수 있다. 

    컨테이너에 여러 개의 프로그램을 넣어서 돌릴 수 있기도 하다. 하지만 이 경우는 도커가 가지는 가장 큰 장점인 "격리성"을 손해보기 때문에 권장하는 방식은 아니라고 한다. 

     


    도커 컨테이너의 생애주기와 데이터 저장

    컨테이너는 쓰고 버리는 일회용품이다. 따라서 사용이 끝난 컨테이너는 종료하고, 폐기한다. 그리고 새롭게 사용할 컨테이너를 만들어서 사용하면 된다. 

    사용이 끝난 Docker는 종료한 후, 삭제한다. 그리고 docker Hub에서 새로운 이미지(최신 버전 등)을 받은 후, 새로운 컨테이너를 만들어서 실행해주면 된다. 도커는 이처럼 "만들고 → 실행하고 → 종료하고 → 폐기하는 과정"을 가진다.

    컨테이너의 생명주기를 이용해서 기존의 컨테이너에 깔려있는 프로그램을 업데이트 하는 개념이 아니라, 업데이트 된 프로그램을 가진 이미지로부터 컨테이너를 만든다. 즉, 업데이트 공수가 매우 줄어든다는 장점이 있다!

     

    데이터 저장

    컨테이너는 생명주기를 가진다. 컨테이너가 폐기되면, 컨테이너에 저장되어있던 모든 데이터는 삭제된다. 당연하지만 컨테이너가 삭제되더라도, 컨테이너에서 발생된 데이터를 저장하는 방법은 존재한다. 도커가 설치된 PC/서버의 물리적 디스크를 마운트하고, 이 디스크에 데이터를 저장하면서 연속성을 가질 수 있다. 

    마운트는 "컨테이너에 디스크를 연결해 데이터를 기록할 수 있도록 한 상태"를 의미한다. 컨테이너에서 발생한 데이터는 디스크에 저장되기 때문에 컨테이너가 폐기되더라도, 연속적으로 데이터를 사용할 수 있게 된다. 


    도커의 장/단점

    도커의 장점

    • 한 대의 물리 서버에 여러 대의 서버를 띄울 수 있음
      • 하나의 도커 엔진에 여러 개의 서버 컨테이너를 생성해서, 하나 밖에 사용할 수 있는 서버를 여러개 사용할 수 있게 한다. 
    • 서버 관리가 용이하다. 
      • 컨테이너를 이용해서 독립된 환경에 격리한다. 따라서 업데이트가 간단하다. 

     

    도커의 단점

    • 서버 관리를 철저히 해야한다. 
      • 한 서버에 여러 서버가 뜬다. 바꿔 이야기 하면 한 서버가 죽으면 여러 서버가 죽는다.

     

    도커의 주 용도

    • 동일한 개발 환경 제공하기
    • 새로운 버전의 테스트
      • 새로운 버전을 도입할 때, 격리된 환경에서 테스트하고 도입할 수 있음. 
    • 동일한 서버가 여러 대 필요한 경우

    'Dev-Ops > Docker' 카테고리의 다른 글

    Docker : Dockerfile Build  (0) 2022.10.14

    댓글

    Designed by JB FACTORY