
Docker란?
- Docker는 애플리케이션을 쉽게 만들고, 테스트, 배포할 수 있게 도와주는 소프트웨어 플랫폼이다.
키워드
- 이미지: 애플리케이션과 모든 실행에 필요한 파일을 포함한 읽기 전용 템플릿
- 컨테이너: 이미지를 실행하여 동작하는 애플리케이션 인스턴스
- Dockerfile: 이미지를 생성하기 위한 명령어가 담긴 스크립트 파일
- Docker Hub: 이미지를 저장하고 공유하는 중앙 저장소
- 볼륨: 컨테이너 데이터를 지속적으로 저장하는 메커니즘 (컨테이너 삭제 되더라도 볼륨 데이터 유지)
- 네트워크: 컨테이너 간의 통신을 관리하는 방식
도커 사용 이유
도커를 사용하면 개발 환경을 이미지화 시키고 해당 이미지를 통해 개발 및 배포 환경을 쉽게 컨테이너화 시켜 구축할 수 있다.
팀워크에서의 이점
개발 시 팀원들과 언어나 프레임웤의 버전이 달라 오류가 나는 경우가 있다. 도커를 사용하면 이런 문제를 쉽게 해결 가능하다. 도커 이미지에 언어나 프레임워크 버전을 미리 정해 놓을 수 있고 해당 이미지를 컨테이너화 시키면 그 컨테이너는 로컬 환경의 간섭 없이 독립적으로 구동하기 때문에 위과 같은 문제가 해결된다.
또한 Dockerfile 을 사용하면 설치할 언어, 프레임워크, 패키지 등을 미리 코드 형태로 명시하고 어느 컴퓨터에서든 쉽게 자동으로 설치할 수 있다.
서버에서의 이점
서버를 쉽게 개발 환경과 같은 환경으로 만들 수 있다. 또한, 서버를 옮기거나 늘릴 때 유용하다.
도커를 사용하면 이미지를 가져와 새로운 서버에 컨테이너를 만들어 쉽게 동일한 환경을 구축할 수 있다.
또한, 하나의 물리 서버에서 여러 도커 컨테이너를 돌려 여러 서비스를 배포하는 것도 가능하다.
이 때, 각 서비스마다 같은 프레임워크를 사용해도 필요한 버전이 다를 수 있는데, 도커 컨테이너는 각각 독립적으로 구동되기 때문에 버전 차이에서 오는 이슈를 해결 해준다.
자원적, 성능적으로 뛰어남
도커의 경우 다른 가상 환경 기술에 비해 가볍고 빠른 속도를 가진다.
기존의 가상화 방식은 각 가상 환경마다 독립된 커널 OS가 존재하여 매우 무겁고 느릴 수 밖에 없었다. 또한 각 환경마다 쓸 수 있는 자원이 고정으로 정해져 있기 때문에 컴퓨터의 성능과 환경이 제한된다.
그러나 도커 가상화 방식은 새롭게 커널 OS 를 생성하지 않고 기존의 커널 OS 자원을 계승하여 사용한다. 또한 각 환경마다 사용할 수 있는 자원이 고정되지 않아 유동적으로 변할 수 있다. 이러한 이유로 기존의 가상화 방식보다 훨씬 뛰어나다.
장점
- 빠른 시작 시간과 낮은 오버헤드
- Docker 컨테이너는 애플리케이션만 실행하고, 운영체제의 핵심 부분은 공유하므로 가상 머신보다 훨씬 빠르게 시작 가능하다.
- 높은 이식성과 확장성
- Docker 컨테이너는 한 번 만들면 어디서든 동일하게 실행된다.
- 여러 컨테이너를 쉽게 추가하고 관리할 수 있어, 필요에 따라 쉽게 확장 가능하다.
단점
- 보안 격리가 가상 머신보다 약함
- Docker 컨테이너는 동일한 운영체제 커널을 공유하기 때문에, 가상 머신보다 보안 격리 수준이 낮다.
- 하나의 컨테이너에서 보안 문제가 발생하면, 같은 커널을 공유하는 다른 컨테이너도 영향을 줄 가능성이 있다.
- 운영체제 종속성 존재
- Docker는 리눅스를 사용하여 작동하므로 다른 운영체제에서 호환성 문제가 있을 수 있다.
도커는 언제 사용할까?
일관된 개발 환경이 필요할 때
- 개발, 테스트, 운영 환경이 다를 때 발생하는 문제를 피하고자 할 때 사용하면 좋다.
- Docker를 사용하면 모든 환경에서 동일한 컨테이너를 실행할 수 있어, 환경 차이로 인한 문제를 줄일 수 있다.
애플리케이션을 빠르게 배포하고 싶을 때
- 빠르고 쉽게 배포할 수 있다.
- Docker 이미지를 빌드하고 이를 컨테이너로 실행하면, 필요한 모든 구성 요소가 포함되어 있어 별도 설치 과정 없이 바로 실행 가능하다.
MSA 를 도입할 때
- MSA 도입 시 Docker를 사용하면 각서비스가 독립적으로 배포되고 실행될 수 있어, 여러 개의 컨테이너를 통해 다양한 서비스를 쉽게 관리할 수 있다.
CI/CD 파이프라인을 구축할 때
- Docker는 CI/CD 파이프라인에 적합하다.
- 코드를 변경할 때마다 자동으로 빌드, 테스트, 배포할 수 있도록 설정할 수 있어 개발 주기를 단축하고 배포의 신뢰성을 높일 수 있다.
리소스 효율성을 높이고 싶을 때
- Docker 컨테이너는 가상 머신보다 적은 리소스를 사용한다.
- 운영체제의 커널을 공유하므로, 더 많은 애플리케이션을 동일한 하드웨어에서 실행할 수 있다.
애플리케이션 격리가 필요할 때
- 여러 애플리케이션을 독립적으로 실행하고자 할 때, Docker를 사용하면 각 컨테이너가 서로 격리되어 실행된다.
- 애플리케이션 간 충돌을 방지하고 보안을 강화할 수 있다.
쉽게 스케일링하고 싶을 때
- 컨테이너 기반 애플리케이션을 쉽게 확장할 수 있다.
- 필요한 만큼 컨테이너를 추가하여 수평 확자잉 가능하며, 오케스트레이션 도구와 결합하여 오토스케일링도 가능하다.