Docker 도입 과정
Docker의 기본 개념부터 실제 프로젝트 적용까지 단계별로 이해할 수 있습니다.
- Docker 이해하기: 컨테이너 기반 가상화의 개념과 장단점 (현재 글)
- Auction-Server에 Docker 적용하기: 개발과 배포의 효율적인 관리
Docker

가상 머신은 호스트 시스템에서 독립적인 환경을 갖는 게스트 운영 체제를 실행하여, 호환성 문제나 환경 의존성 문제가 발생할 수 있습니다. 또한, 여러 가상 머신이 호스트 시스템의 자원을 공유하면서 자원 충돌이 발생할 수도 있습니다. 그러나 Docker는 각 컨테이너가 필요한 모든 환경을 자체적으로 갖고 있고, 호스트 시스템과 격리되어 있어 이러한 문제를 방지합니다.
- 컨테이너 기반 가상화 기술을 제공해주는 오픈소스 프로젝트
- 여러 운영체제에서 어플리케이션을 실행할수 있도록 해주는 가상화 플랫폼
- 가상화된 환경에서 실행되는 응용 프로그램을 실행하기 위해 필요한 모든 것이 포함된 경량화된 컨테이너 이미지를 만들 수 있습니다.
- 컨테이너 이미지는 OS, 실행환경, 어플리케이션 등이 패키지화되어 있습니다.
- 도커 컨테이너 이미지는 도커에서 실행되는 컨테이너를 생성하기 위한 불변의 템플릿
- 각 이미지는 도커 이미지 레지스트리에 저장되며, 이미지를 실행하면 해당 이미지의 컨테이너가 만들어짐
- 이미지는 소프트웨어 애플리케이션, 라이브러리, 의존성, 설정 등을 모두 포함하는 것이 일반적
- 독립적으로 실행되거나 다른 이미지와 결합하여 실행
- 예를 들어, 웹 애플리케이션을 위한 이미지와 데이터베이스를 위한 이미지를 결합하여 실행
- 이미지는 계층적으로 구성됩니다. 각 계층은 이전 계층을 기반으로 새로운 계층을 추가하는 방식으로 작성
- 이미지의 크기를 줄이고 공통적인 부분을 재사용
- 도커는 이전의 가상화 기술과 비교하여 경량화되어 있어, 더 빠르게 실행되며, 실행 중인 어플리케이션과 호환성이 높음
- 도커 컨테이너는 각각이 격리된 공간에서 실행되므로, 서로 다른 환경에서 실행되는 어플리케이션을 컨테이너로 분리하여 실행하면 충돌이나 문제가 발생할 가능성이 적어짐
- 도커는 다양한 운영 체제와 클라우드 플랫폼에서 지원
가상화
- 하나의 물리적 서버 또는 리소스를 가상적으로 분할하여 여러 대의 가상 서버 또는 가상 환경을 만드는 기술
- 하나의 물리적인 서버 자원을 논리적인 단위로 나누어서 사용할 수 있게 하기 때문에 물리적인 서버의 자원 활용도를 높일 수 있으며, 가상 서버를 쉽게 생성, 삭제, 이동할 수 있기 때문에 유연하게 인프라를 운영
- 예를 들어 서버의 리소스가 절반을 사용할때 사용하지 않은 리소스를 사용함에 따라 효율적으로 사용할수 있습니다.
- 하드웨어 가상화와 소프트웨어 가상화로 나눌수 있음
- 하드웨어 가상화는 하이퍼바이저(Hypervisor)라는 소프트웨어를 이용하여 하드웨어를 가상화
- 하이퍼바이저는 호스트OS(Host OS) 위에서 동작하는 소프트웨어로, 하드웨어 자원을 가상 머신(VM, Virtual Machine)에 할당하여 각각의 가상 머신이 독립적으로 운영
- 소프트웨어 가상화는 운영체제 수준에서 가상화를 수행
- 운영체제의 커널을 공유하여 여러 개의 가상 서버를 구성하고, 각각의 가상 서버는 독립적으로 동작
- 대표적으로 리눅스 컨테이너(Linux Container) 기술
- 하드웨어 가상화는 하이퍼바이저(Hypervisor)라는 소프트웨어를 이용하여 하드웨어를 가상화
- 가상화는 서버, 스토리지, 네트워크 등 다양한 분야에서 활용되고 있습니다.
- 스토리지 가상화는 스토리지 리소스를 가상화하여 스토리지의 효율성을 높이고 유연하게 관리할 수 있게 합니다.
- 네트워크 가상화는 가상 네트워크(Virtual Network)를 구성하여 하나의 물리적 네트워크를 가상으로 분할하고, 각각의 가상 네트워크를 독립적으로 운영할수 있다.
- 서버 가상화 기술은 대규모 서버 운영을 위한 서버 통합 관리, 시스템 이중화, 비즈니스 연속성, 비용 절감 등을 위해 활용됩니다.
도커와 가상머신의 장단점
가상머신(Hypervisor)
- 장점
- 완전한 격리 환경을 제공하여, 안전한 환경에서 애플리케이션을 실행
- 단점
- 무겁고 느리기 때문에, 실행 속도가 느림
- 여러 개의 가상 머신을 운영하기 위해서는, 많은 리소스가 필요
- 호스트 운영 체제와 완전히 분리되어 있기 때문에, 호스트 운영 체제와의 통합이 어려움
도커(Container)
- 장점
- 경량화된 컨테이너를 사용하기 때문에, 실행 속도가 빠름
(가상머신과 다르게 커널을 공유하기 때문에 실행 속도가 빠름) - 호스트 운영 체제와 컨테이너 운영 체제가 같은 커널을 공유하기 때문에, 리소스 사용량이 적음
- 개발 환경과 운영 환경의 차이를 최소화
(도커의 이미지를 기반으로 애플리케이션을 배포하기 때문에)
- 경량화된 컨테이너를 사용하기 때문에, 실행 속도가 빠름
- 단점
- 호스트 운영 체제와 같은 운영 체제를 사용해야 하므로, 다양한 운영 체제를 지원하지 않음
- 완전한 격리 환경을 제공하지는 않으므로, 보안 취약점이 있을 가능성이 있음
컨테이너
- 가상화 기술 중 하나로, 하나의 운영 체제에서 여러 개의 격리된 공간을 만들어 다양한 애플리케이션을 구동할 수 있도록 하는 기술
- 하나의 호스트 운영 체제 위에 여러 개의 격리된 공간을 만들어 각각 독립적인 환경에서 애플리케이션을 실행
- 각 컨테이너는 격리된 파일 시스템, 네트워크, 프로세스, 사용자 공간 등을 갖추고 있어 서로 독립적으로 동작하며, 하나의 컨테이너에 문제가 발생해도 다른 컨테이너에는 영향을 미치지 않음
- 가상머신과는 다르게 운영 체제를 가상화하지 않고, 호스트의 운영 체제를 공유하므로 빠르고 가벼움
- 대표적인 컨테이너 기술로는 도커(Docker)
도커 이미지
- 가상머신에서 사용하는 이미지와 비슷한 역할
- 어떤 애플리케이션을 실행하기 위한 환경
- 이 환경은 파일들의 집합입니다. 도커에서는 애플리케이션을 실행하기 위한 파일들을 모아놓고, 애플리케이션과 함께 이미지로 만들 수 있습니다.
- 이미지를 기반으로 애플리케이션을 바로 배포
- 만일, 호스트 OS의 커널과 컨테이너의 OS 커널이 다르면 다른 부분만을 패키징함
위의 내용을 바탕으로 Docker을 사용하지 않을 때와의 차이를 작성하고자 합니다.
Docker를 사용하지 않을 때
- 환경 불일치 문제
- 배포할 서버 환경마다 사용되는 Java 버전이나 라이브러리 버전이 다를 수 있습니다.
- 이로 인해 애플리케이션이 예상대로 동작하지 않을 가능성이 높습니다.
- 예를 들어, 개발 환경에서는 Java 8을 사용하지만, 운영 환경에서는 Java 11을 사용한다면, 특정 기능이나 라이브러리가 서로 호환되지 않아 문제를 일으킬 수 있습니다.(UnsupportedClassVersionError , ClassNotFoundException등 예외 상황 발생)
- 복잡한 배포 과정
- 서버마다 각기 다른 설정 파일을 관리하고, 수동으로 의존성을 설치해야 하며, 환경 변수를 일일이 설정해야 합니다.
- 이 과정에서 인재에 의한 실수가 발생할 가능성이 높고, 배포 속도가 느려질 수 있습니다.
Docker 사용시
- 일관된 환경 제공
- Docker 컨테이너는 애플리케이션과 그 의존성을 포함한 이미지를 사용하므로, 모든 환경(개발, 테스트, 운영)에서 동일하게 실행됩니다. 이는 환경 불일치로 인한 문제를 최소화합니다.
- Docker를 사용하여 환경 불일치 문제를 최소화할 수 있지만, Docker 컨테이너는 호스트 시스템에서 실행되기 때문에 호스트 시스템의 설정이나 자원 사용량 등이 Docker 컨테이너에 영향을 줄 수 있습니다.
- 자동화된 배포 과정
- Docker를 사용하면 서버 설정, 의존성 설치, 환경 변수 관리가 자동화되어 배포 과정이 단순해지고 일관성이 높아집니다.
- Docker 이미지를 빌드할 때 모든 필요한 의존성과 설정이 포함되므로, 추가적인 설정이나 설치 과정이 필요 없습니다.
- 확장성과 자원 효율성
- Docker 컨테이너는 가상 머신보다 가볍고 빠르게 실행되며, 자원 효율성이 높습니다.
- 이는 동일한 호스트에서 더 많은 컨테이너를 실행할 수 있게 해주며, 자원 충돌 문제를 최소화합니다.