도커는 컨테이너 기반의 가상화 플랫폼으로 일관된 실행 환경을 제공한다. 컨테이너라는 기술을 활용해 애플리케이션과 그 의존성을 패키징하고, 어디서든 동일한 환경에서 실행되도록 보장하여 개발 환경과 운영 환경 사이의 차이로 인한 문제를 줄일 수 있다. 흔히 말하는 "내 컴퓨터에서는 잘 되는데 왜..."라는 문제를 해결해준다. 도커 컨테이너는 가볍고 빠르며 확장성이 좋아서 애플리케이션의 배포 및 관리 프로세스를 간소화 할 수 있다.
ㅇ 경량화된 가상화와 성능 효율성
컨테이너 기술이 아닌 기존의 가상화 방식은 주로 OS를 가상화 했다. VM은 호스트 OS위에 게스트 OS 전체를 가상화하여 사용하는 방식으로 컨테이너와 큰 차이점을 가진다.
VM(Virtual Machines)
- 호스트 운영체제 위에 가상화된 하드웨어 계층을 생성하고 각 VM은 독립된 운영체제, 커널, 드라이버등을 가진다.
(무겁고 높은 리소스 소비가 필요하다) - 운영체제의 부팅과정이 포함되기 때문에 시간이 오래걸린다.
- 독립된 운영체제를 가지므로 많은 리소스를 소비한다.
docker container
- 호스트 운영체제의 커널을 공유하며 가볍게 격리된 환경을 생성
- VM보다 가볍고 효율적인 실행
- 이미지와 컨테이너 레이어를 사용하여 빠른 생성, 빠른 실행속도
- 호스트 운영체제의 커널을 공유하므로 가볍고 효율적인 리소스 사용
결론적으로 VM이 전체 운영체제를 포함하는 반면 컨테이너는 호스트 시스템의 커널을 공유하는 방식으로 동작하여 VM은 무겁고 느리지만, 컨테이너는 가볍고 빠르다.
ㅇ 도커를 사용하는 이유
- 일관된 실행 환경 제공
애플리케이션과 실행에 필요한 모든 라이브러리, 종속성, 설정 파일 등을 하나의 컨테이너에 묶어 배포하여 개발환경, 테스트 환경, 운영 환경에서 일관된 실행 환경을 제공한다. - 의존성 충돌 방지
도커는 각 애플리케이션을 독립적인 컨테이너에서 실행하므로, 서로 다른 애플리케이션이 동일한 시스템에서 구동될 때, 라이브러리나 설정 파일의 버전 충돌을 방지한다. - 이식성(Portability)
다양한 운영체제와 클라우드 플랫폼에서 동일하게 동작한다. 개발자가 작성한 코드를 로컬에서 실행한 후, 동일한 컨테이너를 다른 환경(AWS, GCP)등으로 옮겨서 쉽게 실행할 수 있다. - 빠르고 경량화된 가상화
전통적인 VM보다 훨씬 경량화된 가상화 기술을 사용한다. 호스트 시스템의 커널을 공유하고 그 위에 독립적인 애플리케이션 환경을 구축한다. 이로인해 빠르게 실행되며, 시스템 자원을 덜 사용한다.(배포 속도 향상에 크게 기여한다.) - 격리 및 보안
격리된 환경에서 실행되기 때문에 보안적인 이점이 크다. 한 컨테이너의 문제가 발생하여도 다른 컨테이너나 호스트 시스템에 영향을 미치지 않는다. - 효율적 배포 및 스케일링
CI/CD 파이프라인에 통합되어 배포 자동화를 지원한다. 이미지를 한 번 생성하면 이를 여러 환경에서 동일하게 사용하여 배포 속도를 높일 수 있다. 애플리케이션의 수평 확장(scale-out)이 용이하다.
ㅇ 도커 이미지
도커에서 이미지라는 개념은 아주 중요하다. 도커 이미지는 애플리케이션과 그 실행 환경을 하나의 패키지로 묶은 것이다.
이를 통해 일관성 있는 개발, 테스트, 배포 환경을 제공한다.
도커 이미지의 핵심은 애플리케이션의 실행에 필요한 모든 의존성, 라이브러리, 환경 설정이 포함된다는 점이다.
- 도커 이미지는
모든 환경에서 동일한 조건을 제공하므로 의존성이나 설정 차이로 인해 발생하는 문제를 줄여준다. - 도커 이미지는
파일로 저장되어 있으므로, 새로운 서버나 클라우드 환경에서 이미지를 바로 로드하여 빠르게 애플리케이션을 배포할 수 있다. 이미지를 기반으로 여러 컨테이너를 쉽게 실행할 수 있어 스케일링도 간편해진다. - 도커 이미지는
각 버전별로 관리된다. 특정 버전의 이미지를 생성하고 그 이미지를 재사용하면 정확한 버전과 환경을 언제든지 재현할 수 있다. 배포 후 문제가 발생하거나, 과거의 안정적인 상태로 돌아가는데 매우 유용하다. - 필요한 설정만을 포함한 경량화된 이미지로 동작하기 때문에, vm에 비해 속도와 리소스 효율성이 뛰어나다.
- 환경 변수를 설정하면 서로 다른 설정을 요구할 때 하드코딩하지 않고 분리하여 관리할 수 있고(ex 데이터베이스 연결정보, 포트번호 등), 비밀번호나 api키와 같이 민감한 정보를 이미지에 직접 포함하지 않고 외부에서 주입할 수 있어 보안 강화에 도움을 준다.
'Docker' 카테고리의 다른 글
쿠버네티스(Kubernetes) (4) | 2024.12.23 |
---|---|
Docker MySQL 컨테이너 실행하기 (4) | 2024.09.23 |
docker 기초 (9) | 2024.09.01 |