Post

Docker K8s - Docker를 사용해야하는 이유와 원리

도커가 무엇이고, 어떤 기능이 있는지 그리고 그것이 어떤 이점이 있는지 알아보자.

Docker K8s - Docker를 사용해야하는 이유와 원리

도커란?

도커(Docker)
데이터 또는 프로그램을 격리시키는 기능을 제공하는 소프트웨어다.
도커 컨테이너를 다루는 기능을 제공하는 소프트웨어다.
도커 엔진(Docker Engine)
도커를 사용하기 위한 엔진으로, 도커 컨테이너를 생성하고 구동시킬 수 있다.
도커 컨테이너(Docker Container)
실제 데이터나 프로그램이 격리된 공간을 의미한다.
용량이 허락하는 한 하나의 도커에서 여러개의 도커 컨테이너를 만들 수 있다.
이미지
도커 컨테이너를 만드는 틀과 같은 역할을 한다.
하나의 이미지로 동일한 컨테이너를 여러개 만들 수 있다.

데이터나 프로그램을 격리시켜야하는 이유

대부분의 프로그램은 단독으로 실행되는 것이 아니라, 어떤 실행 환경이나 라이브러리, 다른 프로그램 등을 이용해 실행되게 된다.

예를 들어 하나의 서버에서 실행되고 있는 두개의 자바 기반의 웹 서비스가 있다고 가정할 때, jdk를 사용하게 된다.
이 두개의 웹서비스가 처음에는 8버전의 jdk를 사용하고 있었는데, 하나의 서비스는 java 버전을 상향하기 위해 21버전의 jdk를 설치하고 환경변수를 바꾼다면
기존에 8버전을 사용하고 있던 웹서비스에 문제가 발생하게 된다.
(물론 웹서비스마다 jdk의 경로를 따로 지정하는 방법도 있다.)

예시

위의 예시 외에도 소프트웨어나 라이브러리, 디렉터리 등에서 같은 일이 발생할 수 있다.

이러한 문제의 대부분의 원인은 프로그램 간의 공유에 있기에, 데이터나 프로그램을 격리해야 한다.

프로그램의 격리 도커 컨테이너는 완전히 분리된 환경이기에 컨테이너 내에 프로그램은 다른 프로그램과 격리된 상태가 된다. 그렇기에 일반적으로는 한대의 서버에서는 하나만 설치할 수 있는 프로그램도, 하나의 서버에서 도커 컨테이너 여러개를 사용해 여러개 실행할 수 있다.

컨테이너는 옮길 수 있다. 실제로는 컨테이너 자체를 옮기는 것은 아니고, 컨테이너의 정보를 내보내기한 다음, 다른 도커엔진에서 복원하는 형태다. 이런 특성을 이용하면, 운영 서버와 개발 서버의 환경차이로 인한 문제를 원천적으로 방지하거나, 팀원 모두가 동일한 개발환경을 사용하는 것등이 가능하다.

도커의 동작원리

Build source 도커는 커널 위에 도커엔진이 동작하고, 그 위에 각 컨테이너는 유저스페이스를 가지고 있으며 동작한다. 이렇게 커널은 컨테이너에 포함되지 않고 모든 컨테이너가 공유한 덕분에, 도커가 가벼운 것이다.

커널과 유저스페이스란? 운영체제(OS)는 기본적으로 커널과 유저스페이스로 구성된다.

커널
각 프로그램에서 보낸 명령어를 해석하고 하드웨어를 다뤄서 실행하는 역할이다.
운영체제의 핵심이다.
유저스페이스
커널 외의 명령어를 전달받거나 커널이 실행한 결과를 프로그램에게 전달하는 역할이다.
쉘, 라이브러리, 유틸리티등이 여기에 포함된다.
도커, 가상 머신(VM), EC2 비교
가상머신(VirtualBox, VMware, EC2)
가상화를 통해 물리적인 하드웨어를 소프트웨어로 구현한 환경이다.
각 가상 머신(인스턴스)이 독립적인 운영체제(OS)를 포함하고 있어 무겁다.
대표적으로 VirtualBox, VMware, 그리고 AWS EC2 인스턴스가 있다.
도커
실행 환경을 독립적으로 격리한 컨테이너를 제공하며, 커널을 공유하여 경량화되어 가볍다.
따라서 도커 컨테이너는 가상 머신보다 가볍고 빠르게 실행됨.

도커는 원래 리눅스용?

도커는 리눅스 컨테이너 기술을 기반으로 동작하도록 설계되었으며, 기본적으로 리눅스 환경에서 실행된다. 그렇기에 도커 컨테이너에서 동작할 프로그램도 리눅스용 프로그램이어야한다.

