작성일자 : 2024-08-25
Ver 0.1.1
Docker는 컨테이너 기반의 오픈 소스 플랫폼으로, 어떤 프로그램을 외부 환경과 격리시켜 구동할수 있게 해주는 소프트웨어이다.
애플리케이션과 그 의존성을 패키지화하여 컨테이너 안에서 실행할 수 있도록 도와주며,
이를 통해 개발자와 운영팀이 동일한 환경에서 애플리케이션을 실행할 수 있게 하여, 일관된 배포와 실행을 보장한다.
1. 기본 개념
- Container : OS 상에 논리적인 영역(컨테이너)을 구축하고, 애플리케이션을 작동하는데 필요한 요소들을 모아 별도의 서버처럼 동작하는 것이다. 이는 가상머신과 유사하지만, 필요한 요소만으로 구성되어 있어 오버헤드가 적고 훨씬 더 가볍고 빠르다.
- Dockerfile: 이미지 생성을 자동화하기 위한 스크립트 파일이다. Dockerfile에 작성된 명령어를 기반으로 이미지를 빌드할 수 있다.
- Docker Image: Image는 실행 가능한 컨테이너의 템플릿으로, 특정 애플리케이션이 실행되기 위한 모든 환경을 포함한다. 이미지를 기반으로 컨테이너가 생성된다.
- Demon: Docker Api 요청수신, 이미지,컨테이너,네트워크와 같은 도커 객체 및 도커 서비스 관리
- Docker Client : Docker 사용자가 Docker와 상호작용하기 위한 방법. 기본적인 도커명령어를 통해서 Docker 데몬과 통신
- Docker Hub: Docker 이미지의 중앙 저장소로, 다양한 이미지를 다운로드하고 공유할 수 있다.
2. 주요 특징
- 경량화: Docker 컨테이너는 호스트 운영체제의 커널을 공유하기 때문에, 가상 머신에 비해 훨씬 가볍고 빠르다.
- 이식성: Docker 이미지를 이용하면, 동일한 환경에서 애플리케이션을 어디서든 실행할 수 있다. 이는 환경 차이로 인한 "작동하지 않는 문제"를 해결한다.
- 확장성: 컨테이너 기반의 애플리케이션은 쉽게 확장 가능하며, 필요한 만큼 컨테이너를 추가하여 부하를 분산할 수 있다.
- 버전 관리: Docker 이미지는 버전 관리를 통해 특정 버전으로 롤백하거나, 다양한 버전을 동시에 관리할 수 있다.
3. 장점
- 빠른 배포: 애플리케이션과 그 환경을 패키지화하여 빠르게 배포할 수 있다.
- 높은 효율성: 리소스를 적게 사용하며, 가상 머신에 비해 훨씬 가볍고, 실행 속도가 빠르다.
- 일관된 환경: 개발, 테스트, 프로덕션 환경이 동일하게 유지되므로, 환경 차이로 인한 오류가 줄어든다.
- 유연한 확장성: 컨테이너를 쉽게 복제하고 확장할 수 있어, 클라우드 환경에서 유연한 확장이 가능하다.
- 개발 생산성 향상: 개발자들이 로컬 환경에서 프로덕션과 동일한 환경을 사용할 수 있어, 문제를 조기에 발견하고 수정할 수 있다.
4. 단점
- 보안 문제: 컨테이너가 호스트 OS의 커널을 공유하기 때문에, 보안 취약점이 있을 경우 호스트 OS에 영향을 줄 수 있다.
- 복잡성: 복잡한 시스템의 경우, 여러 컨테이너를 관리하는 것이 어려울 수 있다. 이를 해결하기 위해 Docker Compose나 Kubernetes 같은 도구가 필요하다.
- 퍼포먼스 이슈: 대부분의 경우 가상 머신보다 효율적이지만, 호스트 시스템과의 I/O 작업에서 성능 저하가 발생할 수 있다.
- 상태 관리의 어려움: 컨테이너는 본질적으로 상태를 가지지 않기 때문에, 상태를 관리해야 하는 애플리케이션의 경우 추가적인 설정이 필요하다.
- 학습 곡선: Docker의 개념과 사용법을 익히는 데 시간이 걸릴 수 있다. 특히, 복잡한 설정과 네트워킹을 다루려면 추가적인 학습이 필요하다.