본문 바로가기
MLOps/Docker

[Ops] 도커(docker)란 ?

by AteN 2022. 11. 16.

도커란 무엇일까? 

개발 당초에는 도커가 서버 엔지니어를 중심으로 개발환경에서 사용됐으나 지금은 운영환경은 물론이고 다양한 엔지니어의 개발환경에도 널리 도입되기에 이르렀다 

 

도커는 '데이터 또는 프로그램을 격리시키는' 기능을 제공한다 

한마디로 정리하자면 '데이터 또는 프로그램을 격리시키는 기능'을 제공하는 소프트웨어라고 할 수 있다 

이 기능은 주로 서버에 사용된다. 클라이언트 컴퓨터에서도 사용할 수 있지만 현 시점에서는 서버에서 사용하는 것이 주 용도이다. 개인용 컴퓨터나 서버에는 여러가지 프로그램이 함께 동작한다. 아파티, MySQL 등 여러 프로그램(소프트웨어)이 함께 동작하며 도커는 이렇게 다양한 프로그램과 데이터를 각각 독립된 환경에 격리하는 기능을 제공한다. 그것도 운영체제(비슷한 것) 통째로 격리하는 기능이다.

 

데이터나 프로그램을 독립된 환경에 격리해야 하는 이유?

데이터는 둘째치고 프로그램을 독립된 환경에 격리해야 하는 이유는 잘 이해가 가지 않을 수 있다. 댑분의 프로그램은 프로그램 단독으로 동작하는 것이 아니라 어던 실행 환경이나 라이브러리, 다른 프로그램을 이용해 동작한다. (예를 들어 PHP로 작성된 프로그램을 실행하려면 PHP 실행 환경이 필요하고, 파이썬으로 작성된 프록램은 다른 라이브러리를 사용하는 경우가 많다.)

소프트웨어 역시 단일 프로그램이 아니라 여러 개의 프로그램으로 구성된 경우가 많다. (예를 들어, 워드프레스(WordPress)는 MySQL 데이터베이스를 따로 갖추지 않으면 사용할 수 없다). 또한 다른 프로그램과 특정한 폴더 또는 디렉터리를 공유하거나 같은 경로에 설정 정보를 저장하는 경우도 있다. 이 때문에 프로그램 하나를 업데이트하면 다른 프로그램에도 영향을 미치게 된다. 공통으로 함께 연동되는 소프트웨어 뿐만 아니라 실행 환경이나 라이브러리, 디렉터리나 설정 파일에서도 어느 한쪽 만을 위해 수정하면 다른 쪽에 오류가 발생할 수 있다. 

이런 문제가 업데이트 때만 발생하는 것이 아니라 서버 구축시에도 설치를 하다보면 오류를 발생할 수 있고 이러한 문제의 원인 대부분 프로그램 간 공유에 있다 

 

컨테이너와 도커 엔진

개인용 컴퓨터 또는 서버 상의 환경을 마치 코스트코에서 판매하는 조립형 창고같은 작은 방으로 분할하면 어떻게 될까? 그리고 이렇게 작게 쪼갠 독립된 창고에 데이터나 프로그램을 두는 것이다.

이 조립형 창고를 컨테이너(container)라고 한다. 그리고 이 컨테이너를 다루는 기능을 제고하는 소프트웨어가 도커(Docker)

도커를 사용할려면 도커 소프트웨어의 본체인 도커 엔진(Docker Engine)을 설치해야 한다. 그리고 도커 엔진을 사용해 컨테이너를 생성하고 구동시킬 수 있다. 

 

프로그램 격리란?

도커 컨테이너는 다른 컨테이너와 완전히 분리된 환경이며, 컨테이너 안에 들어있는 프로그램은 다른 프록램과 격된 상태가 된다. 예를 들어 시스템 A가 XX 프로그램 5.0 버전을 사용하고, 시스템 B는 XX프로그램의 8.0 버전을 사용해야 하는 상황이라면 이들을 세트로 묶어 따르 격리하면 된다. 

이처럼 도커 컨테이너는 완전히 독립된 환경이므로 여러 컨테이너에서 같은 프로그램을 실행할 수 있다. 버전이 완전히 동일해도 상관없다. 

 

컨테이너를 만들려면 이미지가 필요하다

도커 엔진이 있어야 컨테이너를 만들 수 있다. 그러나 컨테이너를 만들려면 도커 엔진 외에도 컨테이너의 틀과 같은 역할인 이미지가 필요하다. 이미지 종류는 아주 많다. 담고 있는 소프트웨어의 종류에 따라 다양항 이미지를 사용한다. 아파치 컨테이너를 만들려면 아파치 이미지를 사용하고, MySQL 컨테이너를 만들려면 MySQL 이미지를 사용해야 한다. 

