✈️ 교환학생/Cloud Solution

Docker란 무엇인가

놀러와요 버그의 숲 2023. 8. 26. 16:07
728x90
반응형

정의

Docker: 어플리케이션을 패키징할 수 있는 툴.

 

왜 필요해? 

'environment disparity'를 해결해준다. ex. 서버는 리눅스인데, 내 컴퓨터는 윈도우이다.

-> Docker를 통해서 다른 머신에서도 같은 환경 구현 가능

 

  • "내 컴퓨터에서는 잘 돌아가는데..." 문제: 개발자는 종종 자신의 개발 환경에서 잘 작동하는 프로그램을 다른 환경에서 실행할 때 문제가 발생하는 상황에 직면합니다. Docker를 사용하면, '컨테이너화'된 애플리케이션은 모든 환경에서 동일하게 동작하게 됩니다.
  • 환경 설정과 의존성: 애플리케이션을 실행하기 위해 필요한 라이브러리, 의존성, 환경 설정 등을 모두 포함하는 Docker 이미지를 만들면, 다른 사람이나 다른 환경에서도 쉽게 동일한 설정으로 애플리케이션을 실행할 수 있습니다.
  • 일관성: 개발, 테스트, 프로덕션 환경 등에서 동일한 Docker 이미지를 사용함으로써, 환경 간 차이로 인한 문제를 최소화합니다.
  • 격리와 보안: 각 Docker 컨테이너는 독립적으로 실행되므로, 한 컨테이너에서 발생한 문제가 다른 컨테이너나 호스트 시스템에 영향을 미치지 않습니다. 이러한 격리는 애플리케이션 간의 충돌과 보안 문제를 줄여줍니다.
  • 리소스 효율: 전통적인 가상 머신에 비해 Docker 컨테이너는 더 적은 시스템 리소스를 사용합니다. 여러 컨테이너를 하나의 호스트에서 효율적으로 실행할 수 있기 때문에, 서버의 리소스 사용률이 향상됩니다.
  • 빠른 배포와 확장: Docker 컨테이너는 빠르게 시작되고 중지되므로, 애플리케이션을 빠르게 배포하거나 확장하는 데 유용합니다.

결론적으로, Docker 애플리케이션의 개발에서 배포까지의 과정에서 일관성, 효율성, 격리 등의 이점을 제공하여 개발자와 운영 모두에게 다양한 문제 해결을 도와줍니다.

 

 

이게 클라우드 컴퓨팅이랑 무슨 관련이야?

 

하이퍼바이저 vs 컨테이너

VM 각각의 OS 가지기 때문에 오버헤드가  큽니다.

반면 컨테이너는 호스트 OS 공유하면서도 격리된 환경에서 실행되므로  경량화되고 효율적입니다.

Hypervisor: 각각의 가상 머신이 무거운 OS(운영체제)를 포함하고 있기 때문에 시작하는데도 오래걸리고 리소스도 많이 잡아먹는다.

Container: 각각의 컨테이너가 OS를 포함하지않고, Host OS를 공유한다. 그래서 더 가볍다. 

 

 

Docker의 원리는 무엇인가?

 

컨테이너를 만든다 -> 배포한다 -> 구동한다.

 

컨테이너를 만들기 위해서는 총 3가지가 필요하다. 

 

1. Dockerfile

컨테이너를 어떻게 만들어야하는지에 관한 설명서이다. 요리 레시피와 같다. 

ex. 어플리케이션을 구동하려면 어떤 파일들이 필요한지, 어떤 프레임워크나 라이브러리를 설치해야하는지, 필요한 환경 변수, 어떻게 구동해야하는지 Script 등등

 

2. Image

애플리케이션 코드, 라이브러리, 환경 변수, 파일 등을 포함하는 불변의 스냅샷입니다. (상태를 찍어서 이미지로 만들어둔다) 

클래스와 유사하다.

 

3. Container

이미지를 고립된 환경에서 실행시키는 것을 말한다. 컨테이너 안에서 어플리케이션이 동작한다. 

 

컨테이너화란 무엇인가?

 

컨테이너화:  애플리케이션과 그에 필요한 모든 종속성을 함께 패키징하는 과정을 말합니다.

왜? => 이렇게 하면 애플리케이션은 어느 환경에서나 동일하게 실행될 수 있습니다.

 

ex) 당신은 특별한 커피를 만드는 방법을 알고 있습니다. 이 커피를 다른 사람들에게도 정확하게 같은 맛으로 제공하고 싶어합니다. 그래서 당신은 모든 재료와 도구, 그리고 커피를 만드는 정확한 방법을 포함하는 '커피 키트'를 만듭니다. 이제 누구든지 이 키트만 있으면 어디에서나 정확히 같은 맛의 커피를 만들 수 있습니다.

 

Docker의 컨테이너화는 비슷한 개념입니다. 애플리케이션, 필요한 라이브러리, 시스템 도구, 코드, 런타임 등 모든 것을 하나의 '키트' 안에 넣습니다. 이 '키트'는 '컨테이너'라고 부릅니다.

이 컨테이너를 사용하면 개발 환경, 테스트 환경, 프로덕션 환경 등 어디에서든 동일하게 애플리케이션을 실행할 수 있습니다.

결론적으로, 컨테이너화는 애플리케이션과 그에 필요한 모든 것을 하나의 포장된 단위로 만드는 것을 의미하며, 이를 통해 애플리케이션의 일관성과 이식성을 크게 향상시킬 있습니다.

 

총정리

 

 

 

자료출처: https://www.youtube.com/watch?v=LXJhA3VWXFA