Docker - 도커란 무엇인가

업데이트:


Docker

도커란 무엇인가

개발 환경에서 당연하게 사용해왔던 도커 컨테이너 기술에 대해 이해하고, 왜 도커를 사용하는지 알아보자.

개요

  • 도커의 개념과 사용하는 이유 그리고 도커의 특징에 대해 이해한다.

소개 및 배경

  • 도커는 컨테이너 기반의 오픈소스 가상화 플랫폼이다.
  • 다양한 이유로 계속 바뀌는 서버 환경과 개발 환경 문제를 해결하기 위해 등장했다.
    • 툴 업데이트, 회사의 툴 사용 변경, 회사의 언어 정책 변경 등
  • 기존에 서버와 개발 환경이 변경되면 컴퓨터 셋팅(개발 환경) 등을 다시하거나 그 과정에서 발생하는 문제들과 같이, 여러모로 불편한 점이 많았다.
  • 도커가 등장하고 서버관리/개발 방식이(컨테이너) 완전히 편리하게 바뀌게 된다.

사용하는 이유

  • 도커 허브에 올라온 이미지와 docker-compose.yml의 설정으로 원하는 프로그램을 편안하게 설치가 가능하다.
    • 컨테이너를 생성하여 분리된 환경에 설치하므로 제거도 쉽다.
  • 하나의 서버(로컬 호스트)에 포트만 변경하여 동일한 프로그램을 실행하기도 쉽다.
    • 도커를 사용하지 않으면 환경변수나 경로 등의 충돌로 피곤하기 그지 없다.

서버관리 방식의 변화

  • 전통적인 서버관리 방식은 아래와 같이 각 단계별로 흐름이 있었고, 각 단계가 업데이트 되거나 어떤 문제가 발생하면 전체 흐름이 중단되는 문제가 있었다.

image

  • 도커 등장 이후 어떠한 프로그램도 컨테이너로 만들 수 있다.
    • 서로 다른 프로그램이더라도 컨테이너로 규격화되었음
  • AWS, Azure, Google cloud 등 어떤 환경에서도 돌아간다.

image

  • 가상머신과 비슷하게 생각할 수 있지만 비슷한점과 다른점이 있다.
  • 가상머신처럼 독립적으로 실행되지만, 가상머신보다 빠르고 쉽고 효율적이다.
    • 도커는 컴퓨터 자원을 그대로 사용한다. (가상머신은 독립 된 메모리를 할당받는 것으로 알고 있음)

도커의 등장

  • 기존에는 서버 환경에 대해 아래와 같이 관리했다.
    • 문서화
    • 상태관리도구 (인프라를 코드로 관리)
    • 가상머신
    • 자원격리 (프로세스, 파일, 디렉토리 가상으로 분리)
      • 리눅스의 기능을 (커널 격리) 이용하여 빠르고 효율적인 서버 관리
      • 그러나 사용하기 너무 어려워 구글과 같은 고급 회사에서만 사용했음
  • 도커가 등징하며 어렵고 복잡했던 기술을 사용하기 쉽게 만들었다.
    • 컨테이너 : 격리된 환경에서 작동하는 프로세스
    • 리눅스 커널의 여러 기술을 활용
    • 하드웨어 가상화 기술보다 가벼움
    • 이미지 단위로 프로세스 실행 환경을 구성

도커의 특징

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

도커가 가져온 변화(정리)

  • 클라우드 이미지보다 관리하기 쉽다.
  • 다른 프로세스와 격리되어 가상머신처럼 사용하지만 성능 저하가 거의 없다.
  • 복잡한 기술(namespace, cgroups, network, …)을 몰라도 사용할 수 있다.
  • 이미지 빌드 기록이 남는다.
  • 코드와 설정으로 관리하여 재현 및 수정 가능하다.
  • 오픈소스이므로 특정 회사 기술에 종속적이지 않다.

쿠버네티스와 도커(컨테이너) 관리

  • kubernetes
    • 다수의 서버와 다수의 서비스를 관리하기 쉽게하기 위한 컨테이너 관리 툴이다.
    • 쿠버네티스에서 여러개의 실행되고있는 도커를 관리한다고 생각하면 된다.
  • 스케줄링
    • 컨테이너를 적당한 서버에 배포해 주는 작업
    • 여러 대의 서버 중 가장 트래픽이 적은 서버에 배포하거나, 순차적으로 배포 또는 랜덤 배포 등 설정이 가능
    • 컨테이너 개수를 여러 개로 늘리면 적당히 나눠 배포하고, 서버가 죽으면 실행 중이던 컨테이너를 자동으로 다른 서버에 띄워줌
  • 클러스터링
    • 여러 개의 서버를 하나의 서버처럼 사용
    • 작게는 몇 개 안되는 서버부터 많게는 수천 대의 서버를 하나의 클러스터로
    • 여기저기 흩어져 있는 컨테이너도 가상 네트워크를 이용하여 마치 같은 서버에 있는 것처럼 쉽게 통신
  • 서비스 디스커버리
    • 서비스를 찾아주는 기능(서버끼리의 연결을 하려면 해당 서버가 어디 떠있는지 알아야 하고, 이를 도커 컨테이너 이름으로 손쉽게 찾아줌)
    • 클러스터 환경에서 컨테이너는 어느 서버에 생성될지 알 수 없고, 다른 서버로 이동 할 수도 있음
    • 따라서 컨테이너와 통신을 하기 위해서 어느 서버에서 실행중인지 알아야 하고, 컨테이너가 생성되고 중지될 때 어딘가에 IP와 Port 같은 정보를 업데이트 해줘야 함
    • key-value 스토리지에 정보를 저장할 수 있고, 내부 DNS 서버를 이용

Reference

댓글남기기