본문 바로가기
Back-End/Cloud

[Docker] 컨테이너(Container)

by 달의 조각 2022. 10. 5.

Docker

  도커는 컨테이너 기반의 오픈소스 가상화 플랫폼이다. 다양한 프로그램, 실행 환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순하게 해 준다. 백엔드 프로그램, 데이터베이스 서버, 메시지 큐 등 어떤 프로그램도 컨테이너로 추상화할 수 있고 조립 PC, AWS, Azure, Google Cloud 등 어디에서든 실행할 수 있다.

어떤 애플리케이션은 실행을 위해 다른 환경(운영체제 등)이 요구된다. 컨테이너 기술은 이러한 문제를 해결한다. 애플리케이션을 컨테이너 내에 구성하도록 하고 서로 의존성을 공유하지 않도록 한다. 가상 머신 수준의 높은 격리성으로 하나의 컴퓨터에 서로 다른 버전의 동일한 애플리케이션을 설치할 수 있다.

  • 의존성을 가진다: 프로그램 A의 실행에 B가 반드시 필요할 때
  • 의존성이 충돌한다: 프로그램 B와 C의 실행에 서로 다른 버전의 A가 필요할 때

아래는 각 컨테이너가 독립적으로 가지는 자원이다.

  1. 프로세스
  2. 네트워크: 컨테이너당 하나의 IP 주소 할당
  3. 파일 시스템

 

1. 개발과 배포 환경 일치

  개발 환경을 구축하려면 적지 않은 시간이 소모된다. 이는 배포에서도 마찬가지이다. 도커는 이러한 문제를 해결한다. 하나의 명령어로 어떤 운영체제든 특정 애플리케이션을 설치하고 실행할 수 있다.

  • OS에 상관없이 한 번에 애플리케이션 실행 환경을 만들 수 있다.
  • 개발을 컨테이너 위에서 진행하면 모든 개발팀이 동일한 환경에서 개발을 진행할 수 있다.

 

2. 쉬운 수평 확장

https://www.wisdomgeek.com/development/software-architecture/load-balancing-and-its-different-types/

  서비스 제공자들은 트래픽 분산을 위해 프록시 서버를 운영한다. 프록시 서버는 여러 대의 서버 중 한 군데를 이용할 수 있도록 돕는다. 이러한 서버를 리버스 프록시의 한 종류인 로드 밸런서라고 한다.

 

3. 새로운 내용을 쉽게 서버에 배포하기

  컨테이너의 큰 장점은 실행 환경 일치이다. 서버 증설에 컨테이너 기술이 활용된다. 동일한 애플리케이션 구성(이미지)을 바탕으로 새로운 서버에 해당 애플리케이션을 컨테이너로 실행하고, 로드 밸런서에 이 서버를 추가하면 된다. (심지어 AWS는 서버를 만들고 삭제하는 일을 자동으로 해 준다.)

이를 응용해서 새로운 버전의 애플리케이션을 여러 서버 중 몇 대만 운영하여 테스트하는 방법도 가능하다. 쿠버네티스와 같이 "오케스트레이션 도구"라고 부르는 것들이 이러한 일을 해 준다.

https://jennifersoft.com/ko/blog/tech/2022-02-22/

 


 

컨테이너

  실행 환경에 구애받지 않고 애플리케이션을 실행할 수 있는 기술이자 격리된 공간에서 프로세스가 동작하는 기술이라고 할 수 있다. 무역항에서 컨테이너를 싣고 이동하는 모습을 상상해 보자. 컨테이너는 물자를 싣고 내릴 때의 시간을 단축해 주며, 인력 또한 감소시켜 줌으로써 물자 수송에 큰 도움을 주었다. 이를 소프트웨어 배포에 적용하여 리눅스 컨테이너가 만들어졌고, 이는 도커(Docker)와 소프트웨어 저장소 Docker Hub(레지스트리)까지 발전해 왔다.

  가상화 기술의 하나지만 기존의 방식과는 차이가 있다. 기존의 가상화 방식은 주로 OS를 가상화했다. 가상머신은 호스트 OS 위에 게스트 OS 전체를 가상화해서 사용하는 방식이다. 여러가지 OS를 가상화할 수 있고, 사용법이 간단하지만 무겁고 느려서 운영 환경에서는 사용할 수 없었다.

