개발 R.I.P.

9.17 Dev.Feedback (Docker)

편행 2021. 9. 17. 12:03
반응형

Docker

도커(Docker)는 리눅스 컨테이너(Linux Container) 기술을 기반으로 하는 오픈 소스 서비스이다. 도커를 통해 애플리케이션 실행 환경을 코드로 작성할 수 있으며, OS를 격리화하여 관리한다. 짧게 요약한 문장에서도 도커, 리눅스 컨테이너, 실행 환경, OS, 격리화라는 단어가 등장하는데, 도커에 대해 설명할 때 자주 등장하는 단어들이고 아직 생소한 단어들이다. 그래서 이런 단어들을 정리하면서 단어를 이해해보려 한다.

 

Linux Container 란?

Linux Container는 Linux 기반의 기술 중 하나로, 필요한 라이브러리와 애플리케이션을 모아서 마치 별도의 서버처럼 구성한 것을 말한다. 컨테이너를 이루는 네트워크 설정, 환경 변수 등의 시스템 자원은 각 컨테이너가 독립적으로 소유하고 있다.

  1. 프로세스의 구획화
  • 특정 컨테이너에서 작동하는 프로세스는 기본적으로 그 컨테이너 안에서만 액세스 할 수 있다.
  • 컨테이너 안에서 실행되는 프로세스는 다른 컨테이너의 프로세스에게 영향을 줄 수 없다.
  1. 네트워크의 구획화
  • 기본으로 컨테이너 하나에 IP 주소가 할당되어 있다.
  1. 파일 시스템의 구획화
  • 컨테이너 안에서 사용되는 파일 시스템은 구획화되어 있다. 그래서 해당 컨테이너에서의 명령이나 파일 등의 액세스를 제한할 수 있다.

그렇다면 리눅스 컨테이너는 기존에 이용해오던 가상 머신과 비슷하지 않을까?

비슷해 보일 뿐, 가상화와는 다른 기술이다. 

Docker 는 어떤 문제를 해결할 수 있을까?

CASE 1 - 환경 표준화

 

대표적인 운영 체제(OS)는 Linux, Windows, MacOS로 구분할 수 있다. 그리고 엔지니어는 자신이 개발하는 애플리케이션이 어떤 환경에서 구동될지 생각하고 개발해야 한다. 그리고 개발하려고 하는 여러 애플리케이션을 구동하는 운영체제가 서로 다르다면 환경에 따라 조금씩 변경할 부분이 발생하게 된다. 같은 Linux 인 Ubuntu, CentOS, Debian 은 서로 다른 환경이므로 여러 버전이 존재할 수도 있다.

예를 들어, 윈도우에서 개발한 애플리케이션에서의 경로는 백슬래시(\)를 폴더로 표현하고, Mac 이나 Linux에서 경로는 슬래시(/)를 폴더로 표현한다. 이 예시는 아주 작은 예시일 뿐, 환경이 다르다면 개발자들이 조정할 문제가 수도 없이 생기며, 수작업으로 환경을 맞추는 일은 쉬운 일이 아니기에 각각의 환경에 맞는 설정을 적용하다보면, 엄청난 시간이 걸리게 되는 것이다.

CASE 2 - 수작업으로 일치시키는 환경 구성

모든 애플리케이션을 동일한 OS 환경에서 구동한다면, 애플리케이션 환경 구성이 빨라질까?

모든 개발자와 사용자가 동일한 OS 환경을 유지하는 경우, 어느 정도는 빨라질 수 있다. 예를 들어, OS를 Windows로 지정해서 개발자와 사용자가 항상 같은 OS(Windows)를 사용한다고 가정해보자. 그럼 각기 다른 OS를 고려한 빌드 및 테스트 시간은 줄일 수 있을 것이다.

개발된 애플리케이션을 내 컴퓨터에 설치해 사용하고자 할 때, '내 컴퓨터' 혹은 '내 사용 목적'에만 맞는 설정이 따로 필요할 수 있다. 예를 들어 환경 변수처럼, 같은 OS라도 사용자에 따라 달라지는 구성이 있다.

