강좌 강좌
컨테이너 입문: 실행에 필요한 파일을 갖춘 격리된 프로세스
여러 프로그램을 한 컴퓨터에서 실행하다 보면 각 프로그램이 필요로 하는 버전이 서로 충돌하는 일이 생긴다. 이 강좌는 컨테이너가 이런 의존성 문제를 어떤 구조로 다루는지, 그리고 가상 머신과 무엇이 다른지 차근차근 설명한다.
한 문장으로 이해하기
컨테이너는 애플리케이션의 각 구성 요소를 격리된 프로세스로 실행하는 방식이다. 여기서 격리란 컨테이너가 호스트, 즉 컨테이너를 실행하는 컴퓨터와 다른 컨테이너에 미치는 영향을 줄이도록 분리하는 것을 말한다.
이 강좌의 학습목표는 세 가지다. 첫째, 컨테이너가 무엇인지 자기 말로 설명할 수 있다. 둘째, 컨테이너와 가상 머신이 커널을 사용하는 방식의 차이를 구별할 수 있다. 커널은 운영체제의 핵심 구성 요소로, 뒤에서 그 역할의 차이를 자세히 살펴본다. 셋째, 컨테이너가 적합한 조건과 출처에서 확인할 수 있는 구조적 한계를 구분할 수 있다. 사전지식으로는 프로그램을 실행한다는 것이 무엇인지, 그리고 컴퓨터의 기본 동작을 관리하는 소프트웨어인 운영체제(OS)가 무엇인지 정도만 알면 충분하다.
왜 필요한가
하나의 컴퓨터에서 여러 애플리케이션을 실행하면 문제가 생길 수 있다. 각 애플리케이션이 필요로 하는 의존성, 즉 실행에 필요한 다른 프로그램이나 파일의 버전이 서로 다를 수 있기 때문이다. 컴퓨터에 미리 설치된 프로그램에 모든 애플리케이션이 기대는 구조라면, 버전 하나를 바꿀 때 다른 애플리케이션이 영향을 받는다.
컨테이너는 이 문제를 다루기 위해 각 구성 요소가 실행에 필요한 파일과 의존성을 스스로 갖추게 한다. 그래서 호스트에 미리 설치된 의존성에 기대지 않는다. 또 컨테이너는 격리돼 있어서 호스트와 다른 컨테이너에 미치는 영향을 줄이도록 설계돼 있다.
어떻게 이루어지는가
컨테이너로 애플리케이션을 실행하는 흐름은 다음 단계로 정리할 수 있다.
- 애플리케이션을 역할별 구성 요소로 나눈다.
- 각 구성 요소가 실행에 필요한 파일과 의존성을 자체적으로 갖추게 한다.
- 각 구성 요소를 격리된 프로세스로 실행한다.
- 각 컨테이너를 독립적으로 관리한다. 하나를 바꾸거나 삭제해도 다른 컨테이너를 따로 다룰 수 있다.
이 방식은 가상 머신(VM)과 다르다. 가상 머신은 자체 커널과 하드웨어 드라이버, 프로그램, 애플리케이션을 포함한 운영체제 전체를 갖춘 실행 환경이다. 즉 커널은 이런 운영체제 전체에 포함되는 핵심 구성 요소다. 반면 컨테이너는 실행에 필요한 파일을 갖춘 격리된 프로세스이고, 여러 컨테이너가 같은 커널을 공유한다. 커널을 공유하면 운영체제 전체를 따로 마련하는 부담 없이 더 적은 인프라로 더 많은 애플리케이션을 실행할 수 있다. 여기서 인프라란 컴퓨터나 가상 머신처럼 애플리케이션을 올려 실행하는 기반을 말한다. 두 방식은 함께 쓰일 수도 있다. 컨테이너 실행 도구를 갖춘 가상 머신 하나에서 여러 컨테이너화된 애플리케이션을 실행하는 방식이다.
하나의 예시로 따라가기
다음은 가상 예시다. 두 사람이 함께 만드는 온라인 서점 서비스가 있다고 하자. 이 서비스는 책을 찾아주는 검색 기능, 주문을 받아 처리하는 주문 기능, 주문 결과를 알려주는 알림 기능으로 나눌 수 있다.
앞의 단계를 이 서비스에 적용해 보자. 먼저 검색, 주문, 알림을 각각 별도의 구성 요소로 나눈다. 다음으로 각 구성 요소가 실행에 필요한 파일과 의존성을 스스로 갖추게 만든다. 그러면 두 사람의 컴퓨터에 설치된 프로그램 버전이 서로 달라도, 각 컨테이너는 자신이 갖춘 파일로 실행되므로 호스트의 설치 상태에 기대지 않는다. 이제 세 구성 요소를 각각 격리된 프로세스로 실행한다. 주문 컨테이너는 검색·알림 컨테이너와 독립적으로 관리할 수 있다. 하나의 컨테이너를 바꾸거나 삭제해도 다른 컨테이너를 따로 다룰 수 있기 때문이다. 그리고 개발자의 컴퓨터에서 실행한 이 컨테이너들은 데이터 센터나 클라우드에서도 같은 방식으로 실행될 수 있다.
언제 쓰고 언제 쓰지 않는가
컨테이너 도입 여부는 다음 질문으로 판단해 볼 수 있다.
- 애플리케이션의 구성 요소를 서로 격리해서 실행할 필요가 있는가?
- 여러 애플리케이션 사이의 의존성과 버전 충돌을 관리해야 하는가?
- 같은 인프라에서 더 많은 애플리케이션을 실행하고 싶은가?
이런 필요가 있는 상황이라면 컨테이너가 다루는 문제와 맞닿아 있다. 반대로 이 세 가지가 모두 필요하지 않은 상황이라면, 이 강좌의 출처만으로는 컨테이너 도입이 필요한지 판단하기 어렵다.
한계도 구분해서 이해해야 한다. 첫째, 컨테이너는 가상 머신과 달리 자체 커널을 포함한 운영체제 전체를 갖추지 않고 여러 컨테이너가 같은 커널을 공유하는 구조다. 이 구조적 차이가 컨테이너의 특성을 결정한다. 둘째, 격리는 호스트와 다른 컨테이너에 미치는 영향을 줄이도록 하는 것이지, 모든 영향을 없앤다고 보장하는 것은 아니다. 셋째, 이 강좌의 출처는 컨테이너의 기본 개념을 다루며 구체적인 실패 원인까지 설명하지는 않는다는 자료상의 한계가 있다.
핵심 정리와 확인문제
컨테이너는 애플리케이션의 구성 요소를 실행에 필요한 파일과 의존성을 갖춘 격리된 프로세스로 실행하는 방식이다. 가상 머신이 운영체제 전체를 갖추는 것과 달리 여러 컨테이너가 같은 커널을 공유하므로, 더 적은 인프라에서 더 많은 애플리케이션을 실행할 수 있다. 각 컨테이너는 독립적으로 관리할 수 있고, 개발 환경에서 실행한 컨테이너는 데이터 센터나 클라우드에서도 같은 방식으로 실행될 수 있다.
확인문제
- 컨테이너를 한 문장으로 정의하면 무엇인가?
정답·해설: 컨테이너는 애플리케이션의 구성 요소를 실행에 필요한 파일과 의존성을 갖춘 격리된 프로세스로 실행하는 방식이다. 핵심은 ‘격리된 프로세스’와 ‘필요한 파일을 자체적으로 갖춘다’는 두 가지다.
- 커널 사용 방식에서 컨테이너와 가상 머신의 차이는 무엇인가?
정답·해설: 가상 머신은 자체 커널을 포함한 운영체제 전체를 갖추지만, 컨테이너는 여러 개가 같은 커널을 공유한다. 이 차이 덕분에 컨테이너는 더 적은 인프라에서 더 많은 애플리케이션을 실행할 수 있다.
- 가상 예시의 온라인 서점은 검색·주문·알림 기능을 서로 격리해 실행하고 각 컨테이너를 독립적으로 관리하려 한다. 이 상황이 컨테이너가 적합한 조건에 해당하는지 답하고, 이 컨테이너들이 커널 사용 방식에서 갖는 구조적 한계 한 가지를 함께 설명하라.
정답·해설: 적합한 조건에 해당한다. 구성 요소를 격리된 프로세스로 실행해 서로에게 미치는 영향을 줄일 필요가 있고, 각 컨테이너를 독립적으로 관리하려는 요구가 있기 때문이다. 다만 구조적 한계로, 컨테이너는 가상 머신과 달리 자체 커널을 포함한 운영체제 전체를 갖추지 않고 여러 컨테이너가 같은 커널을 공유한다. 따라서 격리는 영향을 줄이는 것이지 모든 영향을 없앤다고 보장하는 것은 아니다.