이를 극복하기 위해 CPU의 가상화 기술을 이용한 KVM와 반가상화 방식의 Xen이 등장했다. 이는 게스트 OS가 필요하긴 하지만 전체 OS를 가상화하는 방법은 아니었기 때문에 호스트형 가상화 방식에 비해 성능이 향상됐다. 이는 OpenStack이나 AWS, Rackspace 같은 클라우드 서비스에서 가상 컴퓨팅 기술의 기반이 되었다.

가상머신과 도커

  전가상화든 반가상화든 추가적인 OS를 설치해서 가상화하는 방법은 어찌됐든 성능 문제가 있었기에 이를 개선하기 위해 프로세스를 격리하는 방법이 등장했다. 단순히 프로세스를 격리시키기 때문에 가볍고 빠르게 동작하며, CPU나 메모리는 딱 프로세스가 필요한 만큼만 추가로 사용하고 성능적으로도 거의 손실이 없다.

서버에 여러 개의 컨테이너를 실행하면 서로 영향을 미치지 않고 독립적으로 실행돼서 마치 가벼운 VM을 사용하는 느낌이다. 실행 중인 컨테이너에 접속하여 명령어를 입력할 수 있고, 패키지를 설치할 수 있으며 사용자도 추가하고 여러 개의 프로세스를 백그라운드로 실행할 수도 있다. CPU나 메모리 사용량을 제한할 수 있고 호스트의 특정 포트와 연결하거나 호스트의 특정 디렉토리를 내부 디렉토리인 것처럼 사용할 수도 있다. 새로운 컨테이너를 만드는 게 걸리는 시간은 1-2초로, 가상머신과 비교할 수 없이 빠르다.

 


 

이미지(Image)

 

 

  이미지는 컨테이너 실행에 필요한 파일과 설정 값 등을 포함하고 있는 것으로, 상태값을 가지지 않고 변하지 않는다. 컨테이너는 이미지를 실행한 상태라고 볼 수 있고, 추가되거나 변하는 값은 컨테이너에 저장된다. 하나의 이미지로 여러 개의 컨테이너를 생성할 수 있다.

예로 MySQL 이미지는 debian을 기반으로 MySQL을 실행하는 데 필요한 파일과 명령어, 포트 정보 등을 가진다. 이미지는 컨테이너 실행을 위한 모든 정보를 가지고 있기 때문에 더 이상 의존성 파일을 컴파일 하고 설치할 필요가 없다. 새로운 서버가 추가되면 미리 만들어 놓은 이미지를 다운받고 컨테이너를 생성만 하면 된다. 한 서버에 여러 개의 컨테이너를 실행할 수 있고, 여러 서버도 문제 없다.

 


 

🍎 레이어 저장 방식

  도커 이미지는 컨테이너 실행을 위한 모든 정보를 담기 때문에 용량이 수백메가에 이른다. 처음 이미지를 다운받을 때는 부담이 되지 않지만, 기존 이미지에 파일 하나를 추가했다고 수백메가를 다시 다운받는 것은 비효율적이다.

도커는 이런 문제를 해결하기 위해 레이어(Layer)라는 개념을 사용한다. 유니온 파일 시스템을 이용하여 여러 개의 레이어를 하나의 파일 시스템으로 사용할 수 있게 한다. 이미지는 여러 개의 읽기 전용 레이어로 구성되고 파일이 추가되거나 수정되면 새로운 레이어가 추가된다. 예를 들어 ubuntu 이미지를 베이스로 만든 nginx 이미지가 A + B + C + nginx로 구성될 때, nginx 소스를 수정하면 A, B, C를 제외한 새로운 nginx(v2) 레이어만 다운받으면 되는 것이다.

컨테이너를 생성할 때에도 레이어 방식을 사용한다. 기존의 이미지 레이어 위에 읽기/쓰기 레이어를 추가한다. 이미지 레이어를 사용하면서 컨테이너가 실행 중에 생성하는 파일이나 변경 내용은 읽기/쓰기 레이어에 저장되므로 여러 컨테이너를 생성해도 최소한의 용량만 사용한다.

 


📚 Reference

'Back-End > Cloud' 카테고리의 다른 글

운영 전략  (0) 2022.10.11
[Docker] 이미지 다루기  (0) 2022.10.05
[Docker] CLI  (0) 2022.10.05
[AWS] 서버 배포  (0) 2022.10.03
Cloud Computing, AWS  (0) 2022.09.30

댓글