DEV ℧ Developer Diary

[Docker] 도커란 무엇인가?

해당 포스트는 inflearn에서 subicura님의 초보를 위한 도커 안내서의 강의를 듣고 정리한 문서입니다.

도커(Docker)

docker1

도커란 무엇일까?

도커(Docker)는 컨테이너 기반 가상화 도구로써, 컨테이너에 애플리케이션을 구축 하여, 테스트 및 배포를 쉽게 할 수 있는 오픈소스 기반의 가상화 플랫폼이다.

도커는 왜 생긴걸까?

서버를 운영하는 사람들은 여러 노력을 통해 서버를 안정적으로 운영하고자 하였고, 이에 여러 방법을 통해 서버를 운영하고자 노력했습니다.

그렇다면 사람들은 어떤 방식을 이용해 서버를 운영하고자 하였을까?

문서 관리

ppt, word 와 같은 문서로 서버 운영방법을 기록했지만 서버의 운영 중 OS가 달라지거나, 문서 정보의 정확성에 대한 의심과 문서가 최신화가 되지 않는 경우, 똑같이 따라했지만 동일한 결과가 나오지 않는 경우 등 문서의 작성자에 따라서 문서의 질과 정확도가 달라지다 보니 관리에 많은 어려움이 있었다.

상태관리 도구

docker2

문서를 통한 운영에서 어려움을 느끼자 CHEF, PUPPET과 같은 상태관리 도구를 차용했다.

상태관리 도구란 기존 문서화된 형태로 설정파일을 설정했다면 톰캣과 같은 인프라의 설정파일을 연결해 해당 상태관리 도구를 실행시키면 설정파일이 적용되도록 하는 도구였다. 코드로 작업되다보니 버전관리도 가능한 장점이 있었다. 하지만 각 OS마다 적용 방법이 다르고 러닝커브가 높다보니, 예를들어 같은 서버에 다른 버전의 개발 도구를 설치하는 것은 난이도가 급상승 하는등의 단점이 있었다.

가상머신

docker3

상태관리에 어려움을 느끼자, 가상머신이 등장했다, 톰캣이나 DB를 가상머신으로 만들고 서버에서 필요할때마다 가상머신을 띄어서 사용했다.

가상머신으로 분리해서 띄우다보니 다른 인프라에 영향을 주지않고, 한서버에 여러개를 설치하거나, 설정이 바뀔경우 변경된 상태로 저장하여 최신화를 할수 있었다. 하지만, 최조로 가상머신을 만들때 사용했던 설정 및 방법이나 가상머신의 용량이 너무 크기 때문에 가상서버 자체가 느리고 이미에 대한 공유가 어려웠다.

자원 격리

그래서 이후 자원 격리라는 방법이 사용되었는데 예를 들어, 리눅스에 젠킨스나 Mysql의 인프라가 있을 경우 가상머신으로 만들지 않고 가상으로 파일과 디렉토리 등을 구분하여 분리를 시켜서 관리하는 방법을 쓰였다. 분리 후에 CPU, MEMORY, I/O 등등을 리눅스의 커널등을 이용하여 그룹별로 제한하는 방식을 사용했다. 하지만 사용하기 어렵다는 단점이 있었다.

도커의 등장

docker4

이러한 이유로 도커가 등장하게 되었다.

컨테이너(Container)란 격리된 환경에서 작동하는 프로세스로, 도커를 사용할 경우 하드웨어 가상화 기술보다 가볍고, 이미지단위로 프로세스의 실행환경을 구성하다 보니 쉽게 배포 및 적용을 할 수 가 있었다.

도커란?

가상머신과 도커의 차이

가상머신과 도커가 비슷한 기능을 하다보니, 비교가 많이 될 수 있다.

가상머신과 도커의 차이

  • 가상머신(Virtual Machine)

먼저 가상머신(Virtual Machine)에 대해 간단하게 설명해보자면, 하이퍼바이저라는 가상머신을 생성하고 구동하는 소프트웨어에서 가상환경을 만들고, Host OS에서 가상머신에 설치되어 있는 Guest OS를 구동 및 모니터링 하는 역할을 한다.

하이퍼바이저 : 호스트 컴퓨터에서 다수의 운영체제를 동시에 실행시키기 위한 논리적 플랫폼 Host OS : 가상머신을 실행시키는 서버의 OS Guest OS : 가상머신의 OS

  • 가상머신과 도커의 차이점

가장 큰 차이점이라고 하면, Guest OS하이퍼 바이저라고 볼 수 있다.

가상머신의 경우 하나의 가상환경을 띄울때마다 하이퍼 바이저를 통해 Guest OS를 실행시킨다. 하지만 도커는 이러한 절차를 거치지 않고 자원의 격리를 통해 컨테이너를 실행 시킨다.

도커는 도커의 이미지를 실행시켜 독립된 애프리케이션을 구동하기 때문에, 자원의 소모가 훨씬 효율적이다.

도커의 특징

확장성/이식성

  • 도커가 설치되어 있다면 어디서든 컨테이너를 실행할 수 있다.
  • 특정 회사나 서비스에 종속적이지 않다.
  • 쉽게 개발서버를 만들 수 있고 테스트 서버 생성이 간편하다.

표준성

  • 만약 도커를 사용하지 않는다면 Java, nodeJs, go, php 등등 각기 다른 언어로 만든 서비스의 배포방식은 달라진다.
  • 도커는 컨테이너라는 표준으로 서버를 배포하므로 모든 서비스들의 배포과정을 동일하게 만들 수 있다.

이미지

  • 이미지에서 컨테이너를 생성하기 때문에 반드시 이미지를 만드는 과정이 필요하다.
  • 이미지를 만드는 방법은 Dokerfile이라는 스크립트를 이용하여 이미지를 만들고 처음부터 재현이 가능하다.
  • 빌드 서버에서 이미지를 만들면 해당 이미지를 이미지 저장소에 저장하고 운영서버에서 이미지를 불러온다.

이미지 : 도커에서 컨테이너를 실행하기 위한 압축파일

설정관리

  • 설정은 보통 환경변수로 제어한다.
    • ex) MYSQL_PASS=password 와 같이 컨테이너를 띄울때 환경변수를 같이 지정한다.
  • 하나의 이미지가 환경변수에 따라 동적으로 설정파일을 생성하도록 만들어져야한다.

자원관리

  • 컨테이너의 경우 삭제 후 새로 만들면 모든 데이터가 초기화 된다.
  • 업로드 파일을 남겨야 할 경우 외부 스토리지와 링크하여 사용하거나 Amazon S3 같은 별도의 저장소가 필요하다.
  • 세션이나 캐시를 memcached나 redis와 같은 외부로 분리가 필요하다.

도커가 가져온 변화

  • 클라우드 이미지보다 관리하기 쉬움
  • 다은 프로세스와 격리되어 가상머신처럼 사용하지만 성능저하가 거의 없다.
  • Linux의 복잡한 기술(namespace, cgroups, network…)을 몰라도 사용할 수 있다.
  • 이미지를 생성할때 스크립트를 사용하다 보니, Git과 같은 형상관리 툴을 이용해 버전 관리 및 빌드 기록 관리가 가능하다.
  • 코드와 설정으로 관리하기 때문에 재현 및 수정이 가능하다.
  • 오픈소스의 장점으로 특정 회사 기술에 종속적이지 않다.

가상머신과 도커의 차이