Intro
DevOps의 등장으로 개발 주기가 짧아지면서 배포는 더 자주 이루어지고 MSA가 유행하면서 프로그램은 더 복잡해졌다.
많은 새로운 툴의 등장과 클라우드의 발전으로 설치해야 할 서버가 무수히 많은 상황에서
도커(Docker)가 등장하고 서버 관리 방식이 완전히 바뀌게 된다.
1. 도커(Docker): 컨테이너 기반의 오픈소스 가상화 플랫폼
서버에서의 컨테이너는 다양한 프로그램, 실행 환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순하게 해 준다.
백엔드 프로그램, 데이터베이스 서버, 메시지 큐 등 어떤 프로그램도 컨테이너로 추상화할 수 있고 조립 PC, AWS, Azure, Google Cloud 등 어디서든 실행할 수 있다.
컨테이너: 격리된 공간에서 프로세스가 동작하는 기술
기존의 가상화 방식은 주로 OS를 가상화하는 형식이었다. 이는 사용법이 간단하지만 무겁고 느려서 운영환경에선 사용할 수 없었다.
이러한 상황을 개선하기 위해 CPU의 가상화 기술(HVM)을 이용한 KVM(Kernel-based Virtual Machine)과 반가상화 방식의 Xen이 등장했다.
이 방식은 게스트 OS가 필요하긴 하지만 전체 OS를 가상화하는 방식이 아니었기 때문에 호스트형 가상화 방식에 의해 성능이 향상되었다. 이러한 기술들은 OpenStack이나 클라우드 서비스에서 가상 컴퓨팅 기술의 기반이 되었다.
- 가상머신(VMware, VirtualBox): 호스트 OS 위에 게스트 OS 전체를 가상화하여 사용하는 방식(전가상화 방식)
- 전가상화(Full virtualization): 하드웨어(호스트 서버 장치)를 완전하게 가상화하는 방식. 게스트 OS는 모든 하드웨어 접근 명령을 하이퍼바이저를 통해 진행한다. 게스트 OS를 수정할 필요가 없는 장점이 있다.
- 호스트 OS: 호스트에 설치된 OS, 물리 머신에 설치된 OS
- 게스트 OS: 가상머신에 설치된 OS. 즉, 서비스 운영 환경을 이미지로 생성한 후 서버에 배포하여 실행한다.
만약 서비스 운영 환경이 변경되면 운영 환경 자체를 수정하는 것이 아닌 처음부터 다시 배포하는 방식이다. - 하이퍼바이저: 컴퓨터에서 다수의 운영체제를 실행하기 위한 논리적인 플랫폼(소프트웨어)
- 반가상화: 하이퍼바이저가 모든 명령을 중재하지 않고 필요한 부분만 처리한다. 전가상화와 다르게 직접 하이퍼바이저에게 하이퍼콜을 요청하여 통신한다. 게스트 OS 커널의 일부분을 수정해야 하기 때문에 게스트 OS는 오픈 소스에 한정된다.
하지만 추가적인 OS를 설치하여 가상화하는 방법은 성능 문제가 발생했고,
이를 개선하기 위해 프로세스를 격리하는 방식이 등장했다.
리눅스에서는 이 방식을 리눅스 컨테이너라고 한다.
단순히 프로세스를 격리시키기 때문에 가볍고 빠르게 동작한다. CPU나 메모리는 프로세스가 필요한 만큼만 추가로 사용하고, 성능적으로도 손실이 거의 없다.
하나의 서버에 여러 개의 컨테이너를 실행하면 서로 영향을 미치지 않고 독립적으로 실행되어 가벼운 가상머신을 사용하는 느낌을 준다.
실행 중인 컨테이너에 접속하여 명령어를 입력할 수 있고 apt-get 이나 yum 으로 패키지를 설치할 수 있다.
사용자도 추가하고 여러 개의 프로세스를 백그라운드로 실행할 수 있다.
CPU나 메모리 사용량을 제한할 수 있고 호스트의 특정 포트와 연결하거나 호스트의 특정 디렉토리를 내부 디렉토리인 것처럼 사용할 수 있다.
여기서 새로운 컨테이너를 만드는 데 걸리는 시간은 겨우 1~2초로, 가상머신과 비교할 수 없을 정도로 매우 빠르다.
이미지(Image): 컨테이너 실행에 필요한 파일과 설정 값 등을 포함하고 있는 것
이미지는 상태 값을 가지지 않고 변하지 않는다(Immutable).
컨테이너는 이미지를 실행한 상태라 할 수 있고, 추가되거나 변하는 값은 컨테이너에 저장된다.
같은 이미지에서 여러 개의 컨테이너를 생성할 수 있고 컨테이너의 상태가 바뀌거나 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아 있다.
ubuntu 이미지는 ubuntu를 실행하기 위한 모든 파일을 가지고 있고, MySQL 이미지는 debian을 기반으로 MySQL을 실행하는 데 필요한 파일과 실행 명령어, 포트 정보 등을 가지고 있다.
말 그대로 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 더 이상 의존성 파일을 컴파일하고 이것저것 설치할 필요가 없다!
이제 새로운 서버가 추가되면 미리 만들어 놓은 이미지를 다운 받고 컨테이너를 생성하기만 하면 된다.
한 서버에 여러 개의 컨테이너를 실행할 수 있고, 수천 대의 서버도 문제 없다.
도커 이미지는 Docker hub에 등록하거나 Docker Registry 저장소를 직접 만들어 관리할 수 있다.
누구나 쉽게 이미지를 만들고 배포할 수 있다.
도커는 이미 존재하는 기술을 잘 포장한 기술이다.
이미 존재하는 기술을 잘 조합하고 사용하기 쉽게 만들었으며, 사용자들이 원하는 기능을 간단하지만 획기적인 아이디어로 구현하였다.
1) 레이어 저장방식
도커 이미지는 컨테이너를 실행하기 위한 모든 정보를 갖고 있기 때문에 용량이 수백 MB 에 이른다.
처음 이미지를 다운 받을 땐 크게 부담이 안 되지만, 기존 이미지에 파일 하나 추가했다고 수백 MB 를 다시 다운 받는다면 매우 비효율적이다.
도커는 이런 문제를 해결하기 위해 레이어(Layer)라는 개념을 사용하고 유니온 파일 시스템을 이용하여 여러 개의 레이어를 하나의 파일 시스템으로 사용할 수 있게 해 준다.
이미지는 여러 개의 읽기 전용 레이어로 구성되고, 파일이 추가되거나 수정되면 새로운 레이어가 생성된다.
ubuntu 이미지가 A + B + C 의 집합이라면, ubuntu 이미지를 베이스로 만든 nginx 이미지는 A + B + C + nginx 가 된다.
webapp 이미지를 nginx 이미지 기반으로 만들었다면 A + B + C + nginx + source 레이어로 구성된다.
webapp 소스를 수정하면 A, B, C, nginx 레이어를 제외한 새로운 source(v2) 레이어만 다운 받으면 되기 때문에 효율적으로 이미지를 관리할 수 있다.
컨테이너를 생성할 때도 레이어 방식을 사용하는데 기존의 이미지 레이어 위에 읽기/쓰기(read-write) 레이어를 추가한다.
이미지 레이어를 그대로 사용하면서 컨테이너가 실행 중에 생성하는 파일이나 변경된 내용은 읽기/쓰기 레이어에 저장되므로 여러 개의 컨테이너를 생성해도 최소한의 용량만 사용한다.
2) 이미지 경로
이미지는 url 방식으로 관리하며 태그를 붙일 수 있다.
ubuntu 14.04 이미지: docker.io/library/ubuntu:14.04 <- docker.io/library는 생략 가능(ubuntu:14.04)
docker.io/library/ubuntu:trusty
태그 기능을 이용하면 테스트 및 롤백도 쉽게 가능하다.
3) Docker File
# vertx/vertx3 debian version
FROM subicura/vertx3:3.3.1
MAINTAINER chungsub.kim@purpleworks.co.kr
ADD build/distributions/app-3.3.1.tar /
ADD config.template.json /app-3.3.1/bin/config.json
ADD docker/script/start.sh /usr/local/bin/
RUN ln -s /usr/local/bin/start.sh /start.sh
EXPOSE 8080
EXPOSE 7000
CMD ["start.sh"]
도커는 이미지를 만들기 위해 Dockerfile 이라는 파일에 자체 DSL(Domain-Specific Language) 언어를 이용하여 이미지 생성 과정을 적는다.
서버에 어떤 프로그램을 설치하려고 의존성 패키지를 설치하는 등 설정 파일을 만들었던 경험이 있다면 그 과정을 블로깅하지 않고 Dockerfile 로 관리하면 된다.
이 파일은 소스와 함께 버전 관리가 되고, 원한다면 누구나 이미지 생성 과정을 보고 수정할 수 있다.
4) Docker Hub
도커는 Docker Hub를 통해 공개 이미지를 무료로 관리해 준다.
5) Command와 API
도커 클라이언트의 커맨드 명령어는 대부분 직관적이고 사용하기 쉬워 컨테이너의 복잡한 시스템 구성을 이해하지 못 하더라도 편하게 사용할 수 있다.
HTTP 기반의 REST API도 지원하여 확장성이 좋고, 훌륭한 3rd party 툴이 나오기 좋은 환경이다.
2. Docker의 장점
1) 빠르고 가벼운 가상화 솔루션
호스트의 운영체제를 공유하여 필요한 최소한의 리소스만 할당 받아 동작하는 방식이므로 가볍다.
즉, 기존 Hypervisor 엔진을 사용하지 않고 Docker 엔진을 통해 게스트 OS 없이 실행할 수 있다. 게스트 OS가 없기 때문에 가상머신보다 훨씬 빠른 실행 속도를 보장할 수 있다.
하드웨어 가상화를 하지 않기 때문에 메모리 엑세스, 파일 시스템, 네트워크 실행 성능도 뛰어나다.
2) 개발 언어에 종속되지 않는다.
개발 언어나 툴에 상관 없이 어떠한 애플리케이션도 만들 수 있다.
도커에서 만들어진 애플리케이션은 이동성이 뛰어나며 어디서나 실행될 수 있다.
3) 보안성
서비스 해킹 시에도 각 컨테이너들은 격리되어 있으므로 원래의 서버에 영향을 미치지 않는다.
출처:
https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html
https://goddaehee.tistory.com/251
'log.info' 카테고리의 다른 글
[Docker] 이미지, 컨테이너 요약 (0) | 2024.06.13 |
---|---|
[Docker] 이미지 만들기 (0) | 2024.05.29 |
[Docker] 컨테이너 업데이트, Docker Compose (0) | 2024.05.28 |
[Docker] 컨테이너 실행 및 도커 기본 명령어 (0) | 2024.05.28 |
[Docker] 설치 (0) | 2024.05.28 |