DevOps/Docker

[Docker] 기초 시리즈 (1) 도커의 개념과 사용이유

유자맛바나나 2021. 12. 15. 02:02

 

[도커 기초 시리즈 포스팅]

[Docker] 기초 시리즈 (1) 도커의 개념과 사용이유 (Now)

[Docker] 기초 시리즈 (2) Ubuntu에 도커 엔진 설치

[Docker] 기초 시리즈 (3) 이미지와 컨테이너 관계, 도커 아키텍처

[Docker] 기초 시리즈 (4) 도커 이미지의 구조

[Docker] 기초 시리즈 (5) 도커 이미지 다루기 - Docker Hub(Registry)

[Docker] 기초 시리즈 (6) 도커 이미지 다루기 - 이미지 직접 생성

[Docker] 기초 시리즈 (7) 자주 사용하는 Dockerfile 명령어

[Docker] 기초 시리즈 (8) 자주 사용하는 도커 명령어 모음

[Docker] 기초 시리즈 (9) 도커 컨테이너 - 개념, 기본 사용법

[Docker] 기초 시리즈 (10) 도커 컨테이너 - Volume 관리

 

 

 도커(Docker) 정의: 컨테이너 기반 가상화 도구

도커(Docker)는 리눅스의 응용 프로그램들을 프로세스 격리 기술들을 사용해 컨테이너로 실행하고 관리하는 오픈 소스 프로젝트이다.

도커 웹 페이지의 기능을 인용하면 다음과 같다: 도커 컨테이너는 일종의 소프트웨어를 소프트웨어의 실행에 필요한 모든 것을 포함하는 완전한 파일 시스템 안에 감싼다. 여기에는 코드, 런타임, 시스템 도구, 시스템 라이브러리 등 서버에 설치되는 무엇이든 아우른다. 이는 실행 중인 환경에 관계 없이 언제나 동일하게 실행될 것을 보증한다.

*출처: 위키피디아

 

 컨테이너란?

일반적으로 컨테이너라 하면 '리눅스(Linux) 컨테이너 기술'을 의미한다. 보통 컨테이너라는 용어는 도커와 함께 '도커 컨테이너'라는 용어로 처음 접하게 되어 도커에서만 사용되는 고유명사로 오해하기 쉽다.

즉, 도커는 리눅스 컨테이너 기술을 이용한 플랫폼임을 알아두고, 리눅스 컨테이너 기술에 대해 간단히 살펴본 뒤 도커에서 사용하는 컨테이너에 대해 알아보자. 

 

1) 리눅스 컨테이너 기술

더보기
  • 리눅스 컨테이너는 OS 수준의 가상화 기술이다
    • 가상화 기술1: VM(Virtual Machine)
      Host OS에서 독자적인 시스템 환경을 구축하는 기술을 가상화라 한다. 가상화 방법의 한 가지로 하이퍼바이저(Hypervisor)를 이용해 하드웨어 리소스를 나눠 가상의 OS(Guest OS)를 띄워 독자 시스템 환경을 구축한 가상머신(VM: Virtual Machine)이 있다. 이를 Application 수준의 가상화라 부른다.
    • 가상화 기술2: 리눅스 컨테이너
      프로세스를 기존 시스템에서 격리해 독자 시스템 환경을 구축하는 'OS 수준'의 가상화 기술이다. Application 수준의 가상화와 주요 차이점은 리눅스 커널을 공유해 VM처럼 별도의 Guest OS를 설치할 필요가 없고, 하이퍼바이저 역시 필요 없어 실행속도가 빠르고 성능 손실이 거의 없다.
  • 컨테이너는 프로세스를 격리시켜준다
    Host OS에게 컨테이너는 하나의 프로세스로 인식되지만, 컨테이너 관점에서는 리눅스 운영체제를 제외하고 다른 모든 프로그램들은 독립적인, 새로운 환경에서 실행되도록 만들 수 있다. 즉, 컨테이너가 하나의 가상머신(VM)처럼 작동하는 것이다.
    이러한 독립적인 환경은 리눅스 커널 기술 cgroup, namespace를 통해 가능하다.
    • cgroup(컨트롤 그룹): 가상화 머신 없이 CPU, 메모리와 같은 리소스를 격리시키고 관리한다 (구글 개발)
    • namespace: 프로세스 트리, 네트워크 파일 시스템 등을 wrapping해 해당 프로세스의 전용 자원처럼 보이도록 한다
  • 이식성: 컨테이너는 옮길 수 있다
    컨테이너는 컨테이너 런타임 환경에서 실행될 수 있다. 따라서 컨테이너 런타임 환경을 지원하는 어떠한 리눅스 서버에 컨테이너를 옮겨 똑같이 실행할 수 있다
  • 컨테이너는 여러 개를 띄울 수 있다
    프로세스를 여러 개 실행할 수 있듯이 컨테이너 역시 여러 개 띄워 독립적인 가상 환경을 만들 수 있다.
    예) 파이썬 컨테이너, 자바 컨테이너, Node.js 컨테이너 등
  • 최초의 리눅스 컨테이너 기술을 활용한 컨테이너 런타임: LXC(LinuX Container)
    주의할 점은 cgroup, namespace 등을 통한 가상화 기술인 '컨테이너 기술'과 '컨테이너 런타임'을 혼동해선 안된다. 컨테이너 런타임은 컨테이너를 실행할 수 있는 플랫폼이다. LXC와 도커는 각각 '컨테이너 기술'을 이용해 만든 자체 컨테이너와 컨테이너 런타임을 제공하는 플랫폼에 해당한다.

 