애플리케이션을 설치할 때, 컴퓨터의 환경에 맞게 변경해야 하는 부분이 있다. 방화벽 설정, 사용자 권한 설정, Port 설정 등이 이런 부분에 해당한다. 그리고 컴퓨터에 다양한 설정 작업을 수작업으로 하게 된다면, 많은 시간이 걸릴 뿐만 아니라 설정 간에 간섭이 일어나 프로그램이 멈출 수도 있게 된다.

이런 상황이 발생했을 때, 아주 간단한 해결방법이 있다. 고전적인 해결 방법이기도 한 이 방법은 OS를 포맷하고, 다시 설치하는 것이다. 개발과 실행에 대한 환경 설정이 코드로 정해져 있다면, 이런 고민으로부터 벗어날 수 있지 않을까?

 

CASE 3 - 리소스 격리성

 서버 관리자에게 다음과 같은 요구사항이 입력된다고 가정해보자.

  • 웹 서버 1: IP 는 A로, 포트 번호는 A-1로, 방화벽 규칙은 a의 규칙을 이용하세요.
  • 웹 서버 2: IP 는 B로, 포트 번호는 B-1로, 방화벽 규칙은 b의 규칙을 이용하세요.

IP 주소는 인터넷상에 있는 컴퓨터의 고유한 주소이다. IP 주소 덕분에 인터넷상의 한 컴퓨터에서 다른 컴퓨터로 데이터를 주고받을 수 있게 된다.
우리가 물건을 어떤 사람의 방까지 전달해준다고 가정해보자. IP address는 집 주소이고, 포트 번호는 방 주소라고 생각할 수 있다.
인터넷 프로토콜에서 포트(port)는 운영 체제 통신의 종단점이다. (위키백과)
포트 번호로 프로세스(프로그램의 실행)를 식별한다. 그런데 위 상황은 서버가 하나밖에 없어서 IP 주소를 구분하기 위해 브릿지 설정을 변경해야 하고, 방화벽 규칙 a와 b가 서로 충돌이 일어나고 있는 상황이다.

실제로는 하나의 컴퓨터를 사용하지만, 여러 개의 컴퓨터를 이용하는 것처럼 할 수는 없을까? 이 방법을 '리소스 격리성'이라고 한다. 리소스 격리성을 제공하는 기술로는 가상 머신(Virtual Machine), 도커 등이 있다.

그럼 OS도 일치시키고, 환경도 일치시키기 위해 가상 머신을 이용하는 것은 어떨까?
가상 머신도 좋은 방법이다. VirtualBox, VMware 와 같은 가상 머신은 개발 환경이나 사용 환경을 이미지로 저장하고, Host OS 위에 게스트 OS를 올리는 방식이다.

가상 머신과 도커는 격리성을 제공하기 때문에, 각 애플리케이션마다 다른 컴퓨터에서 실행되는 것처럼 IP나 Port 등을 다르게 설정할 수 있다.

그렇다면 도커와 가상 머신의 차이는 무엇일까?

  • 도커는 가상 머신만큼 견고한 격리성을 제공하지는 않는다.
  • 도커는 리눅스의 컨테이너(Linux Container)를 이용한 기술로, OS 위에 다른 OS를 실행하는 것이 아니므로 가상 머신보다 좋은 성능을 낼 수 있다.
  • 애플리케이션에 대한 환경 격리성을 중심으로 한 VM과는 달리, 도커는 Container의 관점에서 개발자와 사용자 커뮤니티를 중심으로 혜택을 제공하는 데 있다.

Docker Container Lifecycle

도커 컨테이너의 독립적인 특징을 기반으로 한 Lifecycle이 있다. 위 그림을 살펴보면, 컨테이너의 생성, 실행, 종료의 과정을 이해할 수 있다.

 

 

 

반응형