윈도우나 macOS에서 도커를 사용할 수 있는 방법도 있긴한데, 어떤 형태로든 리눅스 운영체제를 갖춰야한다. Build source

  • 가상머신(VirtualBox, VMware)를 이용해 가상 환경에서 리눅스 운영체제를 설치한 다음 그 위에서 도커를 실행한다.
  • 윈도우용 또는 macOS용 도커 데스크톱처럼 도커를 실행하는데 필요한 리눅스 운영체제를 포함하는 패키지를 설치해 사용한다.

도커 허브와 이미지, 컨테이너

도커 엔진 간의 이동

Build source

  • 이미지로 컨테이너 생성하기 이미지는 컨테이너를 만드는데 사용된다. 이미지가 빵 틀이고 실제 만들어진 내용이 컨테이너로, 1개의 이미지만 있어도 여러 개의 컨테이너를 만들 수 있다.

  • 컨테이너로 이미지 생성하기 이와 반대인 컨테이너로 이미지를 만드는 것도 가능하다. 설정 값을 변경하거나 일부 내용을 수정한 컨테이너를 가지고 이미지를 만든다면, 변경 사항을 가지고 있는 이미지를 만들게 된다. 그리고 그걸로 다시 이미지를 만든다면, 그 컨테이너에도 변경 내용이 적용되어있다.

이것을 이용하면 도커 엔진 간의 이동이 가능해지는데, 이동할 곳에다가 도커 엔진을 설치하고, 컨테이너를 이미지로 만들어 옮긴 뒤, 그 이미지로 다시 컨테이너를 만들면된다. 물론 컨테이너 자체를 옮기는 것과는 약간 다르고, 컨테이너 자체를 옮기는 것은 불가능하다.

도커 허브와 이미지

도커 허브
공식적으로 운영되는 도커 레지스트리다.
누구든지 편리하게 이용할 수 있다.
한번에 여러가지 소프트웨어가 포함된 것등 다양한 도커 이미지가 존재한다.
도커 허브를 사용하지 않고, 사내에서 비공개 도커 레지스트리를 두는 것도 가능하다.

여기서 안전한 이미지를 선택하려면,

  • 공식 이미지(도커에서 직접 배포하거나 해당 소프트웨어를 개발, 관리하는 기업에서 제공하는 이미지)를 이용
  • 커스텀 이미지를 직접 만들어서 사용 운영체제가 포함된 이미지에 소프트웨어를 넣어서 커스텀 이미지를 만들어 사용

한 컨테이너에 한 프로그램 도커를 사용할 때의 원칙 중 하나로, 보안 및 유지 관리 측면에서 유리하기 때문에 많이 사용되는 원칙이다.

유저스페이스를 한 종류로 통일해야할까? 호스트 컴튜너와 컨테이너 또는 컨테이너 간의 배포판이나 버전이 차이가 있어도 아무런 문제가 없다. 다만, 컨테이너에 로그인할 필요가 있거나 특정 DBMS를 사용할 때에는 운영체제 종류에 따라 문제를 일으킬 수 있으니 배포판을 정확히 선택해야한다.

도커 컨테이너의 생애주기와 데이터 저장

도커 컨테이너의 생애주기

도커의 컨테이너는 일회용품과 같이 변경사항이 생기면 컨테이너를 변경하지 않고, 기존 컨테이너는 버리고 변경사항을 적용한 새로운 컨테이너를 생성해 사용한다. 컨테이너는 쉽게 생성할 수 있기 때문에, 하나를 지속적으로 업데이트하며 사용하는 것보다 새로운 버전의 컨테이너를 생성하여 사용하는 것이 일반적이다 그래서 도커 컨테이너는 만들고 -> 실행하고 -> 종료한뒤 -> 폐기라는 생애주기를 갖게 되었다.

데이터의 저장

이렇게 컨테이너를 폐기한다면, 안에서 편집했던 파일은 전부 사라진다. 그래서 보통 토커가 설치된 물리서버의 디스크를 마운트해 디스크에 데이터를 저장한다. 그렇다면, 새로운 버전의 컨테이너를 생성해 실행했을 때 데이터가 유지되게 된다.

도커의 특징과 장단점

독립된 환경
여러 개의 컨테이너를 띄우는 것도, 같은 애플리케이션을 여러 개 띄우는 것도 가능하다.
그중 일부를 교체하거나 수정할 수 있다.
커스텀 이미지 생성
이미지를 만들고, 도커 허브에서 공유할 수 있으며, 이미지를 내려받기만 하면 컨테이너를 사용할 수 있다.
이동성이 좋아, 환경이동이나 개발환경 구축 또한 쉽다.
가벼움
컨테이너에 커널이 포함되지 않아 가볍다.
편리한 서버 관리
컨테이너의 업데이트 보다 폐기 후 다시 만들어 실행하면 되어서 최신 상태로 유지하는 것이 쉬운 구조다.
쉽다
서버를 잘 모르는 초보자라도 명령어만 익히면 컨테이너를 사용할 수 있다.
This post is licensed under CC BY 4.0 by the author.