2) 도커 컨테이너(Docker Container)

최초 도커는 단일 애플리케이션 LXC 컨테이너를 구축하기 위한 오픈소스 프로젝트로 시작됐지만, 이후 자체 컨테이너 런타임 환경으로 발전했다. 도커 컨테이너도 기본적으로 cgroup과 namespace 바탕의 리눅스 컨테이너 기술을 구현한 것이다. 

 

도커 컨테이너의 특징

  • 도커는 리눅스에서만 사용할 수 있다
    도커는 리눅스 커널 기반으로 실행되기 때문에 리눅스 환경에서만 구동할 수 있다. 따라서 배포서버는 보통 리눅스 OS에 도커를 셋업해서 운영하고, Windows와 Mac OS에서 도커를 구동할 땐 VM(Virtual Machine)에 리눅스를 올려 구동한다.
  • 도커 컨테이너는 단일 프로세스로 실행된다
    애플리케이션 환경이 웹 서버, DB, WAS 등 N개의 프로세스로 구성된다면, 각각 별도의 프로세스를 갖는 N개의 컨테이너를 실행해야 한다. 예를 들어,
    웹 애플리케이션을 실행하기 위해선 Nginx 컨테이너(웹 서버), MySQL 컨테이너(DB), 어플리케이션 컨테이너(WAS) 등이 필요하다.
    이런 단일 프로세스로 인해 업데이트 등 변경에 유연해진다. 예를 들어 웹 서버를 업데이트 하는데 DB를 종료할 필요가 없다. 이러한 구조는 MSA를 구축하기 위한 효율적인 아키텍처이기도 하다.

    [참고] Nginx, MySQL 등 하나의 컨테이너에 넣을 수 있지 않나?
    하나의 컨테이너에 Nginx, MySQL, 어플리케이션 등을 전부 설치해 사용할 수 있다. 하지만 이럴 경우 해당 컨테이너에 장애가 발생할 경우 모든 서비스가 중단될 수 있기 때문에 바람직하지 않다.

  • 이식성
    도커는 네트워킹, 스토리지, OS 세부 요소를 애플리케이션에서 추상화한다. 즉, 도커에서 애플리케이션은 특정 PC 환경의 네트워킹, 스토리지, OS 요소 등의 세팅으로부터 독립적일 수 있다는 뜻이다. 그렇기 때문에 도커 컨테이너를 타 PC 환경으로 옮기더라도 도커는 애플리케이션의 환경이 동일하게 유지되도록 보장한다.

도커 아키텍처

 

 

 도커를 사용하는 이유: "환경 분리"

1) Environment disparity problem 극복

  • 직역하자면 환경 차이 문제를 극복한다는 뜻이다. OS 차이, DB 버전 차이, 각종 Configuration 등 PC 마다 환경이 달라 동일한 Application 코드가 작동할수도 있고, 작동하지 않을수도 있다.
  • 도커 컨테이너의 뛰어난 이식성 덕분에 어떠한 PC 환경에서든 도커는 애플리케이션의 환경이 동일하도록 만들어준다. 즉, Environment display problem을 극복할 수 있다.
  • 가장 큰 이점은 도커를 통해 개발자의 로컬 개발 환경과 애플리케이션을 배포할 운영 서버의 환경을 동일하게 구축할 수 있다는 것이다. 개발자는 개발이 완료된 코드를 컨테이너에 wrapping해서 바로 운영 서버에 배포할 수 있다. 환경이 동일하므로 Application은 문제없이 작동한다.

도커 사용 전 환경 차이 문제 발생
도커 사용으로 Application 구동 환경 통일

 

 

2) Scale-Out과 MSA 아키텍처와 찰떡궁합

Scale-up과 Scale-out

  • 한 개의 서버가 독립적인 여러 개의 컨테이너를 가질 수 있다는 것은 여러 개의 Application을 탄력적으로 운영할 수 있다는 뜻이다. 따라서, 특정 Application의 Traffic이 증가할 경우 해당 Application 컨테이너를 늘려 대응할 수 있다.

 

 

 

 

Reference

https://www.redhat.com/ko/topics/containers/whats-a-linux-container

https://www.itworld.co.kr/news/105426

https://www.44bits.io/ko/keyword/linux-container#lxc

https://ko.wikipedia.org/wiki/LXC

https://tecoble.techcourse.co.kr/post/2021-07-30-lxc-container/