본 게시글은 유데미(udemy.com)의 < 【한글자막】 Docker & Kubernetes : 실전 가이드 > (Maximilian Schwarzmüller) 강의를 수강한 후 내용을 정리한 것입니다.
우리가 도커를 써야 하는 이유
1. 서로 다른 개발 및 배포 환경의 문제
무인도에서 혼자 개발하고 혼자 배포하는 자급자족(?)을 하지 이상,
세상의 모든 개발자는 남들과 협업하거나 다른 사람들의 작업물을 활용함으로써 소프트웨어를 발전시킵니다.
하지만 개발하는 애플리케이션 또는 프로그램은 필연적으로 패키지 버전이나 환경 등이 다를 수밖에 없습니다.
앱을 수정하거나 테스트할 때 가장 먼저 수행해야 할 건 재구현입니다.
기존 개발자가 실행했던 내용을 본인 환경에서도 구현할 수 있는지 시도해보는 게 우선인데
(실제로는 이마저도 어려워서 포기하는 일이 대다수...)
이전 개발자가 사용했던 모듈과 환경을 일일이 다운로드하고 설치한다면 시간이 너무 오래 걸릴 것입니다.
시간은 둘째 치고 본인의 컴퓨터 환경에서 다른 개발자의 환경을 정확하게 구현할 수 있을지 확실하지도 않습니다.
툴 또는 라이브러리의 버전 충돌이나 설치 오류 문제 등 가로막고 있는 장애물이 너무나 많기 때문입니다.
이때 재현 가능한 개발 환경을 '패키징'해서 쉽게 제공하는 게 바로 도커(Docker)입니다.
2. 리소스의 문제: 가상머신 vs. 도커
최근에 K는 운영체제 전공 과목 과제를 하기 위해 가상 머신을 다뤄보게 되었습니다.
가상 머신(virtual machine)을 다운로드받고 쓰는 데 시간이 조금 걸렸지만,
이것만 있으면 윈도우 운영체제 안에서도 리눅스 환경을 완벽하게 구현할 수 있습니다.
게다가 별도의 파일 시스템까지 만들어져 있으니 가상 머신을 안 쓸 이유가 없네요.
그런 K가 이렇게 질문합니다.
"이미 가상 머신으로 OS level부터 완벽하게 환경 구현을 할 수 있는데 왜 굳이 도커를 써야 하나요?"
맞는 말입니다. 특정 앱에 맞는 환경을 구축하기 위해 가상 머신(virtual machine)을 쓸 수는 있습니다.
그러나 가상 머신은 "machine(=컴퓨터 시스템)"이라는 말 그대로
컴퓨터 환경을 하나 통째로 복사하는 것과 비슷하기 때문에 오버헤드가 엄청나게 발생합니다.
우린 단지 프로그램 하나를 돌리기 위해 가상 머신을 설치한 건데
이 과정을 위한 메모리와 CPU 자원이 너무 많이 드니 번거로울 수밖에 없습니다.
가상 머신의 특성을 정리하면 다음과 같습니다.
- 분리, 독립된 실행 환경
- 앱을 구동하기 위한 특정 환경 구성이 가능
- 안정적으로 환경 구성을 공유하고 재현할 수 있음
- 비효율적. 중복된 메모리와 자원 사용, 속도와 성능 저하, 부팅 시간 소모 등
가상 머신의 한계를 극복하고 프로그램 실행과 지속 배포를 위해 내놓은 대안이 도커입니다.
도커는 아래 특성을 지니고 있습니다.
- 앱을 구동하기 위한 기기의 전체 환경을 구축하지 않고 필요한 부분만 분리하여 구축
- OS를 직접 구축하지 않음
- 가상 머신에 비해 빠르고 디스크 사용량도 적음
- 공유, 배포, 재사용이 효율적이고 빠름
컨테이너 안에 담긴 코드는 누가 실행하든, 어떤 OS나 환경 안에서 실행하든 (이상적으로는)
항상 동일한 실행 결과를 보장합니다.
뿐만 아니라 컨테이너는 (컨테이너 개념은 뒤에서 더 자세히 설명합니다) 사용자의 OS 위에서 작동하는 반면
가상 머신은 아예 별도의 OS를 하나씩 꾸려놓는 것이기 때문에 컨테이너는 훨씬 더 무거울 수밖에 없습니다.
도커 개념 정리
- 도커는 컨테이너(container)를 생성하고 관리하기 위한 기술입니다.
- 도커가 실행되는 환경이라면 어디서든 내가 원하는 application을 동일한 조건으로 실행할 수 있습니다.
- 다른 부가적인 의존성이나 툴에 대해 신경 쓸 필요가 없어집니다.
- 오늘날 우리가 쓰는 OS는 모두 컨테이너 기술을 지원하고 있습니다.
컨테이너(Container)란?
가상 머신에 대응되는 도커의 기본 실행 단위, 즉 컨테이너(container)에 대해 알아봅시다.
컨테이너를 한 줄로 정의하면 "표준화된 소프트웨어 단위"라고 할 수 있습니다.
다시 말해서 어떤 실행 가능한 코드뿐만 아니라
그 코드를 실행하기 위한 모듈, 패키지, 가상환경들을 모두 합쳐놓은 것입니다.
컨테이너의 특징은
1) 독립(고립, isolated)
2)자기 충족적(self-contained)
3) 재사용성(reproducibility)
이 세 가지로 정리할 수 있습니다.
아직까지는 추상적으로 들리겠지만 일단 위 세 가지 특징을 명심합시다.
컨테이너는 OS 위에서 작동한다
컨테이너는 사용자의 OS 위에서 작동합니다.
엄밀히 말하면 Docker Engine이 사용자의 OS 위에서 컨테이너가 실행되도록 세팅하는 역할을 합니다.
도커의 구성 요소
지금까지는 컨테이너에 대해 중점적으로 설명했고,
은연 중에도 도커를 컨테이너와 동일한 개념으로 설명했습니다.
하지만 '도커==컨테이너'라고 단순하게만 이해한다면 놓치는 부분이 많습니다.
컨테이너 외에도 도커가 제공하는 풍부한 기능과 서비스가 존재하기 때문입니다.
여기서는 크게 4가지로 간단하게 정리하고 넘어가겠습니다.
- Docker Engine: 도커 컨테이너가 사용자의 OS에 맞게 실행이 가능하도록 OS 레벨에서 지원하는 기술
- Docker Desktop: Docker Engine을 알아서 설치. Daemon & CLI이 실행 가능하도록 세팅함
- Docker Hub: Docker image를 웹에서 가져와 사용하거나 우리가 만든 image를 다른 사용자에게 공개할 수 있는 웹 호스팅 서비스
- Docker Compose: 여러 개의 container를 통합적으로 관리할 수 있는 서비스
다음 편에선 본격적으로 도커를 코드로 돌려보는 실습을 진행해보겠습니다.
'도커와 쿠버네티스' 카테고리의 다른 글
[2주차] Part 4: 도커 이미지 공유하기(push, pull) (0) | 2024.01.09 |
---|---|
[2주차] Part 3: 도커 이미지와 컨테이너를 관리하기 (1) | 2024.01.09 |
[2주차] Part 2: 이미지는 읽기 전용(read-only) 파일일 뿐이다 (1) | 2024.01.09 |
[2주차] Part 1: 이미지(image)와 컨테이너(container) 간의 관계 (0) | 2024.01.09 |
[1주차] Part 2: 도커 실습 시작하기 (1) | 2024.01.02 |