도커에대해 학습했다. 도커는 고래등위에 컨테이너가 여러개 쌓여있는 그림으로 귀여웠다. CLI창에서서 이미지를 불러오자 귀여운 그림이 뜨는 것이 신기했다.
부산항, 인천항과 같은 무역항에 방문해 본 적이 있을것이다. 가장 흔히 볼 수 있는 풍경 중 하나는, 대형 트럭이 컨테이너를 싣고 부두를 왔다 갔다 하는 장면일 것이다. 이러한 컨테이너는 대형 화물선에 실려서 다른 무역항으로 이동한다. 컨테이너는 장점이 많다.
개발자들은 이와 같이 물자의 수송에 획기적인 단축을 가져다준 컨테이너 기술을 "소프트웨어 수송, 즉 배포에 사용할 수는 없을까?" 하는 생각을 하기 시작했다. 그 결과로 리눅스 컨테이너(lxc)라는 것을 만들어내기에 이르렀다. 리눅스 컨테이너 기술은 그 자체로 훌륭하고 완성된 기술이었지만, 애플리케이션을 쉽게 컨테이너화할 수 있는 생태계 혹은 커뮤니티가 없었다. 2013년에 등장한 도커(Docker)는 바로 Docker Hub라는 소프트웨어 저장소와 함께 빠르게 성장했고, 그 결과 개발자들은 쉽게 애플리케이션을 포장하고, 컨테이너 방식으로 실행할 수 있게 되었다. "컨테이너 방식으로 애플리케이션을 실행한다"라는 개념이 아직은 잘 와닿지 않을 수 있다. 컨테이너 기술의 장점은 한마디로 얘기하면 다음과 같다.
실행 환경에 구애받지 않고 애플리케이션을 실행할 수 있다!
이는 달리 얘기하면, 애플리케이션 실행이 어떠한 환경에 구애를 받는다는 말이다.
어떤 애플리케이션은, 해당 애플리케이션을 실행하기 위해 반드시 어떤 환경이 구축되어 있어야 한다. 쉽게는 윈도우용 프로그램을 실행하려면 윈도우 운영체제가 필요하듯 말이다. 우리는 이와 같이 어떤 프로그램(A) 실행에 다른 프로그램(B)이 반드시 필요한 경우, "프로그램 A는 프로그램 B에 의존 관계를 가지고 있다"고 말한다. 이러한 경우도 있다. 예를 들어, 워드프레스(wordpress)라는 프로그램이, php라는 프로그램에 대해 의존 관계를 가질 때에, 특정 php 버전을 요구하는 경우가 생길 수 있다.
그런데 동일한 컴퓨터에 php를 반드시 필요로 하는 drupal이라는 프로그램을 실행시켜야 하는데, 만일 drupal이 php 7 버전이 아닌 6 버전을 사용할 때에만 제대로 작동한다고 가정해 보자. 일반적으로 한 컴퓨터에 여러 버전의 동일한 애플리케이션이 설치되지 않으므로, 이 경우에는 php의 의존 관계를 가지고 있는 다른 두 애플리케이션 중에 하나는 제대로 된 실행을 보장할 수 없다. 이런 상황을 우리는 "의존성이 충돌한다"라고 말한다. 컨테이너 기술은 바로 이 문제를 해결한다. 컨테이너 기술은 애플리케이션을 컨테이너 내에 구성한다. 즉, 컨테이너에서 실행 중인 애플리케이션은 어떠한 의존성도 공유하지 않고, 각자 고유의 의존성을 포함하고 있다는 이야기이다. 이는 각 컨테이너가 철저하게 실행 환경이 격리되어 있기 때문에 가능한 것이다.
컨테이너 기술을 바탕으로 한 컴퓨터 안에 여러 대의 컨테이너가 존재하고, 이를 통해 애플리케이션 실행 환경이 격리되어 있음을 앞서 배웠다. 하나의 컴퓨터 내에 서로 다른 버전의 php가 설치될 수 있는 것은, 컨테이너 하나하나가 애플리케이션 실행과 관련해서 높은 수준의 격리를 제공하기 때문이다. 그렇다면, 컨테이너는 무엇을 격리하고, 어떤 자원들을 독립적으로 소유할까?
프로세스
네트워크
파일 시스템
이러한 기술을 어디선가 보신 분도 있을 것이다. 바로, 가상 머신(Virtual Machine, 이하 VM)이다. 하나의 호스트(주인) 컴퓨터 위에 여러 개의 독립적인 컴퓨터가 작동할 수 있게 하는 기술이다. 이러한 애플리케이션으로는 VMware, VirtualBox, Parallels 등이 있다. 사실, 도커를 비롯한 리눅스 컨테이너 기술은 가상 머신의 접근 방법과는 조금 다르다. 이에 대해서는 Self Guided Lessons 에 안내한 "컨테이너와 VM의 비교" 부분에서 보다 더 깊게 다룬다. 지금은, 컨테이너 역시 가상 머신과 비슷한 수준의 격리성을 제공한다는 정도만 알고 넘어가도 좋다.