CiCd-DevOps/DOKER

Docker 기초 정리

KoTiv 2022. 5. 16. 11:13
반응형
SMALL
  • 시작하기에 앞서

도커를 처음 경험했던적은 현업개발자 1년차 시절 툴 검증차원에서 사용해봤었다. 이후 도커를 사용할 일이 없었지만 도커 기술에 대하여 일목묘연하게 정리하고 추후 더 깊이있게 도커에 대해 다루어 보자는 마음가짐으로 도커 오케스트레이션북을 정리해보고자 한다.

  • 컨테이너란?

컨테이너는 쉽게 말하고자 한다면 어떤 환경에서나 실행하기 위해 필요한 모든 요소를 포함한 일종의 소프트웨어 패키지라고 할 수 있다. 컨테이너는 이러한(어떤 환경에서나) 프로그램을 실행하기 위해 운영체제를 가상화하여 프라이빗한 데이터 센터에서 퍼블릭 클라우드 또는 개발자의 개인노트북에 이르는 다양한 환경에서 실행하도록 설계되어져 있다.

컨테이너는 소프트웨어 서비스를 실행하는데 필요한 특정 버전의 프로그래밍 언어 런타임 및 라이브러리와 같은 종속적인 항목과 애플리케이션 코드를 함께 포함하는 경략적인 소프트웨어 패키지이다.

즉 컨테이너는 OS수준에서 CPU, Memory, Storage, Network Resource등을 쉽게 공유하게 해주고 컨테이너가 실제 실행되는 환경에서 애플리케이션을 추상화할 수있는 논리 패키징 메커니즘이라고 볼수 있다. ( 플랫폼에 상관없이 프로그램을 실행할 수 있는 기술 )

  • 컨테이너의 장점

1. 업무 분리

컨테이너화를 통하여 각자의 롤에 따라 업무를 분리할 수 있게 됬다고 볼수 있다. 개발자는 프로그램을 개발후 컨테이너에 넣고 실행하는 것에만 집중할 수 있게 되었고 시스템관리자와 IT운영팀은 특정 소프트웨어의 배포와 관리에 더욱 집중할 수 있게 변화하게 되었다. 

2.워크로드 이동성

컨테이너화로 인하여 사실상 Linux, Windows, Mac등의 OS환경에 독립적으로 가상머신, 물리적 서버, 개발자 컴퓨터, 데이터 센터, 퍼블릭 클라우드 등 어떤 환경에서나 구동할수 있는 유연성을 얻게 되어 개발과 배포가 더 쉽게 변했다고 볼수 있다. 

3. 애플리케이션 격리기능 

컨테이너는 운영체제 수준의 CPU, Memory, Storage, Network Resource를 가상화하여 개발자에게 다른 어플리캐이션(프로그램)으로부터 논리적으로 격리된 OS환경을 제공하게 되었기 때문에 업무 효율성이 높아졌다고 볼 수 있다.

  • 컨테이너와 가상머신(Virtual Machine)의 차이점 

기본적으로 하드웨어에 대한 접근 권한을 가지는 host OS 상위에 linux , Windows와 같은 guest OS를 실행하여 구성하는 VM의 개념은 많이 사용되어 진다고 볼수 있다만 컨테이너 기술을 조사해보면 컨테이너와 가상머신과 많이 비교를 하게 된다. 가상머신은 가상머신 끼리의 최소한의 자원만을 공유할 뿐 각각의 가상머신은 개별적으로 자원을 할당받아 사용된다. 이러한 가상머신의 특징은 각각의 가상머신을 독립적으로 만들어주지만 최소한의 파일공유문제 조차 많은 자원의 소모와 시스템 전체가 돌아야하기 때문에 불필요 프로세스를 필요로 하게 되어 성능의 큰 overhead를 야기한다. 그러나 컨테이너와 가상머신의 유사점은 1. 프로그램(어플리케이션)을 관련 라이브러리 및 종속 항목과 함께 패키지로 묶어 소프트웨어 서비스를 위한 격리환경을 마련해준다는 유사점이 존재하지만 . 1. 컨테이너는 vm보다 경량화 되어있고 2.OS 수준에서 가상화되어있는 컨테이너와 달리 VM은 하드웨어 수준에서 가상화 되어있다 . 3. 컨테이너는 OS커널을 공유하여 VM에 필요한 것 보다 훨씬 적은 메모리를 활용하여 서비스된다는 차이점이 존재한다 .  여기서 리눅스 컨테이너화 기술인 도커를 예를 들어보자면 Docker역시 프로세스만 격리화하는 컨테이너를 구성하여 하나의 OS안에 존재하는것 처럼 보이지만 사실 OS커널을 공유하는 기술이다. 여기서 Docker는 컨테이너와 OS사이의 일부만 공유하는 AUFS(Another Unionfs)계층 파일 시스템을 사용하게 된다. 

공유하는 부분이 많아지는것은 다시말하면 컨테이너의 특징중인 하나인 격리기능이 많이 떨어질수 밖에 없다는 뜻이 되기도 한다. 하지만 namespace, cgroups같은 프로세스 격리화 기술로 최소한의 자원을 사용하며 가상머신과 같은 격리 환경을 제공할 수 있도록 도와준다.

