이 기능은 주로 서버에 사용된다. 클라이언트 컴퓨터에서도 사용할 수는 있지만 현 시점에는 서버에서 사용하는것이 주 용도다.
개인용 컴퓨터나 서버에는 여러 가지 프로그램이 함께 동작한다.
예를 들면, 개인 컴퓨터에선 워드, 엑셀, 메일 프로그램을 동시에 사용할 수 있다.
서버용 컴퓨터에선 아파치, MySQL 등 여러 프로그램이 함께 동작된다.
도커는 다양한 프로그램과 데이터를 각각 독립된 환경에 격리하는 기능을 제공한다.
그것도 운영체제(비슷한 것) 통째로 격리하는 기능을 제공해준다.
도커를 사용하려면 도커 소프트웨어의 본질인 도커 엔진을 설치해야 한다.
도커 엔진은 컨테이너를 생성하고 구동시킬 수 있다.
도커 엔진이 있어야 컨테이너를 만들 수 있다고 했는데,
컨테이너를 만들려면 도커 엔진 외에도 컨테이너의 빵틀과도 같은 역할을 하는 이미지가 필요하다.
이미지는 종류가 아주 많다. 만들고자 하는 컨테이너의 본질(?)인 소프트웨어의 종류에 따라 달라진다.
예를 들면 아파치 컨테이너를 만들려면 아파치 이미지를 사용해야 하며, MySQL 컨테이너를 만들려면 MySQL 이미지를 사용해야 한다.
컨테이너는 용량이 허락하는 한 하나의 도커에서 여러 개 만들 수도 있다.
왜 데이터나 프로그램을 독립된 환경에 격리해야 할까?
데이터는 둘째 치고 프로그램을 독립된 환경에 격리해야 하는 이유는 대부분의 프로그램은 프로그램 단독으로 동작하는 것이 아니라 어떤 실행 환경이나 라이브러리, 다른 프로그램과 함께 동작한다.
예를 들면, PHP로 작성된 프로그램을 실행하려면 PHP 실행 환경이 필요하고, 파이썬으로 작성된 프로그램은 다른 라이브러리를 사용해야 하는 경우가 많다.
소프트웨어 역시 단일 프로그램이 아니라 여러 개의 프로그램으로 구성된 경우가 많다.
예를 들면, 워드프레스(WordPress)는 MySQL 데이터베이스가 없다면 사용할 수 없다.
그리고, 다른 프로그램과 특정한 디렉터리를 공유하거나 같은 경로에 설정 정보를 저장하는 경우도 있다.
예를 들면 워드프레스는 MySQL가 있어야 사용할 수 있는데, 워드프레스 5.0버전은 MySQL 8.0 버전 이상이어야만 정상 동작하는데, 워드프레스 하나만을 위해 MySQL을 8버전 이상으로 업데이트 해야하는 경우가 있을 것이다.
위 같은 상황은 공통으로 함께 연동되는 소프트웨어의 상황이었지만, 실행 환경이나 라이브러리, 디렉터리 설정 파일에서도 같은 일이 일어날 수 있다. 공유하는 대상을 어느 한쪽만을 위해 수정하면 다른 쪽에서 오류가 발생하게 된다.
이런 문제는 업데이트할 때만 생기는 것은 아니다.
서버에서는 여러 프로그램이 함께 동작하므로 서버를 처음 구축할 때부터 신중하게 따져보지 않으면 안된다.
설계할 때는 문제가 없었던 프로그램끼리도 실제로 설치해보면 오류를 일으키는 경우도 있다. 이러한 문제의 원인은 대부분 프로그램 간 공유에 있다.
프로그램에 따라서는 한 서버에 한 버전 밖에 설치할 수 없으므로 최소 버전을 같이 맞춰 놓으면 문제가 되지 않는다. 그러나 신규 개발이라면 모를까, 기존 프로그램을 함께 설치하려는 상황이라면 연동 프로그램의 버전을 맞출 수 없을 수 도 있다.
디렉터리 역시 시스템 A,B가 같은 디렉터리를 사용하게 돼 있어서 설정 파일이 섞이거나 설정에 충돌이 생길 수 있다.
프로그램도 한 서버에서 함께 지내려면 사람이 함께 지내는 것 이상으로 신경 쓸 것이 많이 생긴다.
도커 컨테이너는 다른 컨테이너와 완전히 분리된 환경이라고 위에 설명했는데 즉, 컨테이너 안에 들어있는 프로그램은 다른 프로그램과 격리된 상태가 된다.
도커 컨테이너를 사용해 프로그램을 격리하면 여러 프로그램이 한 서버에서 실행되면서 발생하는 문제를 대부분 해결할 수 있다.
일반적인 환경에선 한 대의 서버 혹은 컴퓨터에 한 버전만 설치할 수 있는 소프트웨어가 대부분이다. 워드나 엑셀처럼 버전별로 여러 개를 설치할 수 있는 경우도 있지만, 원칙적으로는 불가능하다고 보는 것이 옳다.
도커 컨테이너는 완전히 독립된 환경이므로 여러 컨테이너에서 같은 프로그램을 실행할 수 있다. 버전이 완전히 동일해도 상관없다.
우선 물리 서버가 있고, 이 물리 서버에서 동작하는 리눅스 운영체제가 있다. 여기까지는 일반적인 서버와 다를 바 없다.
일반적인 서버라면 운영체제 위에 프로그램이나 데이터가 직접 올라가겠지만 도커를 사용하는 경우엔 운영체제 위에 도커 엔진이 동작하고 그 위에서 컨테이너가 동작한다.
컨테이너 속에 넣는다는 표현을 생각하면 빈 컨테이너에 무언가를 넣는 상상하게 되지만 ‘정말로 텅텅 빈 컨테이너’는 의외로 사용되지 않는다.
컨테이너의 구조는 모든 컨테이너에는 ‘리눅스 운영체제 비슷한 무언가’가 들어 있다. 음식점에서 아무것도 주문하지 않아도 기본 반찬이 나오듯, 최소한의 컨테이너에도 리눅스 운영체제 비슷한 무언가가 기본 반찬처럼 나온다.
도커는 밑바탕에서 리눅스 운영체제가 동작하는 것을 전제로 하는 구조로 돼어있기 때문에 리눅스 운영체제에서만 동작할 수 있다.
그리고, 컨테이너 안에 들어 있는 주변 부분도 이에 맞춰 리눅스 운영체제의 주변 부분이어야 한다. 그렇기에 컨테이너에서 실행할 소프트웨어(프로그램) 역시 리눅스용 소프트웨어다. 윈도우나 macOS용 소프트웨어는 컨테이너에 넣어도 동작하지 않는다.
즉, 도커는 리눅스 컴퓨터에 독립된 환경을 만드는 것이며, 리눅스에서만 동작하고, 컨테이너에서 동작할 프로그램도 리눅스용 컴퓨터다.
컨테이너를 생성하려면 먼저 이미지를 만들어야 한다. 이미지는 컨테이너를 찍어내는 빵틀과 같은 것인데, 컨테이너의 설계도 역할을 한다.
로봇 장난감을 원하는 아이에게 금형은 아무 소용이 없다. 이미지 역시 이미지 자체로는 큰 쓸모가 없다. 이미지는 컨테이너를 만드는 데 사용한다.
즉, 이미지만 사용할 일은 없고, 컨테이너를 사용하는 것이다.
이미지로만 컨테이너를 만들 수 있는 것이 아니라 컨테이너로도 이미지를 만들 수 있다.
컨테이너로 이미지를 만드는 것은, 이미 만든 컨테이너에 손을 대서 컨테이너의 금형을 새로이 만드는 과정이다.
컨테이너로부터 이미지를 만들 수 없다면, 여러 개의 컨테이너를 일일이 수정할 수 밖에 없었을 것이기에 매우 번거로운 일이었을 것이다.
동일한 컨테이너를 여러 개 만들지 않더라도 이러한 특성을 이용해 다른 물리 서버에 설치된 도커 엔진으로 컨테이너를 이동시킬 수 있다. 컨테이너는 도커 엔진만 설치돼 있으면 구동이 가능하므로 다른 서버나 컴퓨터에 도커 엔진을 설치하고 도커 엔진에 이미지를 이용해 똑같은 컨테이너를 생성하면 된다.
이미지는 어디서 구해야 할까❓이미지는 주로 ‘도커 허브’에서 구한다. 도커 허브는 공식적으로 운영되는 도커 레지스트리(도커 이미지를 배포하는 서비스)의 이름이다
도커 허브는 스마트폰의 스토어와 같은 존재로, 공개된 컨테이너 이미지가 모여 있는 곳이다.
도커 허브에는 운영체제(비슷한 것)만 들어 있는 이미지부터, 여러 가지 소프트웨어가 함께 포함된 것 까지 다양한 이미지가 제공된다. 직접 수정하고 싶다면 간단한 이미지, 편리하게 사용하고 싶다면 설정이 완료된 이미지 등 용도에 따라 원하는 것을 선택하면 된다.
같은 소프트웨어도 다양한 개조된 이미지가 제공된다.
리눅스에는 다양한 배포판이 있는데, 주요 배포판은 모두 이미지로 제공되며, 배포판의 버전마다 운영체제(비슷한 것)만 들어간 컨테이너도 별도로 제공된다.
이렇게 이미지의 종류가 많다 보니 이미지를 선택하는 데 어려움을 느낄 수도 있다. 그리고 도커 허브는 누구나 자유롭게 이미지를 등록할 수 있기 때문에 안전하지 못한 이미지가 있을 수도 있다.
안전한 이미지를 선택하는 주요 방법을 살펴보자.
공식 이미지를 사용하면 이미지 선택도 쉽고 보안도 챙길 수 있다.
다만 컨테이너에 포함된 ‘운영체제(비슷한 것)’이 특정 운영체제 및 버전으로 한정된 경우가 있어서 원하는 것을 선택하지 못할 수도 있으므로 꼭 특정 운영체제 및 버전을 사용해야 하는 상황에는 주의가 필요하다
’운영체제(비슷한 것)’만 들어있는 컨테이너부터 직접 만드는 것은 추천하지 않으나 운영체제가 포함된 이미지에 소프트웨어를 넣는 정도는 그리 어렵지 않다.
공식 이미지가 아닌 모든 커스텀 이미지가 위험성을 안고 있는 것은 아니다. 공식 이미지가 아니더라도 선량한 사용자들이 만든 안전한 이미지도 많다.
다만 경험이 쌓일 때까지는 섣불리 판단하지 말고 신중하게 이미지를 선택해 사용해서 만들자.
도커를 사용할 때의 원칙 중 하나로, ‘한 컨테이너에 한 프로그램’이라는 것이 있다. 말 그대로 하나의 프로그램만 담긴 컨테이너를 사용한다는 의미로, 보안 및 유지 관리 측면에서 유리하기 때문에 많이 쓰이는 정책이다.
예를 들면, 워드프레스를 구축할 때도 다양한 구성이 가능하다.
워드프레스를 사용하려면 아파치, MySQL 같은 DBMS, 워드프레스 세 가지 소프트웨어가 필요하다.
도커를 사용해 워드프레스를 구축하는 방법은 이 3개를 각각의 컨테이너로 구성할 수도 있고(추천), 한 컨테이너에 모두(비추천) 집어넣는 방법도 있을 것이다.
컨테이너를 구축하는 방법은 다양하다. 컨테이너의 구성도 그만큼 다양하지만 그중에서도 모든 프로그램을 한데 모아 담은 컨테이너는 바로 실행할 수 있어서 자주 쓰인다.
고객 납품이나 특수한 환경에서는 사용할 수 없겠지만 IT직종에 몸담은 만큼 ‘맛보기라도 써보고 싶다’는 마음이 들기 마련인데, 이럴 때는 모든 프로그램을 담은 컨테이너도 편리하게 사용할 수 있다.
도커를 사용하면 호스트 컴퓨터와 컨테이너에서 모두 리눅스 운영체제가 동작한다.
즉, 하나의 물리적 컴퓨터에 여러 개의 운영체제가 있는 상태가 도니다. 뭉뚱그려 리눅스라고 했지만 그 안에도 여러 배포판이 있다.
그렇다면 호스트 컴퓨터와 컨테이너에서 각각 다른 배포판을 사용해도 괜찮을까❓
결론부터 말하면 호스트 컴퓨터와 컨테이너 또는 컨테이너 간에 배보판이나 버전 차이가 있어도 아무 문제가 없다.
애초에 도커를 사용하는 경우엔 컨테이너에 세세한 설정을 하지도 않고, 이미지를 선택할 때도 ‘운영체제(비슷한 것)’이 무엇인지도 크게 신경 쓰지 않고 그냥 ‘Latest’(최신 버전)을 선택하는 경우가 많다.
다만 컨테이너에 로그인할 필요가 있거나 특정 DBMS를 사용할 때는 운영체제 종류에 따라 문제를 일으킬 수 있으므로 배포판을 정확히 선택해야 한다.
컨테이너에 대한 설명을 듣다 보면 컨테이너의 수명 또는 컨테이너의 생애주기라는 이야기가 반드시 나오게 된다. 컨테이너는 ‘쓰고 버리는’ 일회용품 같은 것이기 때문이다.
앞서 얘기했듯이 컨테이너는 쉽게 만들 수 있다. 그러므로 컨테이너 하나를 업데이트하면서 계속 사용하기 보단 업데이트된 소프트웨어가 들어있는 새로운 컨테이너를 사용하는 것이 좋다.
즉, 새로운 버전이 나오면 새로운 컨테이너로 갈아타는 것이다.
이것이 가능한 이유는 컨테이너는 일반적으로 여러 개를 동시 가동하는 상황을 전제로 하기 때문이다. 여러 개의 컨테이너를 하나하나 업데이트하려면 많은 수고가 든다. 초기 구축은 간단히 마쳤는데 유지보수할 때마다 컨테이너를 일일이 업데이트하려니 컨테이너의 장점이 반감된다. 유지보수 횟수가 훨씬 많은 것도 그렇다.
이러한 이유로 오래된 컨테이너를 버리고 새로운 이미지로부터 새로운 컨테이너를 만들어 갈아타는 방식을 사용한다. 이런 방법을 사용하면 수고를 크게 덜 수 있다.
이렇게 컨테이너를 만들고, 실행하고, 종료하고, 폐기한 다음, 다시 컨테이너를 만드는 일련의 과정을 컨테이너의 생애주기라고 부른다.
컨테이너를 폐기하면 컨테이너 안에 들어있던 데이터는 어떻게 될까❓
컨테이너를 폐기하면 해당 컨테이너 안에서 편집했던 파일은 당연히 사라진다. 이 파일은 컨테이너 안에 들어있었기 때문이다. 이러면 상당히 곤란하다.
이런 상황을 방지하기 위해 보통은 도커가 설치된 물리적 서버(호스트)의 디스크를 마운트해 이 디스크에 데이터를 저장한다.
마운트는 ‘디스크를 연결해 데이터를 기록할 수 있는 상태’다. 컴퓨터에 USB나 외장HDD를 연결하듯이 도커 컨테이너도 물리적 컴퓨터의 HDD또는 SSD에 연결해 데이터를 기록할 수 있다.
이런 방법으로 컨테이너가 폐기되거나 도커엔진 자체에 문제가 생기더라도 데이터는 외부에 안전하게 저장되어 사라지지 않는다.
따라서 이 외부에 저장된 데이터를 다른 컨테이너와 데이터를 공유할 수도 있어서 매우 편리하다.
간단히 설명하면 운영체제나 소프트웨어 부분은 컨테이너 형태로 만들었다가 쓰고 버리는 것을 반복하고, 데이터는 다른 곳에 저장해 같은 것을 계속 사용한다고 보면 된다. 설정 파일도 마찬가지다. 파일을 수정했다면 삭제되지 않을 곳에 저장한다.
하지만 프로그램을 개발할 때는 다른 저장소에 저장하지 않는 경우도 있으므로 컨테이너를 폐기하기 전에 중요한 데이터가 컨테이너에 포함돼 있지 않은지 확인해야 한다.