Search

Docker 개념 | 도커를 왜 사용할까?

Date
2024/12/05
Category
Devops
Tag
Docker
목차

개념

도커(Docker)컨테이너 기반 가상화 플랫폼으로, 독립된 환경을 제공하여 하드웨어를 효율적으로 활용하는 기술이다. Linux 기반의 컨테이너로, 컨테이너 내 배치 작업 자동화가 가능하며, 컨테이너를 통한 애플리케이션 인프라의 동일한 환경 제공으로 인해 신속한 구축과 테스트가 가능한 것이 장점이다.

Host 가상화 vs Container 가상화

기존의 가상화 방식은 주로 OS를 가상화했다. VMware, VirtualBox와 같은 가상머신은 Host OS 위에 Guest OS 전체를 가상화하여 사용하는 방식으로, 도커의 컨테이너 방식과는 큰 차이가 있다.

Host

Host OS 위에 가상화 소프트웨어를 사용하여 하드웨어 운영 방법을 사용
각 가상머신은 독립된 운영체제, 커널, 드라이버 등을 가지며, 이로 인해 무겁고 높은 자원 소비 필요
각 가상머신이 독립적인 Guset OS를 생성하기 때문에 오버헤드가 발생하고 긴 부팅 시간을 가짐

Container

가상화 소프트웨어 없이 Host의 리소스를 격리하여 가상 운영체제 사용 가능
별도의 Guest OS가 없기에 오버헤드가 발생이 적음
적은 리소스로 많은 작업을 수행하는 프로젝트에 적합

도커의 구성 요소

Docker Engine

도커의 핵심 구성 요소로, 컨테이너를 실행하고 관리하는 서버이다. 클라이언트와 서버로 나뉘어 있어며, 클라이언트는 명령어를 입력하고, 서버는 이 명령어를 실행한다.
서버 모드: 백그라운드에서 실행되며, REST API를 통해 클라이언트와 상호작용함
클라이언트 모드: 사용자가 명령어를 입력하는 인터페이스 제공

Docker Hub

도커 이미지의 중앙 레지스트리(Registry)로, 이미지를 공유하고 저장하는 플랫폼이다. 사용자들은 Docker Hub에서 공개 이미지를 다운로드하거나, 자신이 만든 이미지를 업로드하여 다른 사용자와 공유할 수 있다. 또한, Docker Hub는 자동 빌드 및 Webhook 기능을 제공하여 CI/CD와 통합할 수 있다.

Docker Compose

여러 개의 컨테이너를 정의하고 관리할 수 있는 도구이다. YAML 파일을 사용하여 각 컨테이너의 설정(이미지, 네트워크, 볼륨 등)을 정의하고, 단일 명령어로 전체 애플리케이션을 시작/중지할 수 있다. 복잡한 애플리케이션의 배포를 간소화하고, 개발 환경을 일관성있게 유지하는 데 유용하다.

Dockerfile

도커 이미지를 생성하기 위한 스크립트 파일이다. 이 파일에는 기본 이미지, 패키지 설치, 환경 변수 설정, 애플리케이션 코드 복사 등의 지침이 포함된다. docker build 명령어를 사용하여 Dockerfile을 기반으로 이미지를 생성할 수 있다.

그래서 도커를 왜 사용할까

이식성: (개발 → 프로덕션) 환경 이동이 용이하며, 동일한 이미지로 다양한 환경에서 실행 가능하다.
빠른 배포: 컨테이너는 시작과 종료가 매우 빠르며, 필요한 경우 여러 개의 컨테이너를 동시에 실행 가능하다.
버전 관리: Docker 이미지를 통해 애플리케이션의 버전을 관리하고, 필요할 때 이전 버전으로 롤백할 수 있다
경량화: 컨테이너는 별도의 운영체제를 포함하지 않기 때문에, 자원을 적게 소모하고 더 많은 애플리케이션을 동시에 실행하는 것이 가능하다.
확장성: 수평 확장이 용이하며, 트래픽 증가에 따라 쉽게 컨테이너를 추가하고 관리할 수 있다.
일관성: 개발, 테스트, 프로덕션 환경에서 동일한 애플리케이션 환경을 제공한다.
자동화: CI/CD 파이프라인에서 테스트 및 배포 환경을 일관되게 유지할 수 있어, 개발 프로세스를 자동화하는 데 유리하다.
결론적으로, 도커는 개발자들에게 있어 번거로운 환경 설정의 부담을 덜어주고, 협업의 효율성을 높여주는 도구이다. 개발 과정에서 환경 세팅은 번거롭고 시간이 많이 가는 작업이다. 특히 협업을 한다면, 각기 다른 운영체제와 라이브러리 버전 때문에 협업이 어려워지기도 한다. 도커는 격리된 컨테이너 안에 애플리케이션을 담기 때문에, 각 개발자는 자신만의 컨테이너에서 작업하게 되며, 이 컨테이너는 언제 어디서나 동일하게 실행된다. 이로 인해 환경 설정에 소요되는 시간을 줄이고, 각자의 개발 환경이 일관되도록 유지할 수 있다.