컨테이너는 여러 개를 만들 수도 있다. 용량이 허락하는 한 하나의 도커에서 여러 개를 만들 수 있다. 

 

도커는 리눅스 환경을 사용한다 

도커를 사용하는 데는 몇가지 제약 사항이 있다. 우선 종류와 상관없이 리눅스 운영체제가 필요하다. 원도우나 macOS에서도 도커를 구동할 수 있지만 이 경우 내부적으로 리눅스가 사용된다. 또 컨테이너에서 동작시킬 프로그램도 리눅스용 프로그램이다 

이는 도커가 리눅스 운영체제에서 사용하는 것을 전제로 만들어졌기 때문이다.

 

서버와 도커

도커를 설명할면 서버 이야기를 하지 않을 수가 없다. 도커는 서버에서 사용되는 소프트웨어이다

서버란 무엇일까?

서버는 이름 그래도 어떤 서비스(service)를 제공(serve)하는 것을 가르킨다.

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

기능적 의미의 서버와 물리적 컴퓨터로서의 서버

흔히 말할하는 서버는 기능적 서버를 가르키며 ‘무슨무슨 서버’라는 말은 ‘무슨무슨 기능을 제공한다’는 의미이므로 웹 기능을 제공하는 웹 서버이고 메일 기능을 제공하는 서버는 메일 서버가 된다.

이와 달리 물리적 서버는 ‘신입 직원이 올테니 저 책 상 위의 서버좀 치워라 ’. 즉 실물을 말한다.

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

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

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

 

서버의 기능은 소프트웨어가 제공한다.

서버의 기능은 소프트웨어가 제공한는 것으로, 소프트웨어를 설치하면 '서버'의 기능을 갖게 된다. 즉, 'XX' 소프트웨어를 설치하면 'XX 서버'가 되는 것이다. (예를 들어, 웹 서버용 소프트웨어를 설치하면 웹 서버가 되는 것이다) 

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

 

서버의 운영체제로는 주로 리눅스가 사용된다.

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

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

 

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

일반적으로 한대의 서버 컴퓨터에는 웹서버를 한 벌(아파치 한 벌) 밖에 실행하지 못한다. 그러나 컨테이너 기술을 활용하면 여러 개의 웹서버를 올릴 수 있는 것이다. 또한 각각의 독립적이 서버(웹 서버, 메일서버, DB 서버)를 두어 독립적인 환경에서 무엇을 업데이트하더라고 서로 영향을 미치지 않는 안전하게 운용할 수 있도 있다. 

 

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

 

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

 

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

실제로는 컨테이너 자체를 옮긴다기보다는 컨테이너의 정보를 내보내기한 다음, 다른 도커 엔진에서 복원하는 형태가 되지만 컨테이너를 어던 도커 엔진에서 다른 도커 엔진으로 옮기기는 어려운 일이 아니다. 도커만 설치돼 있으면 되므로 운영체제가 달리도 이를 신경쓰지 않고 컨테이너를 옮길 수 있으며 이런 특성을 이용하면 톡같은 상태로 튜닝한 컨테이너를 팀원 전원에게 배포해 모두가 동일한 개발 환경에서 사용할 수 있다. 

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

 

도커와 가상화 기술의 차이

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

 

VirtualBox나 VMware 같은 가상화 기술은 가상의 물리 서버를 만든 것과 같다. 여기서 '가상'이라는 말은 물리적인 대상을 소프트웨어로 대체했다는 의미이다. 즉, 메인보드와 CPU, 메모리 등의 물리적인 부품을 소프트웨어로 구현하는 것이다. 실질적으로 물리 서버와 동등한 것이므로 당연히 운영체제도 아무 것이나 설치할 수 있고, 그 위에서 어던 소프트웨어를 구동해도 무방하다. 

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

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

 

도커와 AWS EC2의 차이

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

EC2 역시 가상화 기술이다. 다시 말해 각각의 인스턴스가 완전히 독립된 컴퓨터처럼 동작한다. 따라서 EC2와 도커의 관계는 VirtualBox나 VMware와 도커의 관계와 같다. 다만 인스턴스는 컨테이너와 마찬가지로 AMI 라는 이미지로부터 생성하므로 인스턴스를 배포하는 방법은 도커와 비슷한다 

 

도커와 호스팅 서비스 

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

 

'MLOps > Docker' 카테고리의 다른 글

[Ops] Docker 컨테이너 정리  (0) 2022.12.20
[Ops] Docker 이미지 처리  (0) 2022.12.20
[Ops] Kubernetes란  (0) 2022.11.16

댓글