도커는 리눅스 컨테이너 기술을 기반으로 하는 오픈 소스 서비스이다.
도커를 통해 애플리케이션 실행 환경을 코드로 작성할 수 있으며, OS를 격리화하여 관리한다.
Linux 기반의 기술 중 하나로,
필요한 라이브러리와 애플리케이션을 모아서 마치 별도의 서버처럼 구성한 것을 말한다.
컨테이너를 이루는 네트워크 설정, 환경 변수 등의 시스템 자원은 각 컨테이너가 독립적으로 소유하고 있다.
1. 프로세스의 구획화
2. 네트워크의 구획화
3. 파일 시스템의 구획화
대표적인 운영 체제(OS)는 Linux, Windows, MacOS로 구분할 수 있다.
그리고 엔지니어는 자신이 개발하는 애플리케이션이 어떤 환경에서 구동될지 생각하고 개발해야 한다.
그리고 개발하려고 하는 여러 애플리케이션을 구동하는 운영체제가 서로 다르다면,
환경에 따라 조금씩 변경할 부분이 발생한다.
이처럼 환경이 다르다면 개발자들이 조정할 문제가 수도 없이 생기며,
수작업으로 환경을 맞추는 일은 쉬운 일이 아니다.
Docker는 위 사진의 각각의 운영체제에 따라 달라지는 다운로드 렌더링처럼
이러한 문제를 환경 표준화로서 해결할 수 있다.
개발된 애플리케이션을 내 컴퓨터에 설치해 사용하고자 할 때,
'내 컴퓨터' 혹은 '내 사용 목적'에만 맞는 설정이 따로 필요할 수 있다.
예를 들어 환경 변수처럼, 같은 OS라도 사용자에 따라 달라지는 구성이 있기 때문이다.
따라서 애플리케이션을 설치할 때, 컴퓨터의 환경에 맞게 변경해야 하는 부분이 있다.
방화벽 설정, 사용자 권한 설정, Port 설정 등이 이런 부분에 해당한다.
이러한 다양한 설정 작업을 수작업으로 하게 된다면,
많은 시간이 걸릴 뿐만 아니라 설정 간에 간섭이 일어나 프로그램이 멈출 수도 있다.
개발과 실행에 대한 환경 설정이 코드로 정해져 있다면,
이런 고민으로부터 벗어날 수 있지 않을까?
이어지는 글의 "리소스 격리성"에서 더 자세히 설명하겠다.
간단한 문제 예시로,
서버 관리자에게 다음과 같은 요구사항이 입력된다고 가정하자.
- 웹 서버 1: IP 는 A로, 포트 번호는 A-1로, 방화벽 규칙은 a의 규칙을 이용하세요.
- 웹 서버 2: IP 는 B로, 포트 번호는 B-1로, 방화벽 규칙은 b의 규칙을 이용하세요.
IP 주소는 인터넷상에 있는 컴퓨터의 고유한 주소다.
IP 주소 덕분에 인터넷상의 한 컴퓨터에서 다른 컴퓨터로 데이터를 주고받을 수 있는 것이다.우리가 물건을 어떤 사람의 방까지 전달해준다고 가정하자면,
IP address는 집 주소이고, 포트 번호는 방 주소라고 생각할 수 있다.
포트 번호로 프로세스(프로그램의 실행)를 식별한다.그런데 위 상황은 서버가 하나밖에 없어서 IP 주소를 구분하기 위해
브릿지 설정을 변경해야 하고, 방화벽 규칙 a와 b가 서로 충돌이 일어나고 있다.
실제로는 하나의 컴퓨터를 사용하지만, 여러 개의 컴퓨터를 이용하는 것처럼 할 수는 없을까?
이 방법을 '리소스 격리성' 이라고 한다.
그럼 OS도 일치시키고, 환경도 일치시키기 위해 가상 머신을 이용하는 것은 어떨까?
가상 머신도 좋은 방법이다.
VirtualBox, VMware 와 같은 가상 머신은 개발 환경이나 사용 환경을 이미지로 저장하고, Host OS 위에 게스트 OS를 올리는 방식이다.
위 사진은 왼쪽은 도커, 오른쪽은 가상 머신을 나타내는 그림이다.
가상 머신과 도커는 격리성을 제공하기 때문에,
각 애플리케이션마다 다른 컴퓨터에서 실행되는 것처럼 IP나 Port 등을 다르게 설정할 수 있다.
도커는 가상 머신만큼 견고한 격리성을 제공하지는 않는다.
도커는 리눅스의 컨테이너를 이용한 기술로, OS 위에 다른 OS를 실행하는 것이 아니므로 가상 머신보다 좋은 성능을 낼 수 있다.
애플리케이션에 대한 환경 격리성을 중심으로 한 가상머신과는 달리,
도커는 컨테이너의 관점에서 개발자와 사용자 커뮤니티를 중심으로 혜택을 제공하는 데 있다.