본문 바로가기
개발관련

Docker 란 무엇일까 ?

by 수바니 2024. 8. 13.

Docker란?
애플리케이션을 쉽게 만들고, 테스트하고, 배포 할수 있게 도와주는 소프트웨어 플랫폼

컨테이너 기술을 기반으로 한 일종의 가상화 플랫폼

 

주요특징

컨테이너화
경량
이식성 (어디서든 동일하게 실행 개발자의 컴퓨터라던지 테스트 서버 운영서버 까지 동일하게 동작)
확장성

Docker가 나오기전에는


Spring app 안에 /product,  /order에 있다고 가정하 서버에 Spring app을 넣어서 
도커전에는 서버 리눅스 안에 어플리케이션을 넣어서 사용자는 엔드포인트를 통해 접속하였다.
자바버전, gradle을 리눅스에서 다 설치해서 맞춰주어야함
자바 버전이 다른 경우 굉장히 복잡하고, 버전을 함부로 바꾸기엔 위험부담이 매우크다.
또한 시스템의 종속성이 생기기때문에, 매우 복잡하다.

도커가 생긴이후로 위에있는 과정이 사라졌다.
DB설치도 command 1~2줄로 끝나고, 버전을 굳이 맞춰주지않아도 된다.

자바버전이 다 다르더라도 리눅스 서버 안에 컨테이너들을 독립적으로 각각 관리하기 때문에 환경에 맞춰서 기동한다.

그림으로 그리자면 이런 느낌이다.


키워드 정리
이미지
코드,런타임 , 구성파일 등 포함  애플리케이션과 그 실행에 필요한 모든것을 포함하는 읽기전용 템플릿
컨테이너를 생성하기 위한 청사진 역할

컨테이너

Docker 이미지를 실행한 상태 
이미지가 정적인 템플릿이라면, 컨테이너는 실제로 애플리케이션이 실행되는 동적인 환경
하나의 시스템에서 여러개의 컨테이너를 독립적으로 실행 -> 리눅스 컴퓨터가 있다면 여러개의 컨테이너를 실행할수있는데 자바버전이 각각 달라도 된다.

Dockerfile
Docker 이미지를 생성하기 위한 스크립트
이파일에는 이미지를 빌드하는데 필요한 명령어들이 포함
이미지 생성 과정을 자동화하고 일관되게 만들 수 있습니다.

Docker Hub
Docker 이미지를 공유하고 저장하는 중앙 저장소
다양한 공개이미지를 다운로드하거나 자신만의 이미지를 업로드 할 수 있다.

볼륨
컨테이너의 데이터를 지속적으로 저장할수있는 메커니즘
컨테이너가 삭제되더라도 볼륨에 저장된 데이터는 유지 됩니다.
볼륨을 사용하면 데이터를 컨테이너와 독립적으로 관리할 수 있습니다. 


Docker와 가상 머신의 비교


Docker의 장점
빠른 시작 시간과 낮은 오버헤드
도커컨테이너는 애플리케이션만 실행하고, 운영체제의 핵심부분을 공유하므로, 가상머신보다 훨씬 빠르게 시작할 수 있다.
높은 이식성과 확장성

Docker의 단점
보안격리가 가상 머신보다 약함
Docker컨테이너는 동일한 운영 체제 커널을 공유하기 때문에, 가상머신보다 보안 격리수준이 낮습니다.
하나의 컨테이너에서 보안 문제가 발생하면, 같은커널을 공유하는 다른 컨테이너에도 영향을 줄 가능성이 있습니다.
운영체제 종속성 존재


가상머신의 장점 (Docker의 단점이기도 하다.)
격리된 환경제공
다양한 운영체제 실행가능

가상머신의 단점 (Docker의 장점이기도 하다.)
오버헤드가 크고, 느린 부팅시간
높은 리소스 소비 -> 각기 독립된 운영체제를 포함하므로 여러가상머신을 실행하면 컴퓨터 자원을 많이 소모 

-> 따라서 컴퓨터의 성능 저하

Docker는 언제 사용할까?


1. 일관된 개발 환경이 필요할때
개발,테스트,운영 환경이 다를때 발생하는 문제를 피하고자 할때 Docker를 사용하면 좋다.
Docker를 사용하면 모든 환경에서 동일한 컨테이너를 실행할수있어, 환경차이로 인한 문제를 줄 일 수 있습니다.
ex) mysql이 내Pc에서는 5.xx 버전 서버는 8.xx 버전이라면 동작을 안할수있다. 
=> 도커를 통하면 8.n 버전의 mysql 이미지를 컨테이너로 만들어서 실행하면 문제가 되지않는다.

2. 애플리케이션을 빠르게 배포할수있을때
Docker이미지를 빌드하고 이를 컨테이너로 실행하면 필요한 구성요소가 포함되어있어 별도의 설치과정없이 바로 실행가능

3. 마이크로서비스 아키텍처를 도입할때
Docker는 마이크로 서비스 아키텍쳐와 잘맞습니다.
각서비스가 독립적으로 배포되고 실행 될 수 있습니다.

4. CI/CD 파이프라인 구축할때
코드를 변경할때마다 자동으로 빌드, 테스트, 배포할 수 있도록 설정할 수 있어 개발주기를 단축하고 배포의 신뢰성을 높일 수 있습니다.

5. 리소스 효율성을 높이고 싶을때
Docker 컨테이너는 가상 머신보다 적은 리소스를 사용합니다. 운영체제의 커널을 공유하므로, 더 많은 애플리케이션을 동일한 하드웨어에서 실행할 수 있습니다.

6. 애플리케이션 격리가 필요할때
여러 애플리케이션을 독립적으로 실행하고자 할 대 Docker를 사용하면 각 컨테이너가 서로 격리되어 실행됩니다. 이를 통해 애플리케이션 간의 충돌을 방지하고 보안을 강화할 수 있습니다.

7. 쉽게 스케일링 하고 싶을때
Docker를 사용하면 컨테이너 기반의 애플리케이션을 쉽게 확장할 수 있습니다. 필요한 만큼 컨테이너를 추가하여 수평 확장이 가능하며, 오케스트레이션 도구와 결합하여 자동 확장도 가능합니다.