서버의 두 가지 의미

도커는 서버에서 사용되는 소프트웨어다.

클라이언트 컴퓨터에서도 사용할 수는 있지만 현시점에서는 서버에서 사용하는 것이 주 목적이라고 생각해도 좋을 정도다. 그러므로 도커를 본격적으로 설명하기에 앞서 서버에 대한 기본적인 지식을 짚고 가겠다.

서버란 무엇일까? 서버는 이름 그대로 ‘어떤 서비스(service)를 제공(serve)하는 것’을 가리킨다.

IT 기업에서 일하고 있다면 개발한 시스템을 올리거나 웹 서버를 다뤄본 경험이 있을 것이다. 이러한 경험이 없더라도 회사에서 파일 서버나 온라인 게임의 서버를 선택하는 경험을 통해 서버라는 용어 자체는 들어본 적이 있을 것이다.

그러나 서버가 구체적으로 무엇인지 설며앻보려면 의뢰로 말문이 막히는 경우가 많다.

개발 현장에서 ‘서버’라는 용어는 두 가지 의미를 갖는다. 한 가지는 ‘기능적 의미의 서버’이고 다른 한 가지는 ‘물리적 컴퓨터로서의 서버’를 가리킨다.

흔히 들을 수 있는 표현인 “웹 서버에 올려줘”, “메일 서버가 죽었어” 등에서 말하는 서버가 기능적 의미의 서버를 가리킨다.

‘무슨무슨 서버’라는 말은 ‘무슨무슨 기능을 제공한다’는 의미 이므로 ‘웹 가능을 제공하는 서버’는 웹 서버이고, ‘메일 기능을 제공하는 서버’는 메일 서버가 된다.

이 밖에 데이터베이스 서버 또는 파일 서버 등도 들어본 적이 있을 것이다.

이와 달리 물리적 컴퓨터로서의 서버는 “신입 직원이 올 테니 저 책상 위의 서버 좀 치워라”, “저번에 사장님이 서버에 꽂혀 있던 랜 케이블을 뽑아버렸지 뭐야”같은 상황에서 가리키는 의미다. 즉, 실물을 말한다.

최근에는 회사에 서버를 두는 경우가 줄었기 때문에 근무하는 회사에 따라 실문 서버를 본 적이 없을 수도 있지만 서버 역시 데스크톱 컴퓨터와 마찬가지로 어딘가에 물리적으로 존재하는 컴퓨터다.

“서버가 그냥 서버지”라고 생각할 수도 있겠지만 이렇게 의미를 구분하는 이유는 하나의 ‘물리적 컴퓨터로서의 서버’에 여러 개의 ‘기능적 의미의 서버’를 함께 둘 수 있기 때문이다.

서버라고 하면 뭔가 특별히 복잡할 것 같고 어려운 느낌이 들지만 사실 일반적인 컴퓨터와 다를 것이 없다. 일반적인 개인용 컴퓨터는 개인이 사용하지만 서버는 여러 사람이 원격으로 접근해 사용한다는 점이 다를 뿐이다.

물론 이러한 차이로 인해 컴퓨터의 사양이나 ㅇ구사항이 달라지기는 하지만 우리가 쓰는 개인용 컴퓨터와 마찬가지로 운영체제가 동작하고, 그 위에 소프트웨어를 실행하는 것은 똑같다.

따라서 서버의 기능 역시 특별할 것이 없다.

서버의 기능은 소프트웨어가 제공하는 것으로, 소프트웨어를 설치하면 ‘서버’의 기능을 갖게 된다.

예를 들어, 아파치 같은 웹 서버 소프트웨어를 설치하면 웹 서버 기능을 갖추며, Sendmail 같은 메일 서버 소프트웨어를 설치하면 메일 서버가 된다. ‘무슨무슨용’소프트웨어를 설치하면 ‘무슨무슨 서버’가 되는 식이다.

즉, ‘무슨무슨 서버를 만든다’는 말은 ‘무슨무슨용 소프트웨어를 설치해 이 기능을 갖춘다’는 말과 같다.

그리고 서버의 기능이 소프트웨어에서 나온다는 말은 ‘여러 가지 소프트웨어를 한 컴퓨터에 설치할 수도 있다’는 말이다. 구체적으로 설명하면 웹 서버와 메일 서버, FTP 서버를 한 컴퓨터에서 제공하는 경우는 흔히 볼 수 있고, 시스템 서버와 데이터베이스 서버가 함께 동작하기도 한다.

그러므로 여러 기능적 의미의 서버가 하나의 물리적 컴퓨터에 함께 존재할 수 있는 것이다.

하나의 물리적 컴퓨터에 여러 기능적 의미의 서버를 함께 동작시키는 것이 도커의 장점과 관계 있다는 것은 이해했을 것이다. 다음 표에 ‘기능적 의미의 서버’에 어떤 종류가 있는지 정리했다. 이 내용을 다 기억할 필요는 없으므로 가볍게 훑어보기 바란다.

