도커란 무엇인가?
개발 당초에는 도커가 서버 엔지니어를 중심으로 개발환경에서 사용되었으나 지금은 운영 환경은 물론이고 프론트 엔지니어의 개발환경에도 널리 도입되기에 이르렀다.
주변에 잘 알 것 같은 사람에게 도커가 무엇인지 물어보면 “컨테이너 기술이 어떻다”든가 하는 대답이 돌아올 뿐 명확하게 대답해주지 않는다. 마치 안개 속에 정체를 숨긴 느낌이다.
도커는 ‘데이터 또는 프로그램을 격리시키는 기능’ 제공
도커를 한마디로 정의하면 ‘데이터 또는 프로그램을 격리시키는 기능’을 제공하는 소프트웨어라고 할 수 있다. 이 기능은 주로 서버에 사용된다. 클라이언트 컴퓨터에서도 사용할 수는 있지만 현 시점에서는 서버에서 사용하는 것이 주 용도다.
개인용 컴퓨터나 서버에는 여러 가지 프로그램이 함께 동작한다. 사용자들이 사용하는 컴퓨터에도 워드나 엑셀, 메일 프로그램을 동시에 사용할 수 있을 것이다. 이와 마찬가지로 서버에도 아파치, MySQL 등 여러 프로그램(소프트웨어)이 함께 동작한다.
도커는 이렇게 다양한 프로그램과 데이터를 각각 독립된 환경에 격리하는 기능을 제공한다. 그것도 운영체제(비슷한 것) 를 통째로 격리하는 기능이다.
컨테이너와 도커 엔진
예를 들어, 개인용 컴퓨터 또는 서버 상의 환경을 마치 코스트코에서 판매하는 조립형 창고 같은 작은 방으로 분할하려면 어떻게 될까. 이렇게 작게 쪼갠 독립된 창고에 데이터나 프로그램을 두는 것이다.
이 조립형 창고를 컨테이너(Container)라고 한다. 그리고 이 컨테이너를 다루는 기능을 제공하는 소프트웨어가 도커(docker)다.
도커를 사용하려면 도커 소프트웨어의 본체인 도커 엔진(Docker Engine)을 설치해야 한다. 그리고 도커 엔진을 사용해 컨테이너를 생성하고 구동시킬 수 있다.
컨테이너를 만들려면 이미지가 필요하다
도커 엔진이 있어야 컨테이너를 만들 수 있다. 그러나 컨테이너를 만들려면 도커 엔진 외에도 컨테이너의 빵틀과도 같은 역할을 할 이미지가 필요하다.
이미지는 종류가 아주 많다. 담고 있는 소프트웨어의 종류에 따라 다양한 이미지를 사용한다. 아파치 컨테이너를 만들려면 아파치 이미지를 사용하고, MySQL 컨테이너를 만들려면 MySQL 이미지를 사용해야 한다.
컨테이너는 여러 개를 만들 수도 있다. 용량이 허락하는 한 하나의 도커에서 여러 개를 만들 수 있다.
도커는 리눅스 컴퓨터에서 사용한다
다만 도커를 사용하는 데는 몇 가지 제약 사항이 있다. 우선 종류와 상관없이 리눅스 운영체제가 필요하다. 윈도우나 macOS에서도 도커를 구동할 수는 있지만 이 경우 내부적으로 리눅스가 사용된다.
또, 컨테이너에서 동작시킬 프로그램도 리눅스용 프로그램이다.
이는 도커가 리눅스 운영체제에서 사용하는 것을 전제로 만들어졌기 때문이다. 윈도우나 macOS에서 도커를 사용하다 보면 이를 잊기 쉬운데, 이런 경우에도 내부적으로는 리눅스 운영체제가 사용된다는 점을 기억해야 한다.
데이터나 프로그램을 독립된 환경에 격리해야 하는 이유
도커는 주로 서버 환경을 격리하기 위해 사용된다. 그렇다면 데이터나 프로그램을 독립된 환경에 격리해야 하는 이유가 무엇일까?
데이터는 둘째치고 프로그램을 독립된 환경에 격리해야 하는 이유는 잘 이해가 안 갈수도 있다.
대부분의 프로그램은 프로그램 단독으로 동작하는 것이 아니라 어떤 실행 환경이나 라이브러리, 다른 프로그램을 이용해 동작한다.
예를 들어, PHP로 작성된 프로그램을 실행하려면 PHP 실행 환경이 필요하고, 파이썬으로 작성된 프로그램은 다른 라이브러리를 사용하는 경우가 많다.
소프트웨어 역시 단일 프로그램이 아니라 여러 개의 프로그램으로 구성된 경우가 많다. 예를 들어, 워드프레스는 MySQL 데이터베이스를 따로 갖추지 않으면 사용할 수 없다.
또한 다른 프로그램과 특정한 폴더 또는 디렉터리를 공유하거나 같은 경로에 설정 정보를 저장하는 경우도 있다.
이 때문에 프로그램 하나를 업데이트하면 다른 프로그램에도 영향을 미치게 된다.
쉽게 예를 들면, 시스템 A와 시스템 B가 모두 ‘무슨무슨 프로그램’과 연동되는 상황을 생각해보면 된다. 시스템 A가 ‘무슨무슨 프로그램’이 5.0 버전이어야만 동작하도록 만들어졌는데 시스템 B만을 위해 ‘무슨무슨 프로그램’을 8.0 버전으로 업데이트했다면? 시스템 A가 동작하지 않게 될 것이다.
이 예는 공통으로 함께 연동되는 소프트웨어를 예로 들었지만 실행 환경이나 라이브러리, 디렉터리나 설정 파일에서도 같은 일이 일어날 수 있다. 공유하는 대상을 어느 한쪽만을 위해 수정하면 다른 쪽에서 오류가 발생하게 된다.
이러한 문제가 단순히 업데이트할 때만 발생하는 것도 아니다.
서버에서는 여러 프로그램이 함께 동작하므로 서버를 처음 구축할 때부터 신중하게 따져보지 않으면 안 된다. 설계할 때는 문제가 없었던 프로그램끼리도 실제로 설치해보면 오류를 일으키는 경우도 있다. 이러한 문제의 원인은 대부분 프로그램 간 공유에 있다.
프로그램에 따라서는 한 서버에 한 버전밖에 설치할 수 없으므로 최소 버전을 같이 맞춰놓으면 문제가 되지 않는다. 그러나 신규 개발이라면 모를까, 기존 프로그램을 함께 설치하려는 상황이라면 연동 프로그램의 버전을 맞추지 못할 수도 있다.
디렉터리 역시 시스템 A, B가 같은 디렉터리를 사용하게 돼 있어서 설정 파일이 섞이거나 설정에 충돌이 발생할 수도 있다.
프로그램도 한 서버에서 함께 지내려면 사람이 함께 지내는 것 이상으로 신경 쓸 것이 많이 생긴다.
프로그램의 격리란?
도커 컨테이너는 다른 컨테이너와 완전히 분리된 환경이라고 하였다. 즉, 컨테이너 안에 들어있는 프로그램은 다른 프로그램과 격리된 상태가 된다.
도커 컨테이너를 사용해 프로그램을 격리하면 여러 프로그램이 한 서버에서 실행되면서 발생하는 문제를 대부분 해결할 수 있다.
예를 들어, 시스템 A가 무슨무슨 프로그램의 5.0 버전을 사용하고, 시스템 B는 무슨무슨 프로그램의 8.0 버전을 사용해야 하는 상황이라면 이들을 세트로 묶어 따로 격리하면 된다.
일반적인 환경에서는 한 대의 서버 혹은 컴퓨터에서 한 세트만 설치할 수 있는 소프트웨어가 대부분이다. 워드나 엑셀처럼 버전별로 여러 세트를 설치할 수 있는 경우도 있으므로 가능하지 않을까 싶기도 하지만, 원칙적으로는 불가능하다고 보는 것이 맞다.
그러나 도커 컨테이너는 완전히 독립된 환경이므로 여러 컨테이너에서 같은 프로그램을 실행할 수 있다. 버전이 완전히 동일해도 상관없다.
참고
그림과 실습으로 배우는 도커 & 쿠버네티스