개요
새로운 프로젝트가 끝나고, 안드로이드에서 벗어나고 싶은 마음이 컸다. 이번에 함께한 동기들과 프로젝트를 또 하기로 했는데 안드로이드 말고, 백엔드나 인프라 쪽을 해보고 싶었고, 내가 선택한 것은 인프라였다! 나중에 안드로이드 배포할 때도 큰 도움이 되겠지 그래서 Docker에 대해 하나씩 정리해볼 계획이다.
1. Docker란?
Docker는 애플리케이션과 실행 환경을 컨테이너라는 단위로 묶어서 배포 또는 일관된 환경에서 애플리케이션을 실행할 수 있도록 하는 오픈 소스 가상화 플랫폼이다.
Docker를 활용한다면 개발과 운영 환경의 차이에서 발생하는 문제를 최소화하고, 소프트웨어의 배포와 실행을 더 간단하고 일관성있게 만들어줄 수 있다.
1-1. 가상화기술?
가상화 기술은 하나의 물리적인 하드웨어에서 여러 개의 가상 머신(VM)을 실행할 수 있도록 하는 기술이다.
가상 머신 -> 하나의 하드웨어에 하나의 OS만 있는 것을 효율화하고자 가상화층을 만들고 그 위에 OS를 새로 설치하는 기법이다.
하이퍼바이저(Hypervisor)라는 소프트웨어를 기반으로 작동하는데, 얘는 물리적인 하드웨어를 추상화해 가상 머신이 독립적으로 실행되도록 자원을 분배한다.
하이퍼바이저 유형은 2개로 구분된다.
유형1
하드웨어 위에서 직접 실행되며, 높은 성능과 안정성을 제공한다.
VMware ESXi, Microsoft Hyper-V가 있다.
유형2
기존 운영체제(Host OS) 위에서 실행되는 소프트웨어 형태의 하이퍼바이저이다.
Oracle VirtualBox, VMware Workstation 등이 있다.
장점
1) 효율적인 자원 사용 : 하나의 물리적 서버에서 여러 가상 머신을 실행해 하드웨어 활용을 극대화한다.
2) 격리성 : 각 가상 머신은 독립적으로 동작하기 때문에 보안성과 안정성이 높다.
3) 다양한 OS 지원 : 한 서버에서 서로 다른 운영체제를 실행할 수 있다.
4) 유연성 : 테스트 환경, 개발 환경, 운영 환경을 손쉽게 설정하고 변경이 가능하다.
단점
1) 높은 리소스 소비 : 각 가상 머신이 독립된 운영체제를 포함하기 때문에 메모리와 디스크 공간을 많이 차지한다.
2) 부팅 시간 : 가상 머신을 실행할 때 시간이 오래 걸릴 수 있다.
3) 복잡성 증가 : 하이퍼바이저와 게스트 운영체제 관리가 필요하다.
도커는 이러한 가상화의 한계를 극복하고자 나타나게 되었다.
1-2. 도커를 사용하는 이유?
VM의 하이퍼바이저로 분할된 가상 서버는 자체적인 운영 체제와 애플리케이션을 가지고 있어 안전한 환경을 제공할 수 있지만, 운영체제와 애플리케이션을 가상화하기 때문에 더 많은 하드웨어 자원을 소모하고 성능 저하의 가능성이 있는 단점이 있다.
반면, 도커의 경우 애플리케이션 실행을 위한 라이브러리, 의존성 등을 컨테이너로 패키징하여 관리한다. 이때 컨테이너는 운영체제와 커널을 공유하고, 다른 컨테이너와는 격리된 공간에서 동작한다. 이로 인해 컨테이너는 빠르게 실행되고, 더욱 효율적인 자원 활용이 가능해진다.
이때 도커는 리눅스 커널의 네임스페이스 및 cgroups(컨트롤 그룹)을 활용해 구현한다.
네임스페이스
-> 프로세스, 네트워크, 파일 시스템 등의 자원을 격리해 독립된 환경을 제공한다.
cgroups
-> CPU, 메모리, 디스크 I/O 등의 자원을 제한하고 할당해 각 컨테이너가 호스트 시스템의 자원을 공평하게 사용할 수 있도록 한다. 특정 컨테이너의 메모리 사용량을 제한해 다른 컨테이너의 성능에 영향을 미치지 않도록 할 수 있다.
둘의 차이에 대해 표로 나타내면 다음과 같다.
특징 | 가상 머신(VM) | 도커(Container) |
아키텍처 | 하이퍼바이저 위에서 동작 | 호스트 OS 위에서 동작 |
운영체제 포함 여부 | 게스트 OS 포함 | 호스트 OS의 커널을 공유 |
리소스 소비 | 게스트 OS로 인해 많은 메모리와 디스크 사용 | 더 적은 메모리와 디스크 사용 |
부팅 시간 | 수 분 소요 | 수 초 이내 |
이식성 | 특정 하드웨어와 소프트웨어 환경에 제한적 | 어느 환경에서나 실행 가능 |
성능 오버헤드 | 게스트 OS와 하이퍼바이저로 인한 오버헤드 | 호스트 커널을 사용하여 오버헤드 최소화 |
관리성 | 각각의 VM을 관리해야 함 | 컨테이너를 이미지 기반으로 쉽게 관리 |
1-3. 도커 장점
1) 이식성 : 개발 환경, 테스트 환경, 운영 환경 간 일관성을 유지할 수 있다.
2) 리소스 효율성 : VM보다 훨씬 적은 리소스를 사용하고, 실행 속도가 빠르다.
3) 빠른 배포 : 컨테이너를 통해 애플리케이션을 빠른 시간 안에 실행시킬 수 있다.
4) 호율적 자원 활용 : 호스트 OS의 커널을 공유하기 때문에, 여러 컨테이너를 동시에 실행해도 리소스 소비가 적다.
5) 확장성 : 쿠버네티스와 같은 오케스트레이션 툴과 함께 사용하여 컨테이너를 쉽게 관리하고 확장할 수 있다.
6) 자동화 용이성 : CI/CD 파이프라인에 통합해 개발 및 배포를 자동화할 수 있다.
2. 도커 아키텍처 & 구성요소
계속해서 컨테이너에 대한 내용이 나왔는데 이제부터 Docker의 구성요소들에 대해 알아보도록 하자.
2-1. 아키텍처
아래의 아키텍처는 '클라이언트 - 서버' 구성의 아키텍처이다.
Clinet
Docker 명령어를 통해 컨테이너를 실행, 관리하고 이미지를 빌드하거나 다운로드할 수 있으며, Docker Host와 상호작용 하는 역할을 한다.
docker run -> 컨테이너를 실행하는 명령어로, 지정된 이미지 기반으로 컨테이너를 생성하고 실행한다.
docker build -> 도커 파일을 기반으로 이미지를 생성한다.
docker pull -> 레지스트리에서 이미지를 다운로드 한다.
Host
Docker 컨테이너를 실행하는 데 사용되는 가상 머신을 말한다.
Docker 데몬을 실행해 클라이언트 명령을 수신하고 처리하며, 컨테이너의 실행 및 중지를 제어한다. 이때 호스트 운영체제의 리소스를 사용한다.
Registry
Docker Hub의 예처럼 이미지를 저장하고 관리하는 역할을 한다.
동작 흐름
-> 사용자가 Client를 통해 명령어를 입력한다.
-> Client는 명령어를 Docker Daemon에 전달한다.
-> Daemon은 명령어를 처리하여 이미지를 가져오거나 생성한다.
-> Daemon은 해당 이미지를 기반으로 컨테이너를 생성하고 실행한다.
-> 사용자는 실행 중인 컨테이너에 접근해 애플리케이션을 실행하거나 데이터를 확인할 수 있다.
2-2. 구성 요소
도커 파일(Docker file)
도커 이미지를 생성하기 위한 텍스트 기반의 설정 파일이다.
애플리케이션의 빌드 과정과 실행 환경을 정의하고, 단계별로 명령어를 추가해 이미지를 빌드한다.
FROM -> 기본 이미지 지정
RUN -> 명령어 실행
COPY or ADD -> 파일 복사
CMD or ENTRYPOINT -> 컨테이너 실행 시 기본 실행 명령어 지정
이미지(Image)
컨테이너 실행에 필요한 애플리케이션, 라이브러리, 설정 등을 포함한 불변 파일 시스템이다.
이미지는 빌드 시점에서 생성되며, 이미지를 기반으로 해서 컨테이너가 실행된다. 계층 구조로 이루어져 있어 효율적인 저장과 업데이트가 가능하다.
예를 들면, Nginx 웹 서버를 실행하는 이미지에는 Nginx 실행 파일, 기본 설정 파일, 종속 라이브러리가 포함된다.
컨테이너(Container)
이미지를 실행한 결과로 생성되는 독립적인 환경이다.
애플리케이션 코드, 라이브러리, 설정 파일 등을 포함하고 이를 격리된 환경에서 실행한다.
컨테이너에서는 호스트 운영체제를 공유하며, 필요한 리소스만을 사용하기 때문에 매우 경량화되어 있다.
엔진(Engine)
도커 데몬이 포함되어 있으며, 클라이언트의 명령을 처리하고, 컨테이너를 생성하거나 실행하는 역할을 한다.
Linux 및 Windows에서 모두 작동하며, 컨테이너 간 네트워킹과 스토리지 관리도 지원한다.
이상 간단한 정리 끝!
'Infra > Docker' 카테고리의 다른 글
[Docker] 도커 컴포즈란? (0) | 2025.01.19 |
---|---|
[Docker] 도커 파일 (0) | 2025.01.16 |
[Docker] 기본 명령어 정리 (0) | 2024.12.13 |