# Docker란?

Docker란?
Linux Container 기반의 가상화 플랫폼이다.
  • Docker는 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼입니다. 
  • Docker는 소프트웨어를 컨테이너라는 표준화된 유닛으로 패키징하며, 이 컨테이너에는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는 데 필요한 모든 것이 포함되어 있습니다. 
  • Docker를 사용하면 환경에 구애받지 않고 애플리케이션을 신속하게 배포 및 확장할 수 있으며 코드가 문제없이 실행될 것임을 확신할 수 있습니다.

# Docker의 작동 방식

  • Docker는 코드를 실행하는 표준 방식을 제공합니다. 
  • Docker는 컨테이너를 위한 운영 체제입니다. 
  • 가상 머신[VM]이 서버 하드웨어를 가상화하는 방식과 비슷하게(직접 관리해야 하는 필요성 제거) 
  • 컨테이너[Container]는 서버 운영 체제를 가상화합니다.
  • Docker는 각 서버에 설치되며 컨테이너를 구축, 시작 또는 중단하는 데 사용할 수 있는 간단한 명령을 제공합니다.

# Docker를 사용하는 이유

  • Docker를 사용하지 않고, 개별 local에 Redis, Mysql과 같은 프로그램을 설치하려면, 환경별로 설치 중에 다양한 에러가 발생한다.
  • Docker를 설치하면, Docker Engine 상에서 어느 환경에서나 명령어 하나만으로 동일한 서비스를 설치하고, 쉽게 접근이 가능하다.

# Docker Container와 기존 VmWare VM 기술의 공통점 & 차이점

둘 다 격리된 리소스를 가진 실행 환경을 제공하지만,
VM은 HostOS와 별개인 GuestOS를 설치하여 동작하여 무겁고,
Docker Container는 별도의 OS 없이 HostOS의 커널을 공유하므로 실행이 가볍다.
  • Docker: 어플리케이션을 실행할 때는 컨테이너 방식에서는 Host OS 위에 애플리케이션의 실행 패키지인 이미지를 배포하기만 하면 됩니다.
  • VM: VM은 어플리케이션을 실행 하기 위해서 VM을 띄우고 자원을 할당한 다음, 게스트 OS를 부팅하여 어플리케이션을 실행 해야 해서 훨씬 무겁고 복잡하게 실행해야 합니다.
  • 공통점: 도커 컨테이너와 가상 머신은 기본 하드웨어에서 격리된 환경 내에 애플리케이션을 배치하는 방법입니다.
  • 차이점: 가장 큰 차이점은 격리된 환경을 얼마나 격리를 시키는지의 차이
  • Docker Container는 커널은 공유하고 나머지 CPU, 메모리, 하드디스크는 컨테이너 안에 다 격리되어 있습니다.

# Docker Container의 격리 구현 원리

  • Docker 클라이언트와 Docker 서버는 Linux로 되어 있습니다.
  • Linux OS Kernel에서 제공하는 CGroup과 네임스페이스(Namespaces)을 활용하여 구현된다.
  • 이것들은 Container와 호스트에서 실행되는 프로세스 사이에 벽을 만드는 리눅스 커널 기능들입니다.

# Linux Kernel의 C Group & 네임스페이스

  • C Group: CPU, 메모리, Network, HD I/O 등 프로세스 그룹의 시스템 리소스 사용량을 관리
  • 어떤 애플리케이션 사용량이 너무 많다면 그 어플리케이션 같은 것을 C Group에 집어 넣어서 CPU와 메모리 사용 제한 가능 (필요한 만큼만 할당해 줌)
  • 네임스페이스: 하나의 시스템에서 프로세스를 격리시킬 수 있는 가상화 기술
    (별개의 독립된 공간을 사용하는 것처럼 격리된 환경을 제공하는 경량 프로세스 가상화 기술)

# Docker Container란?

 