서버의 종류설명
웹 서버웹 사이트 기능을 제공하는 서버. HTML 파일 또는 이미지 파일, 프로그램을 배치하고, 클라이언트 컴퓨터의 브라우저에서 접근해오면 이들 파일을 제공한다. 대표적인 소프트웨어로 아파치, Nginx, IIS 등이 있다.
메일 서버메일 송수신을 담당하는 SMTP 서버와 클라이언트에 메일을 전달하는 POP 서버로 나뉜다. 이들을 합쳐 메일 서버라고 부르는 경우가 많다. 메일을 내려받지 않고 서버에 둔 채로 읽는 IMAP4 서버도 있다. 대표적인 소프트웨어로 Sendmail, Postfix, Dovecot이 있다.
데이터베이스 서버데이터를 저장하거나 검색하는 데이터베이스 기능을 제공하는 서버다. 대표적인 소프트웨어로 Mysql, Postgresql, Mariadb, Sql server, Oracle database가 있다.
파일 서버파일을 저장하고 다른 사람과 공유하기 위한 서버다. 대표적인 소프트웨어로 samba가 있다.
DNS 서버IP주소와 도메인을 연결해주는 DNS 기능을 제공하는 서버.
DHCP 서버IP 주소를 자동으로 할당하는 기능을 제공하는 서버.
FTP 서버FTP 프로토콜을 사용해 파일 송수신 기능을 제공하는 서버. 웹 서버와 함께 설치하는 경우가 많으며, 파일을 제공하는데 사용한다.
프록시 서버통신을 중계하는 역할을 맡는 서버의 통칭. 사내 로컬 네트워크 등 인터넷과 격리된 장소에서 인터넷상에 서버에 접속할 때 사용한다. 프록시 서버를 경유하면 접속 대상 컴퓨터에 자신의 정체를 숨길수 있으므로 정체를 드러내고 싶지 않을 때도 사용한다.
인증 서버사용자 인증을 위한 서버. 윈도우 네트워크에 로그인 하기 위한 active directory 서버 또는 무선 LAN이나 원격 접속에서 사용자 인증을 맡는 radius 서버 등이 있다. 대표적인 소프트웨어로 openLDAP, active directory가 있다.

우리가 사용하는 개인용 컴퓨터와 서버는 크게 다르지 않다.

서버는 사용 목적에 따라 발열에 견디도록 구성하거나, 그래픽 기능을 사용할 일이 적기 때문에 서버 전용으로 특화되느느 경향이 있지만 물리적 컴퓨터가 존재하고 그 위에 운영체제가 동작하며 소프트웨어를 설치한다는 점에서는 개인용 컴퓨터와 마찬가지다. 다른 것은 역할 뿐이다.

따라서 우리가 사용하는 개인용 컴퓨터도 서버로 사용할 수 있다. 앞에서 설명했듯이 서버의 기능은 소프트웨어가 제공하는 것이므로 해당 소프트웨어를 설치하면 된다.

다만 서버의 특성상 운영체제는 서버용 운영체제를 사용하는 경우가 많다.

또 서버용 운영체제로는 리눅스 또는 유닉스 계열을 주로 사용하며, 서버용 소프트웨어도 리눅스용 소프트웨어가 대다수를 차지한다. 윈도우도 서버용 버전이 따로 있지만 점유율 면에서는 리눅스와 유닉스가 높다.

리눅스와 유닉스도 여러 종류가 있다. 리눅스 계통에서는 레드햇, CentOS, 우분투 등이 유명하다.

  • 윈도우 계열

Windows

  • 유닉스 계열

  리눅스 계열

   Red Hat, CentOS

   Debian, Ubuntu

   SUSE, openSUSE

   기타

  BSD 계열

   macOS

   FreeBSD

   NetBSD

  솔라리스 계열

   Solaris, OpenSolaris

  기타

컨테이너를 이용해 여러 가지 서버 기능을 안전하게 함께 실행하기

다시 도커 이야기로 돌아가자.

도커 환경에서 컨테이너를 사용하면 프로그램을 완전히 격리시킬 수 있다고 설명했다.

그렇다면 예산이 부족해 한 대의 서버에서 실행하던 웹 서버와 메일 서버, 시스템과 DB 서버를 각각 독립된 환경에서 안전하게 운용할 수 있을 것이다. 무엇을 업데이트하더라도 서로 영향을 미치지 않을 것이다.

또 일반적으로 한 대의 서버 컴퓨터에는 웹 서버를 한 벌(아파치 한 벌)밖에 실행하지 못한다. 그러나 컨테이너 기술을 활용하면 여러 개의 웹 서버를 올릴 수 있다. 이 점도 매우 편리한 점이다.