아래의 구조는 가상머신과 컨테이너기반의 도커 컨테이너 구조를 보여준다.

가상 머신 구조 (왼쪽) 컨테이너 구조( 오른쪽)  - 도커 컨테이너는 Docker엔진을 활용하여 호스트의 자원을 다른 컨테이너와 함께 공유하지만 가상머신은 각각의 머신에 대해 시스템 전체가 동작해야하는 구조를 보여주고 있다. 

  • 도커란 무엇인가?

도커를 구성하는 가장 기본적인 컨테이너에 대한 개념을 알아보았다 앞으로 일상적으로 사용해왔던 도커에 대한 개념과 도커를 사용해야하는 이유와 특징에 대해여 정리해보고자 한다.

도커는 컨테이너 기반의 오픈소스 가상화 플랫폼으로 다양한 이유로 계속해서 바뀌는 서버 환경과 개발환경의 문제를 해결하기 위한 방법으로 등장했다. ( 언어, 툴 등의 업데이트, 회사 툴 사용의 변경, 회사 언어 정책 등등 이 이러한 일련의 예라고 볼 수 있다. ) 또한 기존에 서버와 개발환경이 변경된다면 컴퓨터 셋팅등을 다시하고 그과정에서 발생하는 이슈사항들과 같은 불편함이 매우 많았다(현업에서 일할때 진짜 너무 많았다...) 도커가 등장하고 서버관리/ 개발 방식이 편하게 바뀌었다고 하는데 활용해본적이없다.... 즉 여러 방식이 도커의 등장이후 편하게 바뀌었다고 하는데  이러한 효율성은 도커로의 환경전환이 필수불가결한 이유가 된것같다 ( 도커 허브에 올라온 이미지 및 docker-compose.yml)의 설정으로 원하는 프로그램을 편하게 설치가 가능해지고 컨테이너 생성하여 분리된 환경에서 설치하기때문에 제거 역시 용이하게 됬다는 점이다. 또한 하나의 로컬 호스트 서버에 포트만 변경하면 동일한 프로그램을 실행하기도 쉬워 졌다. 

  • 도커와 서버관리의 패러다임의 변화 

도커 이전의 서버관리 방식은 아래와 같은 흐름이 었고 흐름의 단계가 업데이트 되거나 문제가 발생하면 전체 플로우가 중단되는 문제가 발생했다.

Add user -> System Env -> Firewall -> Network -> Dependencies -> Python -> Git clone -> Package -> Configuration -> Migration -> Proxy -> Run 

( 물리적 서버를 개인이 직접 운영 -> 호스팅 서비스를 이용 -> 호스트 서버 구입 및 설치에 돈과 시간이 많이 소비됨-> 가상화 발전후 클라우드 환경으로 전환 -> 가상서버 임대-> 서버의 수가 증가 -> 개인이 환경 셋팅하기 불편해짐 -> immutable infrastructure 패러다임 발생 [ OS와 서비스 환경을 분리하여 이해하고 서비스환경을 이미지화하여 배포뒤 사용하는것을 의미함 ] 

도커의 등장이후 서로 다른 프로그램이라도 컨테이너로 규격화되어 어떤 프로그램도 컨테이너로 만들 수 있게 됬다는 장점으로 AWS, Azure, Google Cluod등의 환경에서도 컨테이너가 운영된다는 장점이 가장 강력한것 같다. 

  • 도커의 특징

가상머신은 아니고 격리기능이 있기때문에 성능상 하락이 없다고 볼수 있다 VM은 성능의 하락이 크다. 

  • 확장과 이식성
    • 어디서든 컨테이너를 실행하고 특정 회사 및 서비스에 종속적이지 않으며 쉽게 개발 서버를 만들고 테스트 서버 생산도 가능하다 .
  • 표준성
    • 도커를 사용하지 않은경우 각각의 언어로 만든 서비스들의 배포방식은 모두 달랐지만 도커는 컨테이너 표준으로 서버를 배포하기때문에 모든 서비스들의 배포과정이 동일해진다는 특징이 있다
  • 이미지
    • 컨테이너를 실행하기 위한 압축파일과 같은 개념으로 이미지에서 컨테이너를 생성하기 때문에 반드시 이미지를 만드는 과정은 필수적으로 필요하다. Dockerfile을 이용하여 이미지를 생성하고 처음부터 재현이 가능하다.
    • 빌드 서버에서 이미지를 만들고 해당 이미지를 이미지 허브에 저장후 운영서버에서 이미지를 불러와서 사용하게 된다.
  • 설정관리
    • 도커에서 설정은 보통 MYSQL_PASS=password와 같은 컨테이너를 띄울 때 환경변수를 같이 지정하여 제어하게 된다.
    • 하나의 이미지가 환경변수에 따라 동적으로 설정파일을 생성하도록 만들어져야한다.
  • 자원관리
    • 컨테이너는 삭제 후 새로 만들면 모든 데이터가 초기화되므로 저장이 필요하다면, 업로드 파일을 외부 저장소와 링크하여 사용하거나 S3같은 별도의 저장소가 필요하다.
    • 세션이나 캐시를 memcached나 redis등의 외부로 분리한다.

 

 

반응형
LIST