Docker Container란?
Docker 컨테이너는 Docker 이미지의 인스턴스로써,
어플리케이션이 동작하기 위해서 필요한 요소(실행 파일, 어플리케이션 엔진 등)을 패키지화하고 격리하는 기술이다.

  • 컨테이너란 호스트 OS상에 논리적인 구획(컨테이너)을 만들고, 어플리케이션을 작동시키기 위해 필요한 라이브러리나 어플리케이션 등을 하나로 모아, 마치 별도의 서버인 것처럼 사용할 수 있게 만든 것이다.

 

 

# Docker Image란?

 

Docker Image란?
Docker 컨테이너를 만들기 위해 필요한 설정이나 종속성들을 갖고 있는 소프트웨어 패키지이다.
  • Docker 이미지는 Dockerhub에 다른 사람들이 만들어놓은 이미지를 다운받아 사용할 수도 있고 직접 이미지를 만들어 사용할 수도 있음
  • Docker 이미지는 컨테이너 실행에 필요한 파일과 설정값등을 포함하고 있다.
  • 응용 프로그램을 실행하는데 필요한 모든 것을 포함하고 있습니다.
    • 컨테이너가 시작 될 때 실행되는 명령어 (Dockerfile로 관리)
    • 파일 스냅샷 (ex: 카카오톡이라면 카카오톡을 실행하는데 필요한 파일) - 디렉토리나 파일을 압축시킨 스냅샷

 

# Docker Layer란?

Docker Layer란?
기존 Docker Image 에 추가적인 파일이 필요할 때 다시 다운로드받는 방법이 아닌
해당 변경 내용만을 추가하기 위한 개념이다.
  • 도커의 이미지가 변할때마다 새롭게 다운받는다면 이미지의 용량이 크기에 비효율적이다. 이를 해결하기 위해 Layer라는 개념을 이용한다.
  • 이미지는 여러 개의 읽기 전용(read only) layer로 구성되고, 파일이 추가되면 새로운 Layer가 생성됨. 그리고 도커는 여러 개의 Layer를 묶어서 하나의 파일시스템으로 사용할 수 있게 해준다. 
  • DockerHub 및 개인 저장소에서 이미지를 공유할 때는 바뀐 부분(Layer = image)만 주고받기 가능하다.

 

# Dockerfile이란?

 

Dockerfile 이란?
Docker Image를 만들기 위한 설정 파일이다.
컨테이너가 어떻게 행동해야 하는지에 대한 설정들을 정의하는 파일이다.
  • 도커이미지 생성 과정에 대해 기술.
  • 이미지를 빌드하려면 이미지를 만들고 실행하는 데 필요한 단계를 정의하는 간단한 구문
  • Dockerfile의 각 명령어는 이미지에 레이어를 만듭니다. Dockerfile을 변경하고 이미지를 다시 빌드하면 변경된 레이어 만 다시 빌드된다

# Docker Volume이란?

 

Docker Volume이란?
Container를 삭제하더라도, 로컬 Host PC 디렉토리에 파일이 남아있도록,
컨테이너 디렉토리가 로컬 디렉토리를 참조할 수 있도록 매핑해주는 기능이다.
  • 컨테이너를 삭제하면, MySQL 컨테이너에 존재하던 데이터들이 다 삭제가 됩니다.
  • 이렇게 데이터가 삭제되면 나중에 문제가 될 수 있기 때문에 컨테이너가 중지되더라도 데이터를 보존하는 것이 필요합니다. 이럴 때 사용하는 것이 Volume 입니다.

# Docker Compose란?

Docker Compose란?
멀티 Container 상황에서, 별도의 설정 없이 컨테이너간 네트워크 연결을 용이하게 해주고
멀티 컨테이너를 복합 관리할 수 있는 기능이다.
  • Docker Compose를 사용하지 않고, NodeJS, Redis 컨테이너를 만들어서 컨테이너간 통신을 시도할 경우, 
  • 개별로 생성된 컨테이너간 통신을 할 때, 아무런 설정을 해주지 않으면 상호 접근이 불가능하므로 에러가 발생
  • CLI 명령어에서 --link와 같은 것들을 이용할 수도 있으나, 멀티 컨테이너 상황에서 쉽게 네트워크를 연결시켜주기 위해서는 Docker Compose를 이용하는 것이 좋다.
  • Docker Compose를 사용하면 위와 같이 두 개의 컨테이너를 Service를 통해서 연결시켜줘서 컨테이너 간의 통신을 할 수 있게 된다.
  • Docker 명령어를 하나하나 입력하는 것보다yml 파일에서 docker-compose를 이용해서 사용하는 것이 더 편리하다는 장점이 있습니다.
  • Docker compose를 별도로 설치가 필요하고, docker-compose.yml 파일에서, dockerfile을 참조하여 build할 수도 있다.

 

 

