서버의 두 가지 의미
도커는 서버에서 사용되는 소프트웨어다. 클라이언트 컴퓨터에서도 사용할 수는 있지만 현 시점에서는 서버에서 사용하는 것이 주 목적이라고 생각해도 좋다. 그러므로 도커를 본격적으로 설명하기에 앞서 서버에 대한 기본적인 지식을 짚고 가자.
서버란 무엇일까? 서버는 이름 그대로 ‘어떤 서비스(service)를 제공하는 것’을 가리킨다.
IT 기업에서 일하고 있다면 개발한 시스템을 올리거나 웹 서버를 다뤄본 경험이 있을 것이다. 이러한 경험이 없더라도 회사에서 파일 서버나 온라인 게임의 서버를 선택하는 경험을 통해 서버라는 용어 자체는 들어본 적이 있을 것이다.
기능적 의미의 서버와 물리적 컴퓨터로서의 서버
개발 현장에서 ‘서버’라는 용어는 두 가지 의미를 갖는다. 한 가지는 ‘기능적 의미의 서버’이고 다른 한 가지는 ‘물리적 컴퓨터로서의 서버’를 가리킨다.
흔히 들을 수 있는 표현인 “웹 서버에 올려줘”, “메일 서버가 죽었어” 등에서 말하는 서버가 기능적 의미의 서버를 가리킨다.
‘무슨무슨 서버’라는 말은 ‘무슨무슨 기능을 제공한다’는 의미이므로 ‘웹 기능을 제공하는 서버’는 웹 서버이고, ‘메일 기능을 제공하는 서버’는 메일 서버가 된다.
이와 달리 물리적 컴퓨터로서의 서버는 “신입 직원이 올 테니 저 책상 위의 서버 좀 치워라”, “저번에 사장님이 서버에 꽂혀 있던 랜 케이블을 뽑아버렸지 뭐야” 같은 상황에서 가리키는 의미다. 즉, 실물을 말한다.
최근에는 회사에 서버를 두는 경우가 줄었기 때문에 근무하는 회사에 따라 실물 서버를 본 적이 없을 수도 있지만 서버 역시 데스크톱 컴퓨터와 마찬가지로 어딘가에 물리적으로 존재하는 컴퓨터다.
“서버가 그냥 서버지”라고 생각할 수도 있겠지만 이렇게 의미를 구분하는 이유는 하나의 ‘물리적 컴퓨터로서의 서버’에 여러 개의 ‘기능적 의미의 서버’를 함께 둘 수 있기 때문이다.
서버라고 하면 뭔가 특별히 복잡할 것 같고 어려운 느낌이 들지만 사실 일반적인 컴퓨터와 다를 것이 없다. 일반적인 개인용 컴퓨터는 개인이 사용하지만 서버는 여러 사람이 원격으로 접근해 사용한다는 점이 다를 뿐이다.
물론 이러한 차이로 인해 컴퓨터의 사양이나 요구사항이 달라지기는 하지만 우리가 쓰는 개인용 컴퓨터와 마찬가지로 운영체제가 동작하고, 그 위에 소프트웨어를 실행하는 것은 똑같다.
서버의 기능은 소프트웨어가 제공한다
서버의 기능은 소프트웨어가 제공하는 것으로, 소프트웨어를 설치하면 ‘서버’의 기능을 갖게 된다. 예를 들어, 아파치 같은 웹 서버 소프트웨어를 설치하면 웹 서버 기능을 갖추며, Sendmail 같은 메일 서버 소프트웨어를 설치 하면 메일 서버가 된다. ‘무슨무슨용’ 소프트웨어를 설치하면 ‘무슨무슨 서버’가 되는 식이다.
웹 서버용 소프트웨어를 설치 ⇒ 웹 서버가 된다.
메일 서버용 소프트웨어를 설치 ⇒ 메일 서버가 된다.
즉, ‘무슨무슨 서버를 만든다’는 말은 ‘무슨무슨용 소프트웨어를 설치해 이 기능을 갖춘다’는 말과 같다.
그리고 서버의 기능이 소프트웨어에서 나온다는 말은 ‘여러 가지 소프트웨어를 한 컴퓨터에 설치할 수도 있다’는 말이다. 구체적으로 설명하면 웹 서버와 메일 서버, FTP 서버를 한 컴퓨터에서 제공하는 경우는 흔히 볼 수 있고, 시스템 서버와 데이터베이스 서버가 함께 동작하기도 한다.
그러므로 여러 기능적 의미의 서버가 하나의 물리적 컴퓨터에 함께 존재할 수 있는 것이다.
서버의 운영체제로는 주로 리눅스가 사용된다
우리가 사용하는 개인용 컴퓨터와 서버는 크게 다르지 않다. 서버는 사용 목적에 따라 발열에 견디도록 구성하거나, 그래픽 기능을 사용할 일이 적기 때문에 서버 전용으로 특화되는 경향이 있지만 물리적 컴퓨터가 존재하고 그 위에 운영체제가 동작하며 소프트웨어를 설치한다는 점에서는 개인용 컴퓨터와 마찬가지다. 다른 것은 역할뿐이다.
따라서 지금 사용하는 개인용 컴퓨터도 서버로 사용할 수 있다. 서버의 기능은 소프트웨어가 제공하는 것이므로 해당 소프트웨어를 설치하면 된다.
다만 서버의 역할 특성상 운영체제는 서버용 운영체제를 사용하는 경우가 많다.
또 서버용 운영체제로는 리눅스 또는 유닉스 계열을 주로 사용하며, 서버용 소프트웨어도 리눅스용 소프트웨어가 대다수를 차지한다. 윈도우도 서버용 버전이 따로 있지만 점유율 면에서는 리눅스와 유닉스가 높다.
리눅스: RedHat, CentOS, Ubuntu, Rocky Linux 등
컨테이너를 이용해 여러 가지 서버 기능을 안전하게 함께 실행하기
도커 환경에서 컨테이너를 사용하면 프로그램을 완전히 격리시킬 수 있다고 하였다. 그렇다면 예산이 부족해 한 대의 서버에서 실행하던 웹 서버와 메일 서버, 시스템과 DB 서버를 각각 독립적인 환경에서 안전하게 운용할 수 있을 것이다. 무엇을 업데이트 하더라도 서로 영향을 미치지 않을 것이다.
또 일반적으로 한 대의 서버 컴퓨터에서는 웹 서버를 하나밖에 실행하지 못한다. 그러나 컨테이너 기술을 활용하면 여러 개의 웹 서버를 올릴 수 있다. 이 점도 매우 편리한 점이다.
또한 물리 서버 한 대에 여러 개의 웹 서버를 띄우면 그만큼 물리 서버 수를 줄일 수 있다. 예를 들어, 어떤 소프트웨어 회사에서 관리하는 프로젝트 A와 프로젝트 B의 웹 서버가 있다고 가정해보자. 이들 웹 서버는 둘 다 필요한 용량이 그리 크지 않아서 물리 서버를 따로 두면 그만큼 낭비가 발생한다. 이 두 웹 서버를 하나의 물리 서버에 함께 둔다면 프로젝트 하나의 비용이 절반으로 감소할 것이다.
만약 컨테이너 기술을 활용하지 않고 물리 서버 한 대에 두 웹 서버를 함께 올린다면 프로젝트 A에 참여 중인 개발자가 프로젝트 B의 환경을 건드리게 될 수도 있고, 아파치는 서버 한 대에 하나밖에 올리지 못하기 때문에 웹 서버의 기능을 공유해야 하는 한계도 생긴다. 컨테이너 기술을 이용하면 이러한 리스크를 감수하지 않고 두 웹 서버를 하나의 물리 서버에 함께 올릴 수 있다.
개발 측면에서의 이점은 개발환경을 갖추거나 운영 환경으로 쉽게 넘어갈 수 있다는 점 등을 들 수 있다. 이러한 이점은 컨테이너가 그저 격리된 환경이 아니라 쉽게 옮길 수 있다는 특성에서 비롯된다.
자유로이 옮길 수 있는 컨테이너
컨테이너는 자유로이 옮길 수 있다. 실제로는 컨테이너 자체를 옮긴다기보다는 컨테이너 정보를 내보내기한 다음, 다른 도커 엔진에서 복원하는 형태가 되지만 어쨌든 컨테이너를 어떤 도커 엔진에서 다른 도커 엔진으로 옮기기는 그리 어려운 일이 아니다.
이런 특성을 이용하면 똑같은 상태로 튜닝한 컨테이너를 팀원 전원에게 배포해 모두가 동일한 개발환경을 사용할 수 있다.
도커만 설치돼 있으면 되므로 운영체제가 달라도 이를 신경 쓰지 않고 컨테이너를 옮길 수 있다.
도커를 이용하면 물리적 환경의 차이, 서버 구성의 차이를 무시할 수 있으므로 운영 서버와 개발 서버의 환경 차이로 인한 문제를 원천적으로 방지할 수 있다.
도커와 가상화 기술의 차이
도커는 특성상 가상화 기술과 비교되는 경우가 많다. 그러나 도커는 서버 가상화와는 분명한 차이가 있다. ‘실행 환경을 독립적으로 격리한 컨테이너’라고 표현하느 것이 정확하다.
도커와 가상화 기술의 차이는?
VirtualBox나 VMware 같은 가상화 기술은 가상의 물리 서버를 만드는 것과 같다. 여기서 ‘가상’이라는 말은 물리적인 대상을 소프트웨어로 대체했다는 의미이다.
즉, 메인보드와 CPU, 메모리 등의 물리적인 부품을 소프트웨어로 구현하는 것이다.
실질적으로 물리 서버와 동등한 것이므로 당연히 운영체제도 아무 것이나 설치할 수 있고, 그 위에서 어떤 소프트웨어를 구동해도 무방하다.
이와 달리 도커는 컨테이너에서 리눅스가 동작하는것처럼 보이지만 실제 리눅스가 동작하는 것은 아니다. 운영체제의 기능 중 일부를 호스트 역할을 하는 물리 서버에 맡겨 부담을 덜어 둔 형태다. 다시 말해 컨테이너는 운영체제의 일부 기능을 호스트 컴퓨터에 의존하기 때문에 물리 서버에도 리눅스 기능이 필요하며, 컨테이너의 내용도 리눅스 운영체제가 될 수밖에 없다.
도커와 AWS EC2의 차이
AWS EC2에도 도커의 컨테이너와 비슷한 ‘인스턴스’라는 개념이 있다. EC2 역시 가상화 기술이다. 다시 말해 각각의 인스턴스가 완전히 독립된 컴퓨터처럼 동작한다. 따라서 EC2와 도커의 관계는 VirtualBox나 VMware와 도커의 관계와 같다.
다만 인스턴스는 컨테이너와 마찬가지로 AMI라는 이미지로부터 생성하므로 인스턴스를 배포하는 방법은 도커와 비슷하다.
도커와 호스팅 서비스
AWS ECS가 이에 해당한다. 이들 서비스를 사용하면 별도로 가상 서버를 만들지 않아도 컨테이너 이미지를 그대로 실행할 수 있다.
참고
그림과 실습으로 배우는 도커 & 쿠버네티스