Backend/Docker

도커 알아보기

olsohee 2024. 6. 25. 16:13

하나의 컴퓨터 위에서 여러가지 응용 프로그램을 실행시키고 싶을 수 있다. 이는 운영체제도 마찬가지이다. 맥 위에서 윈도우를 실행시키고 싶을 수도 있고, 반대로 윈도우 위에서 리눅스를 실행시키고 싶을 수도 있다. 동시에 여러가지를 실행시키는 가장 단순한 방법으로, 하드웨어를 여러 개 사서 하나에 하나씩 돌리는 무식한 방법이 있다. 그러면 하드웨어에 상관없이 하나의 하드웨어 위에 여러 개의 응용 프로그램을 돌리는 방법을 알 수 있다면 모든 것이 해결되지 않을까?

 

따라서 하나의 컴퓨터 자원을 마치 여러 개인 것처럼 가상으로 쪼개서 사용할 수 있도록 하는 가상화 기술이 필요하다.

가상화

가상화는 하나의 물리적 컴퓨터에서 다수의 독립적인 가상 시스템을 생성하고 실행할 수 있게 해주는 기술이다. 그리고 이 가상화를 통해 하나의 하드웨어 자원을 분리하고 추상화하여 여러 운영체제나 응용 프로그램이 하나의 하드웨어에서 독립적으로 실행될 수 있다.

가상 머신 vs 컨테이너 기술

가상 머신과 컨테이너는 모두 가상화 기술을 사용하여 독립적인 실행 환경을 제공하는 기술이다.

그러나 가상 머신은 위와 같이 운영체제까지 통째로 가상화한다. 그리고 각 가상 머신은 독립적인 게스트 OS가상 하드웨어(소프트웨어로 구현되어 있음)를 갖는다. 

 

그런데 각 가상 머신이 운영체제를 가지므로, 가상 머신을 부팅할 때마다 운영체제 로드(운영체제 코드가 메모리에 적재)가 발생한다. 따라서 컨테이너 기술에 비해 느리다. 그리고 각 운영체제가 메모리에 적재되기 때문에 메모리 사용량도 비교적 많다.

 

반면 컨테이너는 가상 머신에서 게스트 OS에 해당하는 부분을 들어내고, 프로세스 단위로 격리한다. 따라서 각 격리된 공간인 컨테이너 내부에는 애플리케이션을 구동하는데 필요한 라이브러리와 실행 파일만 존재하게 된다.

 

결론적으로 기존 가상 머신은 무겁고 느리지만, 컨테이너는 가볍고 빠르게 실행되며 호스트의 운영체제 커널을 공유하는 방식으로 동작한다는 것이다. 

도커

도커는 컨테이너 기술을 기반으로 애플리케이션을 격리된 환경에서 실행할 수 있게 하는 오픈 소스 플랫폼이다. 도커는 애플리케이션과 의존성들을 가볍고 독립적인 실행 환경인 컨테이너로 묶어, 어디서나 일관되게 실행할 수 있게 해준다.

도커를 사용해야 하는 이유

그렇다면 도커, 즉 컨테이너 기술을 사용해야 하는 이유는 뭘까? 컨테이너 기술을 통해 하나의 컴퓨터에서 여러 프로세스를 실행시킬 수 있다. 그런데 컨테이너 기술 없이도 하나의 컴퓨터에서 여러 프로세스를 실행시킬 수 있지 않은가? 그리고 도커를 사용하는 경우와 사용하지 않는 경우, 둘 다 여러 프로세스가 동일한 호스트 OS를 공유한다는 점이 같지 않은가?

 

그러나 도커를 사용하면 다음과 같은 이점이 있다.

  • 환경 일관성 유지
    • 도커는 애플리케이션을 독립적인 컨테이너로 패키징하여 실행하고 관리할 수 있다. 각 컨테이너는 필요한 모든 라이브러리, 종속성, 설정을 포함하므로 개발 환경, 테스트 환경, 배포 환경 간의 일관성을 유지할 수 있다.
    • 만약 도커를 사용하지 않으면, 시스템 전체에서 라이브러리나 패키지를 공유하므로, 종속성 충돌이 발생할 수 있다. 예를 들어, 여러 프로세스가 하나의 라이브러리의 각기 다른 버전을 사용한다고 했을 때, 버전 간 충돌이 발생할 수 있고 관리가 번거롭다. 
  • 자원 관리
    • 도커는 각 컨테이너 마다 CPU, 메모리, 디스크 I/O, 네트워크 대역폭 등의 자원에 대한 제한을 설정할 수 있다. 따라서 하나의 컨테이너가 과도하게 자원을 사용할 경우, 다른 컨테이너에 영향을 미치는 상황을 방지할 수 있다.
    • 만약 도커를 사용하지 않으면, 모든 프로세스가 호스트 운영 체제의 커널을 공유하므로, 프로세스 간 자원 사용이 겹칠 수 있으며, 하나의 프로세스가 과도하게 자원을 사용할 경우, 다른 프로세스의 성능에 영향을 미칠 수 있다.
  • 쉬운 배포 및 확장성
    • 도커 컨테이너는 가볍고 빠르게 실행된다. 따라서 쉽게 배포할 수 있다.
    • 또한 필요에 따라 도커 이미지를 기반으로 새로운 컨테이너 인스턴스를 생성하며 쉽게 스케일 아웃 할 수 있다.
  • 협업 용이성
    • 도커 이미지는 버전 관리가 가능하다. 따라서 개발자들은 동일 버전의 이미지를 사용하여 동일한 개발 환경에서 작업할 수 있다.

Reference

'Backend > Docker' 카테고리의 다른 글

도커 네트워크  (0) 2024.06.25
깃허브 액션, 도커, EC2, RDS를 통해 배포하기  (0) 2024.04.26
도커(Docker) 사용하기  (1) 2024.04.24