# 가상화 VM 기술 설명

  • 가상화 기술 나오기 전
  • 한대의 서버를 하나의 용도로만 사용
  • 남는 서버 공간 그대로 방치
  • 하나의 서버에 하나의 OS, 하나의 프로그램만을 운영
  • 안정적일 수 있지만 비효율적
  • 하이퍼 바이저 기반의 가상화 등장
  • 논리적으로 공간을 분할하여 VM이라는 독립적인 가상 환경의 서버 이용 가능
  • 하이퍼 바이저는 호스트 시스템에서 다수의 게스트 OS를 구동할 수 있는 소프트웨어
  • 하드웨어를 가상화하면서 하드웨어와 각각의 VM을 모니터링하는 중간 관리자
  • 하이퍼바이저 아래에 기존 OS가 존재하고 그 위에 Guest OS가 존재하는 것을 볼 수 있습니다.
  • 하이퍼바이저에 의해 구동되는 VM은 각 VM마다 독립된 가상 하드웨어 자원을 할당 받음
  • 논리적으로 분리 되어 있어서 한 VM에 오류가 발생해도 다른 VM으로 퍼지지 않는다는 장점이 있음
  • VMWare의 개별 VM들이 하이퍼 바이저 기반에서 동작하듯이, Docker의 Docker Container들은 Docker Engine 기반에서 동작한다.

# Docker의 구성요소와 아키텍처

Docker의 아키텍처란?
Docker는 Docker Client와 Docker Deamon(Server) 간의 Rest API를 통해 통신하며, Docker Resistry (Docker Hub)를 통해, 다양한 Docker Image를 쉽게 다운로드할 수 있도록 지원한다.
  • Docker는 클라이언트-서버 아키텍처이다. 도커 클라이언트와 도커 데몬이RestApi를 사용하여 통신한다.

# Docker 데몬

  • Docker Api 요청수신, 이미지,컨테이너,네트워크와 같은 도커 객체 및 도커 서비스 관리
  • Docker 클라이언트
  • Docker 사용자가 Docker와 상호작용하기 위한 방법. 기본적인 도커명령어를 통해서 Docker 데몬과 통신

# Docker 레지스트리

  • Docker 이미지를 저장, Docker hub이라는 공용 레지스트리와 개인private한 레지스트리가 있다. 
  • 일반적으로 공용 레지스트리에서 실행
    (cf) docker pull, docker run: 사용하면  필수이미지 가져온다.
    (cf) docker push: 레지스트리에 저장

# Docker 객체

  • 도커 이미지: 도커 이미지는 컨테이너 실행에 필요한 파일과 설정값등을 포함하고 있다.
  • 컨테이너 : 컨테이너는 도커 이미지의 실행 가능한 인스턴스입니다.

 

# 출처

- https://aws.amazon.com/ko/docker/

- https://devlog-wjdrbs96.tistory.com/278

 

 

# Docker : 서버 인프라를 VM 기반에서 Container 중심으로

2013년 등장한 도커[Docker]는 인프라 세계를 컨테이너[Container] 세상으로 바꿔버렸습니다. 수많은 애플리케이션이 컨테이너로 배포되고 도커파일을 만들어 이미지를 빌드하고 컨테이너를 배포하는 게 흔한 개발 프로세스가 되었습니다

 

'[CDS] DevOps > Docker' 카테고리의 다른 글

[Docker ] Docker 실습  (0) 2022.05.04
Docker 명령어 핵심만 이해하기  (0) 2020.11.26
Docker 사용법  (0) 2020.11.24
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기