Infra/Docker
[Docker] Docker란 무엇인가?
chchae01
2023. 12. 3. 15:13

Docker의 역사
등장배경
- 서버 환경은 발전하고 개발자들은 그에 맞춰 계속해서 서버 환경을 업데이트하고 바꿔줘야 한다.
- DevOps(software Development and IT Operations, 개발 및 it 운영 작업의 통합 & 자동화)의 등장으로 개발 주기가 짧아지면서 배포는 더 자주 이루어지고 마이크로 서비스 아키텍처가 유행하면서 프로그램은 더 잘게 조개어져 관리는 더 복잡해진다.
- 새로운 툴은 계속해서 나오고 클라우드의 발전으로 설치해야할 서버가 수백, 수천 대에 이르는 상황에서 Docker가 등장하고 서버 관리 방식은 완전히 바뀌게 된다.
Docker란?
Docker
- Docker는 컨테이너 기반의 오픈소스 가상화 플랫폼이다.
- 컨테이너 : 서버에서 말하는 컨테이너란 다양한 프로그램 실행환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공하여 프로글매의 배포 및 관리를 단순하게 해준다.
- 백엔드 프로그램, 데이터베이스 서버, 메시지 큐 등 어떠 ㄴ프로글매도 컨테이너로 추상화할 수 있고, 조립 PC, AWS, Azure, Google cloud 등 어디에서든 실행할 수 있다.
Container
- 컨테이너는 격리된 공간에서 프로세스가 동작하는 기술이다.
- 기존의 방식(호스트형 가상화 방식)
- OS를 가상화
- VMware나 VirtualBox 같은 가상머신은 호스트 OS 위에 게스트 OS 전체를 가상화하여 사용하는 방식
- 여러가시 OS를 가상화할 수 있고 비교적 사용법이 간단하지만 무겁고 느려서 운영 환경에서는 사용할 수 없다.
- KVN, XEN
- 호스트형 가상화 방식을 개선하기 위해 CPU의 가상화기술을 이용한 KVN(Kernel-based Virtual Machine)과 반가상화(Paravirtaulization) 방식의 Xen이 등장
- 게스트 OS가 필요하긴 했지만 전체 OS를 가상화하는 방식이 아니기 때문에 호스트형 가상화방식에 비해 성능이 향상되었다.
- 클라우드 서비스(OpenStack, AWS, ...)에서 가상 컴퓨팅 기술의 기반
- 프로세스 격리 방식
- 전가상화든 반가상화든 추가적인 OS를 설치하여 가상화하는 방법은 성능 문제가 있었고 이를 개선하기 위해 프로세스 격리 방식이 등장했다.
- ex) 리눅스의 '리눅스 컨테이너' 방식
- 단순히 프로세스를 격리시키기 때문에 가볍고 빠르게 동작한다.
- CPU나 메모리는 딱 프로세스가 필요한 만큼만 추가로 사용하고 성능적으로도 거의 손실이 없다.
- ex) 리눅스의 '리눅스 컨테이너' 방식
- 하나의 서버에 여러개의 컨테이너를 실행하면 독립적으로 실행되어 마치 가벼운 VM을 사용하는 느낌을 준다.
- 실행중인 컨테이너에 접속해 명령어를 입력할 수 있고 패키지를 설치할 수 있다.
- CPU나 메모리 사용량을 제한할 수 있다.
- 호스트의 특정 포트와 연결하거나 호소트의 디렉토리를 내부 디렉토리인 것처럼 사용할 수 있다.
- 새로운 컨테이너를 생성하는 시간은 겨우 1~2초로 가상머신과 비교도 안되게 빠르다.
- 전가상화든 반가상화든 추가적인 OS를 설치하여 가상화하는 방법은 성능 문제가 있었고 이를 개선하기 위해 프로세스 격리 방식이 등장했다.

Image
- 이미지는 컨테이너 실행에 필요한 파일과 설정값 등을 포함하고 있는 것이다.
- 상태값을 가지지 않고 변하지 않는다.
- 컨테이너는 이미지를 실행한 상태라고 불 수 있고 추가되거나 변하는 값은 컨테이너에 저장된다.
- 같은 이미지에서 여러개의 컨테이너 생성이 가능하다.
- 컨테이너의 상태가 바뀌거나 삭제되더라도 이미지는 변하지 않는다.
- 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 더이상 의존성 파일을 컴파일하고 이것저것 설치할 필요가 없다.
- 새로운 서버가 추가되면 미리 만들어놓은 이미지(ex. debian을 기반으로 MySQL을 실행하는데 필요한 파일과 실행 명령어, 포트 정보 등을 가짐)를 다운받고 컨테이너(ex. mysql)를 생성만 하면 된다.
- 도커 이미지는 Docker Hub에 등록하거나 Docker Registry 저장소를 직접 만들어 관리할 수 있다.

Docker를 사용하는 이유
레이어 저장방식

- 도커 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 보통 용량이 수백메가에 이른다.
- 도커는 여러 이미지를 효율적으로 저장하기 위해 레이어라는 개념을 사용해 파일 시스템을 이용하여 여러개의 레이어를 하나의 파일시스템으로 사용할 수 있게 해준다.
- 컨테이너를 사용할 때도 레이어 방식을 사용하는데 기존의 이미지 레이어 위에 읽기/쓰기 레이어를 추가한다.
- 이미지 레이어를 그대로 사용하면서 컨테이너가 실행 중에 생성하는 파일이나 변경된 애용은 읽기/쓰기 레이어에 저장되므로 여러개의 컨테이너를 생성해도 최소한의 용량만 사용한다.
이미지 경로
- 이미지는 url 방식으로 관리하며 태그를 붙일 수 있다.
- 이해하기 쉽고 편리하게 사용 가능하다.
- 태그 기능을 잘 이용하면 테스트나 롤백도 쉽게 할 수 있다.
Dockerfile
- 도커는 이미지를 만들기 위해 Dockerfile이라는 파일 자체 DSL(Domain Specific Language)언어를 이용해 이미지 생성 과정을 적는다.
- 과거에는 서버에 어떤 프로그램을 설치하려고 의존성 패키지를 이것저것 설치하고 설정 파일을 만들었다.
- 그 과정을 따로 정리하지 않고 Dockerfile로 관리하면
- 소스와 함께 버전 관리 가능!
- 누구나 이미지 생성 과정을 보고 수정 가능!
Docker Hub
- 큰 용량의 도커 이미지를 서버에 저장하고 관리하는 것은 쉽지 않다.
- 도커는 Docker Hub를 통해 공개 이미지를 무료로 관리해준다.
Command와 API
- 도커 클라이언트의 커맨드 명령어는 직관적이고 사용하기 쉽다.
- HTTP 기반의 RestAPI도 지원하여 확장성이 좋고 훌륭한 3rd party 툴이 나오기 좋은 환경이다.