[Docker] 기본 개념

 

가상화

  • 개발 시에는 주로 운영 서버가 아닌 Local에서 개발을 한다. 이 때, 개발을 진행한 Local서버와 Production 서버의 OS가 다를 경우 라이브러리 등을 설치할 때 다르게 진행을 해야 하고, 또한 OS가 같더라도 Local과 Production의 환경 변수 차이로 인해 제대로 동작하지 않을 수 있다.
  • 이러한 문제를 해결하기 위해 README 등에 환경 설정을 기록하고 실행하지만, 이는 사람이 직접 수행해야 하므로 에러가 발생하기 쉽고, 여러 서버에서 반복해야 하는 번거로움이 있다.
  • 이를 위해 가상화를 진행한다. 가상화란 서버환경까지 모두 한번에 소프트웨어화하여 어디서든 동일한 환경이 되도록 하는 것이다. 이를 통해 특정 소프트웨어 환경을 만들어 Local과 Production서버에 그대로 사용함으로써, 개발과 운영 서버의 환경을 일치 시킬 수 있다.
  • 과거에는 이 가상화를 위해 VM(Virtual Machine)을 사용하였다. VM이란 실제 물리적 컴퓨터(Host Machine) 위에 OS를 포함한 가상화 소프트웨어를 두는 방식이다.
  • 하지만 이 VM은 OS 위에 OS를 하나 더 두기에 리소스를 굉장히 많이 사용한다는 단점이 있다. 이런 단점을 극복하기 위해 Container를 사용한다. Container는 VM과 달리 OS 위에 OS를 두지않고, Host의 OS를 공유하기에 VM보다 더 가볍고 빠른 경량화된 가상화 프로세스이다.

Docker

  • Docker는 Container 기술을 쉽게 사용할 수 있도록 나온 도구로서, Container를 활용하여 개발자가 Application을 가볍고, 이식 가능하며, 일관된 방식으로 Application과 그 실행 환경을 빌드, 배포, 실행할 수 있도록 도와주도록 설계된 오픈 소스 플랫폼이다.
  • Docker의 장점
    1. Portability: 개발자 환경, 테스트 서버, Cloud서버에서 동일한 환경으로 설정 가능하다.
    2. Scalability: Docker Container는 필요한 만큼 늘릴 수 있어, 트래픽이 몰릴 경우 Horizontal Scaling으로 트래픽을 분산시킬 수 있다.
    3. Speed: Container는 VM과 달리, OS 커널을 공유하기 때문에 속도가 더 빠르다.
    4. Efficiency: Container는 필요한 라이브러리와 애플리케이션만 포함하기 때문에 리소스(메모리, CPU)를 VM보다 적게 사용한다.
    5. Consistency
  • Docker의 주요 구성 요소
    1. Docker Engine: Container들을 관리하는 엔진으로 Container를 생성, 실행 관리하는 프레임 워크이다.
    2. Docker Image: Scripting된 Docker File로부터 만들어진 바이너리 파일로 Read-Only이다.
    3. Docker Container: 일반화된 Docker Image를 기반으로 실제 실행 중인 인스턴스로 Docker Container간의 Communication이 가능하다.
    4. Docker File: Docker Image를 정의하는 Script파일이다.
    5. Docker Compose: 여러 Docker Container를 실행할 수 있는 도구다.
    6. Docker Hub: Docker Image를 저장, 공유하는 Cloud 기반의 저장소이다.
  • Docker의 Workflow
    1. 개발 환경을 정의한 Docker File을 작성
    2. Docker Image를 Build한다.

       docker build -t {이미지 이름}
      
    3. Docker Image로부터 Container를 실행한다.

       docker run -d -p {연결할 포트번호} {이미지 이름}
       # -d: Demon(백그라운드)로 돌아가게 하는 것
       # -p: 포트를 연결하는 것
      
    4. Docker Image를 Docker Hub나 다른 저장소에 저장한다.

       docker push {저장할 이미지}
      
    5. Production에서 Container를 적용한다.

Docker Volume

  • Docker Container는 Image 위에 writable layer를 덧붙여 실행되는 인스턴스이다. 이 writable layer는 컨테이너와 함께 존재하기 때문에, 컨테이너를 삭제하면 내부에 저장했던 파일도 함께 사라진다. → 즉, Container는 휘발성
  • 이러한 컨테이너의 휘발성을 보완하기 위해 나온 개념이 Docker Volume으로 Docker Volume은 컨테이너 외부에 존재하며, Docker 엔진이 직접 관리하는 독립적인 저장소이다. 즉, 특정 host 디렉토리에 종속되지 않고 Docker 자체가 데이터를 관리한다.
  • 이를 통해 데이터의 영속성(persistence)을 보장하고, 여러 컨테이너 간 데이터 공유도 가능하다.
  • Docker Volume의 종류
    1. Anonymous Volume: 이름 없이 생성되는 볼륨으로, 컨테이너 실행 시 자동으로 만들 수 있다.
    2. Named Volume: 이름을 붙여준 볼륨으로 관리 및 재사용이 쉽다.
    3. Bind Mounts: Local과 Container의 디렉토리를 연결한 것으로 Docker외부에서 관리한다.

Docker Compose

  • Docker Compose는 Local 환경에서 여러 개의 Docker 컨테이너를 동시에 실행하고 관리할 수 있게 해주는 도구이다. → 즉, 복잡한 애플리케이션을 단일 애플리케이션처럼 관리할 수 있다.(Multi-Container Orchestration)
  • compose.yml 파일에 services, volumes, networks 등을 정의하고, 설정된 모든 서비스를 한 번에 생성 및 실행할 수 있다.
  • compose.yml 파일에 정의된 서비스들은 서로 독립적이며(Service Independence), 개발·스테이징·운영 환경 등에서 일관성 있게 재사용할 수 있다.(Portability)
  • 또한 단순한 명령어로 쉽게 환경을 구성하거나 해제할 수 있으며(Simplified Workflow), compose.yml 파일을 통해 서비스와 네트워크를 선언적으로 간단히 정의할 수 있다.(Declarative Configuration)