컨테이너 사용 배경?
부산항에서는 무역에 필요한 물동량을 컨테이너를 이용해 처리한다. 대형 트럭이 싣고 전국 구석구석 누비는 컨테이너가 존재하지 않는다면 재래식 방법으로 현재와 같은 많은 물동량을 처리하기 힘들것이다. 부산항 혹은 인천항에서 컨테이너들은 대형 화물선에 실려 해외로 수출하게 된다.
물동량 TEU?
여담이지만 전국 최대 물동량을 처리하는 대한민국 항구는 부산항이다. 1년에 2270만 TEU를 처리하고 있다. 여기서 TEU(Twenty Foot Equivalent Units)이란 20 ft (약 610cm) 사이즈이 표준 규격 컨테이너를 의미한다. 부산항에서는 1년에 이런 컨테이너를 2000만개 이상 처리한다.
지금이야 컨테이너를 사용해서 수출입 물동량을 처리하지만 과거 한국전쟁 당시만 해도 재래식 방법을 사용했다. 정리되지도 않고, 물건이 부서지기도 쉬워 보인다. 또한 물자를 싣고 내리는데 상당히 많은 시간이 소요된다.
소프트웨어 컨테이너, 도커(Docker)
소프트웨어를 개발하고 배포하면 사용자가 우리의 서비스를 이용할 수 있다. 개발자들은 수출입 물동량 처리방법을 획기적으로 개선한 컨테이너를 소프트웨어에도 사용하고자 했다. 그 결과 탄생한게 리눅스 컨테이너(lxc)다. lxc 또한 훌륭한 기술이었지만 애플리케이션을 쉽게 컨테이너화 할 수 있는 커뮤니티는 존재하지 않았다.
그리고 2013년 Docker Hub 소프트웨어 저장소 기술을 앞세운 도커(Docker)가 탄생하였고, 이제 소프트웨어 개발자들은 쉽게 어플리케이션을 컨테이너화 해서 실행할 수 있게 되었다.
개발자들은 소프트웨어 배포를 할 때 배포 시간을 줄이고, 배포에 필요한 인력을 대폭 줄일 수 있게 되었다. 또한 컨테이너방식으로 애플리케이션을 실행할 수 있게 되면서 더 이상 어플리케이션이 실행되는 환경에 구애받지 않으면서 프로그램을 실행할 수 있게 된다.
도커(Docker) 컨테이너 ?
① 의존성 문제 해결
한개의 어플리케이션을 실행하기 위해서는 프로그램을 실행할 수 있는 환경이 구축되어 있어야 한다. 예를 들어 Windows OS 환경에서 프로그램을 설치하면 .NET Framework를 설치해야 한다. 이 처럼 A 어플리케이션을 설치할 때 필요한 B 프로그램이 있다면 A는 B에 의존관계를 가진다.
여기서 문제가 발생한다. 예를 들어 A 프로그램의 버전이 8을 사용하고 있고 배포를 진행했지만 사용자의 PC에는 버전 6을 사용하고 있다면? 당연히 버전 8이 필요하다는 경고창을 띄우게 될 것이다. 즉, 사용자의 환경에서 무조건 프로그램이 실행될 수 있다는 보장을 할 수 없게 되는 것이다.
도커(Docker) 컨테이너 기술은 이러한 의존성 충돌 문제를 해결한다. 컨테이너화 된 어플리케이션은 컨테이너 내에서 어플리케이션 및 환경을 구성하기 때문에 컨테이너에서 실행되는 어플리케이션은 독립된 의존성을 포함하게 된다. 즉, 각 컨테이너들은 철저하게 실행환경을 격리하면서 의존성 문제를 해결한다.
도커 컨테이너는 크게 3가지 자원을 독립적으로 관리한다.
- 프로세스 : 특정 컨테이너 내에서 작동하는 프로세스는 기본적으로 컨테이너 내에서만 액세스 가능함. 즉 다른 프로세스에 영향을 주지 않는다.
- 네트워크 : 컨테이너마다 별도의 IP 주소가 할당된다.
- 파일 시스템 : 컨테이너 내의 파일 시스템은 구획화 되어 있다. 따라서 해당 컨테이너의 명령과 파일 액세스등을 제한하여 독립적으로 관리할 수 있다.
② 개발환경 === 배포환경
개발환경의 문제
개발자들은 한개의 어플리케이션을 개발하면서 비슷환 개발환경을 구축하기 마련이다. Node.js가 되었건, Spring이 되었건, Python Django가 되었건 어떤 프레임워크를 사용해도 비슷한 버전을 사용해야 문제 없이 공통으로 개발이 가능해지는 것이다.
여기서 새로운 개발자가 기존 프로젝트에 투입되는 상황을 가정해보자. 신규 개발자는 기존에 개발되어 왔던 어플리케이션을 실행시키기 위해서 적지 않은 난관을 넘어야 한다. 환경변수를 맞춰야 하고, 프로젝트에 투입된 모든 모듈들의 버전을 맞춰야 한다. 보통 어플리케이션에 투입된 모듈의 갯수는 1~2개가 아니기 때문에 단지 실행하는데에만 해도 꽤 많은 리소스가 투입된다.
이 상황에서 도커는 깔끔하게 문제를 해결한다. 신규 개발자의 OS 환경에 상관없이 어플리케이션 실행 환경을 설정하고, 어플리케이션 개발 자체를 컨테이너 위에서 진행하면서 모든 개발자들이 동일한 환경에서 개발 진행이 가능하게 된다.
배포 환경의 문제
개발 환경에서의 문제는 어플리케이션을 배포하는 경우에도 동일하게 작용된다. 신규 개발자가 참여하냐 또는 불특정 다수의 유저가 어플리케이션을 자신의 실행환경에서 실행하냐의 차이다. 만약 사용자 입장에서 자신의 환경에서 어플리케이션을 실행하지 못한다면 바로 이탈해버릴 것이다.
이러한 배포상 문제를 해결하기 위해 Amazon Web Service(AWS)에서도 도커를 설치해서 도커 컨테이너를 EC2 서버에서 실행할 수 있게 되었다. 이제 서버의 파일들을 하나씩 배포하는 방식이 아닌 서버의 파일 전체를 컨테이너화 해서 배포를 진행하면서 배포 환경과 개발 환경을 일치시킬 수 있게 된다.
③ 수평 확장
트래픽이 엄청난 서비스를 가정해보자. Meta, Instagram, Google, Kakao 등의 서비스들은 서버를 단순히 한대만 두지 않는다. 그렇지 않으면 엄청난 트래픽을 감당하기 위해서 수직적인 서버 확장을 진행해야 하며, 예외 상황에 적절히 대처하기 힘들것이다.
트래픽을 분산하기 위해 프록시 서버를 운영한다. 프록시 서버란 간단하게 말해서 메인 서버에 사용자를 연결해주는 중개자 역할을 하는서버다. 프록시 서버는 사용자들을 여러 서버 중 하나에 연결해준다. 이를 로드 밸런서라고도 한다.
도커 컨테이너를 사용하면 실행환경을 일치시킬 수 있다. 또한 트래픽이 아무리 증가해도 이를 감당할 수 있다. 동일한 어플리케이션 구성(이미지)를 토대로 새로운 서버에 해당 어플리케이션을 컨테이너로 실행하고 로드 밸런서에 이 서버를 추가하면 그만이다. AWS는 서버를 생성하고 삭제하는 일을 자동으로 처리해주기 때문에 배포 환경이 혁신적으로 간단해진다.
도커 컨테이너를 사용해서 새로운 버전의 서버를 운영중인 서버들 중 몇 대에만 테스트 운영해보는 일도 가능해진다. 도커를 사용하면 새롭게 작성된 서버의 문제를 미리 확인하고 전체 서비스에 영향을 미치지 않도록 사전조치하는 일이 가능해진다.
도커(Docker) 핵심
① 컨테이너
도커 컨테이너는 어플리케이션의 의존성 충돌 문제를 해결한다. 이게 가능한 이유는 어플리케이션을 컨테이너화 하여 네트워크 환경, 프로세스, 파일 시스템을 독립적으로 구성하기 때문이다. 즉, 어플리케이션 상자라고 볼 수 있다.
② 이미지
도커로 실행되는 모든 컨테이너들은 이미지로부터 생성된다. 도커는 어플리케이션 실행에 필요한 구성파일과 어플리케이션 파일을 함께 담아놓은 템플릿을 이미지라 한다. 이미지를 이용해 바로 컨테이너를 생성할 수 있게 된다.
도커 이미지를 활용하면 다수의 컨테이너를 바로 만들 수 있다. 서버에 트래픽이 몰리는 경우 메모리나 cpu 성능을 업그레이드할 필요없이 서버의 수평 확장이 가능해진다. 또한 기본 이미지로 부터 변경 사항을 add/commit해서 새로운 이미지를 생성할 수 있다.
③ 레지스트리
이미지가 저장되는 공간이다. 대표적인 이미지 레지스트리로 Docker Hub 혹은 Amazon ECR이 있다. 도커 CLI로 이미지를 사용해 컨테이너를 생성하면, 호스트 PC에 이미지가 존재하지 않으면 기본 레지스트리에서 이미지를 다운받게 된다.
도커 vs 가상머신(Virtual Machine) 차이점
도커(Docker)는 독립된 실행환경 위에서 어플리케이션 실행을 보장한다는 측면에서 가상머신(VM)가 유사한 측면이 있다. 어플리케이션 마다 다른 PC에서 실행되는 환경을 보장하기 위해 IP, Port 등을 다르게 설정하고 환경을 독립적으로 구성할 수 있다는 점에서 같은 점을 가진다.
도커 VS 가상머신 차이
- 도커는 가상머신이 제공하는 레벨의 리소스 격리성을 제공하지 않는다.
- 도커는 리눅스 컨테이너를 이용한 기술로 OS 위에 다른 OS를 실행시키는 가상 머신보다 좋은 성능을 보여준다.
- 가상머신은 애플리케이션에 대한 환경 격리성에 집중하는 반면 도커는 컨테이너를 사용해 개발자, 사용자 커뮤니티에 집중한다.
도커(Docker)
가상 머신(Virtual Machine)
Reference
'Programming' 카테고리의 다른 글
[Database] sequelize node.js mysql example 간단 예제 (0) | 2022.06.12 |
---|---|
[Docker] Node.js Dockerfile로 배포 하는 방법 (0) | 2022.06.12 |
[Docker] Ubuntu 우분투 20.04 LTS 도커 설치 방법 (0) | 2022.06.10 |
[Security] OAuth 2.0란? ( 개념 + 인증방식 ) (0) | 2022.06.09 |
[Algorithm] 삽입 정렬(insert sort) Javascript 구현하기 (0) | 2022.06.09 |
댓글