개발자가 되고 싶은 준개발자

[도커와 쿠버네티스] 컨테이너와 도커 기본 개념 정리 본문

도커와 쿠버네티스

[도커와 쿠버네티스] 컨테이너와 도커 기본 개념 정리

준개발자 2021. 1. 2. 20:29

컨테이너의 등장 배경

규모가 있는 프로젝트를 개발할 때는 혼자서 개발하기보다는 을 이루어 일하고, 오픈소스 프로젝트를 많이 활용하여 개발의 효율성을 높인다. 그러나 오픈 소스 프로젝트는 빈번하게 버전이 업그레이드되고, 사용하는 오픈 소스가 많아질수록 오픈소스의 버전을 트랙킹하며 모든 팀원들이 동일한 환경에서 개발하기가 어려워진다. 

이러한 추세에 따라 컨테이너가 등장하게 되었다. 컨테이너는 1) 오픈 소스를 사용한 개발 생산성 향상과 2) 어플리케이션 안정성을 제공한다.


컨테이너를 사용하는 이유?

  • 인프라의 사용률 향상
    • 쿠버네티스에서 사용되는 컨테이너 기술은 애플리케이션이 정해진 서버에 돌아야 한다는 제약이 없다. 따라서 가동률이 적은 서버의 애플리케이션을 한곳에 모아 가동률을 높일 수 있다.
  • 빠른 기동 시간
    • 가상 서버나 물리 서버의 기동시간보다 빠르다 (아무래도 가상 서버나 물리 서버에는 OS가 올라가니 최초에 부팅하는 시간이 오래 걸려서 인듯 하다..)
    • 설치 작업이나 설정 작업이 줄어든다.
    • 네트워크, 볼륨을 소프트웨어 정의 오브젝트로 작성할 수 있다.
  • 불변 실행 환경 (immutable infrastructure)
    • 컨테이너에 애플리케이션 실행에 필요한 소프트웨어를 모두 포함시킬 수 있음
    • 특정 서버 환경에 대한 종속성을 배제할 수 있음
    • 개발환경과 운영 환경의 차이를 줄일 수 있음

가상 서버와의 비교

  • 가상 서버
    • 가상화 소프트웨어(하이퍼바이저;Hypervisor)를 사용하여 하드웨어를 공유. 마치 한대의 전용 서버가 있는 것처럼 작동.
    • cf) 하이퍼바이저의 예시- VMware, Xen, 버추얼 박스...
    • 가상 서버에는 OS가 올라가기 떄문에 컨테이너에 비해 무겁다
  • 컨테이너
    • 하나의 리눅스 프로세스가 마치 전용 서버에서 동작하고 있는 것 같은 분리 상태를 만들어 줌
    • 리눅스 커널의 네임스페이스컨트롤 그룹(cgroup) 기술을 기반으로 함
      • 네임스페이스: 특정 프로세스를 다른 프로세스로부터 분리시켜 같은 네임스페이스 내에서만 접근할 수 있도록 제한할 수 있음
      • 컨트롤 그룹(cgroup): 프로세스 별로 CPU 시간이나 메모리 사용량과 같은 자원을 감시하고 제한 
      • 리눅스 커널을 기반으로 하기 때문에 윈도우나 맥 환경에서 컨테이너를 돌리려면 리눅스 커널을 위한 가상 서버가 필요

도커란?

컨테이너를 얘기할 때 빠질 수 없는 것이 도커이다.

도커는 소프트웨어 개발자가 컨테이너를 이용해 개발 생산성을 높일 수 있도록 컨테이너를 작성(Build), 이동(Ship), 실행(Run)할 수 있는 기능을 제공한다. (Docker DE 17.12 버전에서는 이미지 보관 및 전송, 컨테이너 실행, 볼륨과 네트워크 연결과 같은 컨테이너 라이프 사이클을 호스트에서 관리할 수 있다.)

도커 로고

도커의 로고는 고래의 등에 선박용 컨테이너가 쌓인 모양이다. 다양한 화물을 컨테이너에 담아서 하나의 배로 옮기는 것은 도커를 사용해 다양한 워크로드를 하나의 서버에서 운영하는 것과 매우 비슷하다. (각기 다른 버전의 오픈소스를 사용하는 워크로드를 하나의 서버에서 돌릴 수 있다는 점이 참 대단한 것 같다..)

아키텍쳐

도커 아키텍쳐

  • 데몬
    • 도커 커맨드(클라이언트)의 명령을 받아들여 도커 오브젝트인 이미지, 컨테이너, 볼륨, 네트워크 등을 관리
  • 클라이언트 (도커 커맨드)
    • 컨테이너를 조작하는 커맨드 라인 유저 인터페이스
    • 도커 API를 사용하여 도커 데몬에 요청을 보냄
    • 도커 커맨드 예시
      • docker build : 베이스 이미지에 기능을 추가해 새로운 이미지를 만들때 사용
      • docker pull : 레지스트리에서 이미지를 로컬에 다운로드할 때 사용 
      • docker run : 이미지를 바탕으로 컨테이너를 실행 
  • 이미지 
    • 컨테이너를 기동하기 위한 실행 파일과 설정 파일의 묶음
      • 대부분의 이미지는 다른 이미지에 기반하여 만들어진다. 기반 이미지와 설치 스크립트 등을 Dockerfile에 기재하여 빌드한다.
      • 'docker run' 명령어를 통해 이미지는 컨테이너로 변환되어 하나의 인스턴스가 됨.
      • 컨테이너를 실행하면 이미지에 담긴 미들웨어나 애플리케이션이 설정에 따라 기동

이미지와 컨테이너

  • 컨테이너
    • 프로세스이면서 프로세스 아닌 무엇 
      • 리눅스의 네임스페이스와 컨트롤 그룹(cgroup)을 통해 다른 프로세스들과 완전히 분리되어 실행되는 프로세스
      • 정지된 상태로도 관리됨. '실행 가능한 이미지의 인스턴스'.
    • 컨테이너는 정지시켰다가 재기동시킬 수 있다. 그러나 정지 전에 할당되었던 IP 주소가 유지되지 않는다
  • 도커 레지스트리
    • 컨테이너의 이미지가 보관되는 곳. 리포지터리를 여러 개 가지는 보관 서비스.
    • 도커 허브: 데이터베이스, 웹 서버, 애플리케이션 등 다양한 이미지가 등록된 저장소
      • 도커는 기본으로 도커 허브에 있는 이미지를 찾도록 설정되어 있음. 
        • 'docker run hello-world'를 실행하면 공개 레지스트리인 도커 허브에 등록된 hello-world 이미지를 다운받아 컨테이너로 실행한다.
      • CI/CD 도구인 젠킨스도 도커 허브에 등록되어 있어 이미지를 다운받으면 특별한 설치없이 젠킨스 서버를 바로 기동할 수 있다. 'docker pull' 명령어로 로컬에 이미지를 다운로드 할 수 있다. 'docker run' 명령어를 사용하면 젠킨스의 컨테이너가 실행되어 웹 대시보드에 접속할 수 있는 상태가 된다.

참조

타카라 마호 저/이동규 역, <15단계로 배우는 도커와 쿠버네티스>, 제이펍, 2020.10.12.

docs.docker.com/get-started/overview/

 

Docker overview

 

docs.docker.com

stackoverflow.com/questions/21498832/in-docker-whats-the-difference-between-a-container-and-an-image