하나의 컴퓨터 위에서 여러가지 응용 프로그램을 실행시키고 싶을 수 있다. 이는 운영체제도 마찬가지이다. 맥 위에서 윈도우를 실행시키고 싶을 수도 있고, 반대로 윈도우 위에서 리눅스를 실행시키고 싶을 수도 있다. 동시에 여러가지를 실행시키는 가장 단순한 방법으로, 하드웨어를 여러 개 사서 하나에 하나씩 돌리는 무식한 방법이 있다. 그러면 하드웨어에 상관없이 하나의 하드웨어 위에 여러 개의 응용 프로그램을 돌리는 방법을 알 수 있다면 모든 것이 해결되지 않을까?
따라서 하나의 컴퓨터 자원을 마치 여러 개인 것처럼 가상으로 쪼개서 사용할 수 있도록 하는 가상화 기술이 필요하다.
가상화
가상화 기술은 하나의 물리적 하드웨어에서 여러 개의 논리적 가상 시스템을 생성하고 관리하는 기술이다. 이를 통해 하나의 물리적 하드웨어 위에서 여러 운영체제와 애플리케이션을 독립적으로 실행할 수 있다.
가상 머신 vs 컨테이너 기술
가상 머신과 컨테이너는 모두 가상화 기술을 사용하여 독립적인 실행 환경을 제공하는 기술이다. 그러나 둘의 차이는 운영체제의 가상화 유무이다.
가상 머신
가상 머신은 위 사진과 같이 운영체제까지 통째로 가상화하여, 각 가상 머신이 독립적인 게스트 OS를 갖는다. 따라서 가상 머신을 부팅할 때마다 OS를 메모리에 적재하는 시간이 걸리고, 그만큼 메모리 사용량도 많다.
가상 머신은 하이퍼바이저라는 소프트웨어 위에서 동작한다. 하이퍼바이저는 가상 머신을 생성하고 관리한느 소프트웨어로, 가상 머신들이 물리적 하드웨어 자원을 공유하도록 해준다.
컨테이너
컨테이너는 운영체제를 가상화하지 않고, 각 컨테이너가 호스트 OS를 공유한다. 따라서 가상 머신에 비해 가볍고 부팅 시간이 빠르다.
컨테이너는 컨테이너 엔진이라는 소프트웨어 위에서 동작한다. 컨테이너 엔진은 컨테이너를 생성하고 관리하는 소프트웨어로, 호스트 운영체제 커널을 활용하여 가상 환경을 생성한다.
그러면 언제 가상 머신을, 언제 컨테이너를 사용하는 것이 좋을까?
- 가상 머신: 여러 운영체제를 하나의 하드웨어에서 실행해야 하는 경우 (만약 여러 운영체제 위에서 동작해야 하는 여러 애플리케이션을, 각기 다른 하드웨어에서 실행시키면 하드웨어 자원이 많이 필요하다. 이럴 때 가상 머신을 사용하여 하나의 하드웨어에 여러 운영체제와 애플리케이션을 띄울 수 있으며, 이를 통해 하드웨어 자원을 아낄 수 있다.)
- 컨테이너: 동일 운영체제 위에서 여러 애플리케이션을 실행해야 하는 경우
도커
도커는 컨테이너 기술을 기반으로 애플리케이션을 격리된 환경에서 실행할 수 있게 하는 오픈 소스 플랫폼이다. 도커는 애플리케이션과 의존성들을 가볍고 독립적인 실행 환경인 컨테이너로 묶어, 어디서나 일관되게 실행할 수 있게 해준다.
도커를 사용해야 하는 이유
그렇다면 도커, 즉 컨테이너 기술을 사용해야 하는 이유는 뭘까? 컨테이너 기술을 통해 하나의 컴퓨터에서 여러 프로세스를 실행시킬 수 있다. 그런데 컨테이너 기술 없이도 하나의 컴퓨터에서 여러 프로세스를 실행시킬 수 있지 않은가? 그리고 도커를 사용하는 경우와 사용하지 않는 경우, 둘 다 여러 프로세스가 동일한 호스트 OS를 공유한다는 점이 같지 않은가?
그러나 도커를 사용하면 다음과 같은 이점이 있다.
- 환경 일관성 유지
- 도커를 사용하지 않으면, 각 애플리케이션이 필요로 하는 라이브러리와 패키지가 호스트 시스템에 직접 설치된다. 따라서 만약 애플리케이션 1이 자바 8을 사용하고 애플리케이션 2가 자바 11을 사용하는 경우, 두 버전 모두 호스트 시스템에 설치해야 하고, 버전 충돌이 일어나거나 이를 관리하는 것이 어렵다.
- 도커를 사용하면, 각 애플리케이션이 필요로 하는 라이브러리와 패키지가 컨테이너에 존재하게 된다. 따라서 각 컨테이너는 더욱 독립된 환경에서 실행될 수 있고, 컨테이너마다 환경이 항상 동일하게 유지될 수 있다. (도커는 각 애플리케이션의 실행 환경을 컨테이너 이미지로 패키징한다. 도커 이미지에는 자바 런타임 환경, 스프링부트 애플리케이션 등의 모든 의존성이 포함된다. 즉, 필요한 것이 이미지에 포함되어 있어서 호스트 시스템에 추가 설치할 필요가 없다.)
- 자원 관리
- 도커를 사용하지 않으면, 모든 프로세스가 호스트 운영 체제의 커널을 공유하므로, 프로세스 간 자원 사용이 겹칠 수 있으며, 하나의 프로세스가 과도하게 자원을 사용할 경우, 다른 프로세스의 성능에 영향을 미칠 수 있다.
- 도커는 각 컨테이너 마다 CPU, 메모리, 디스크 I/O, 네트워크 대역폭 등의 자원에 대한 제한을 설정할 수 있다. 따라서 하나의 컨테이너가 과도하게 자원을 사용할 경우, 다른 컨테이너에 영향을 미치는 상황을 방지할 수 있다.
- * 컨테이너 기술은 각 컨테이너가 하나의 호스트 운영체제를 공유하기 때문에 하나의 애플리케이션에서 발생한 문제가 다른 애플리케이션에 영향을 줄 수 있다. 예를 들어, 하나의 컨테이너가 CPU, 메모리, I/O 등 시스템 리소스를 과도하게 사용하면, 같은 호스트 운영체제 위에서 동작하는 다른 컨테이너들이 사용할 수 있는 리소스가 줄어들어 성능 저하가 발생할 수 있다. 따라서 각 컨테이너마다 자원에 대한 설정을 해주는 것이 좋다.
- 도커 이미지 → 확장성, 협업 용이성
- 도커 이미지를 기반으로 새로운 컨테이너 인스턴스를 생성하며 쉽게 스케일 아웃 할 수 있다.
- 도커 이미지는 버전 관리가 가능하다. 따라서 개발자들은 동일 버전의 이미지를 사용하여 동일한 개발 환경에서 작업할 수 있다.
Reference
'Backend > Docker' 카테고리의 다른 글
도커 네트워크 (0) | 2024.06.25 |
---|---|
깃허브 액션, 도커, EC2, RDS를 통해 배포하기 (0) | 2024.04.26 |
도커(Docker) 사용하기 (1) | 2024.04.24 |