또, 물리 서버 한대에 여러 개의 웹 서버를 띄우면 그만큼 물리 서버 수를 줄일 수 있다. 예를 들어, 어떤 소프트웨어 회사에서 관리하는 프로젝트A와 프로젝트B의 웹 서버가 있다고 하자. 이들 웹 서버는 둘 다 필요한 용량이 그리 크지 않아서 물리 서버를 따로 두면 그만큼 낭비가 발생한다. 이 두 웹서버를 하나의 물리 서버에 함께 둔다면 프로젝트 하나의 비용이 절반으로 감소할 것이다.

만약 컨테이너 기술을 활용하지 않고 물리 서버 한대에 두 웹 서버를 함께 올린다면 프로젝트 A에 참여 중인 개발자가 프로젝트 B의 환경을 건드리게 될 수도 있고, 아파치는서버 한 대에 하나밖에 올리지 못하기 때문에 웹 서버의 기능을 공유해야 하는 한계도 생긴다. 컨테이너 기술을 이용하면 이러한 리스크를 감수하지 않고 두 웹 서버를 하나의 물리 서버에 함께 올릴 수 있다.

📖
컨테이너 기술 외에도 이를 가능케 하는 기술이 있다. 이들 기술에 대해서는 “도커와 가상화 기술의 차이”칼럼에서 설명하겠다.

개발 측면에서 이점은 개발환경을 갖추거나운영 환경으로 쉽게 넘어갈 수 있다는 점 등을 들 수 있겠다. 이러한 이점은 컨테이너가 그저 격리된 환경이 아니라 쉽게 옮길 수 있다는 특성에서 비롯된다.

자유로이 옮길 수 있는 컨테이너

컨테이너는 자유로이 옮길 수 있다.

실제로는 컨테이너 자체를 옮긴다기보다는 컨테이너의 정보를 내보내기한 다음, 다른 도커 엔진에서 복원하는 현태가 되지만 어쨌든 컨테이너를 어떤 도커 엔진에서 다른 도커 엔진으로 옮기기는 그리 어려운 일이 아니다.

이런 특성을 이용하면 똑같은 상태로 튜닝한 컨테이너를 팀원 전원에게 배포해 모두가 동일한 개발환경을 사용할 수 있다.

도커만 설치돼 있으면 되므로 운영체제가 달라도 이를 신경 쓰지 않고 컨테이너를 옮길 수 있다.

도커를 이용하면 물리적 환경의 차이, 서버 구성의 차이를 무시할 수 있으므로 운영 서버와 개발 서버의 환경 차이로 인한 문제를 원천적으로 방지할 수 있다.

도커와 가상화 기술의 차이

도커는 특성상 가상화 기술과 비교되는 경우가 많다. 그러나 도커는 서버 가상화와는 분명한 차이가 있다. ‘실행 환경을 독립적으로 격리한 컨테이너’라고 표현하는 것이 정확하다.

VirtualBox나 VMware 같은 가상화 기술은 가상의 물리 서버를 만드는 것과 같다. 여기서 ‘가상’이라는 말은 물리적인 대상을 소프트웨어로 대체했다는 의미다.

즉, 메인보드와 CPU, 메모리 등의 물리적은 부품을 소프트웨어로 구현하는 것이다.

실질적 물리 서버와 동등한 것이므로 당연히 운영체제도 아무 것이나 설치할 수 있고, 그 위에서 어떤 소프트웨어를 구동해도 무방하다.

이와 달리 도커는 컨테이너에서 리눅스가 동작하는 것처럼 보이지만 실제 리눅스가 동작하는 것은 아니다. 운영체제의 기능중 일부를 호스트 역할을 하는 물리 서버에 맡겨 부담을 덜어둔 형태다.

다시말해 컨테이너는 운영체제의 일부 기능을 호스트 컴퓨터에 의존하기 때문에 물리 서버에도 리눅스 기능이 필요하며, 컨테이너의 내용도 리눅스 운영체제가 될 수 밖에 없다.

도커와 AWS EC2의 차이

AWS EC2에도 도커의 컨테이너와 비슷한 ‘인스턴스’라는 개념이 있다.

EC2 역시 가상화 기술이다. 다시 말해 각각의 인스턴스가 완전히 돌깁된 컴퓨터처럼 동작한다. 따럿 EC2와 도커의 관계는 VirtualBos나 VMware와 도커의 관계와 같다.

다만 인스턴스는 컨테이너와 마찬가지로 AMI라는 이미지로부터 생성하므로 인스턴스를 배포하는 방법은 도커와 비슷하다.

도커와 호스팅 서비스

AWS ECS가 이에 해당한다. 이들 서비스를 사용하면 별도로 가상 서버를 만들지 않아도 컨테이너 이미지를 그대로 실행할 수 있다.