목차
※ 영상 - Docker Tutorial for Beginners - A Full DevOps Course를 참고하여 작성한 글입니다.
왜, 어째서 도커인가?
다양한 어플리케이션, 복잡한 의존성
웹 서비스를 위한 프로젝트를 하나 만든다고 생각해보자. 웹 서비스를 만들기 위해서는 nodejs express
, mongoDB
, redis
등의 다양한 어플리케이션을 이용하여서 프로젝트를 구성할 수 있다.
이를 위해 먼저 nodejs
를 위해서 이에 맞는 OS
를 찾아서 선택했따. 그렇게 맞는 OS
를 찾았다고 생각했는데 선택한 OS
에서 mongoDB
, redis
등을 지원하지 않는다? 이러면 또 다른 OS
를 찾아서 모두 만족할 수 있는 OS
를 찾아야 한다.
그렇게 OS
를 찾고, 그 위로 각 어플리케이션에 맞는 라이브러리
들을 또 설치해준다. 각 어플리케이션에 맞는 OS
, 라이브러리
를 설치하는 과정이 매우 복잡하고, 찾기도 어렵다.
새로운 팀원에게 매우 불친절하다
이렇게 열심히 작업환경을 만들어서 작업을 하고있는데, 새로운 작업자가 팀에 추가 되었다고 생각해 보자. 그럼 또 정확하게 맞는 OS, 맞는 version 맞는 library 등 기타 필요한 설정들을 하나하나 다 맞춰줘야 하는 굉장히 번거롭고, 귀찮은 과정들을 거쳐야 한다.
그러면 도커는 왜 사용할까
도커를 사용하게 되면 이렇게 복잡한 프로그램들을 독립적으로 실행시킬수 있다.
본래 프로젝트를 진행하기 위해서 모든 어플리케이션이 사용할 수 있는 OS, 라이브러리 각종 의존성패키지등을 찾고 설치해줘야 했었다. 하지만 도커를 이용하면, 각 어플리케이션에 대해 독립적으로 이 작업을 진행할 수 있다.
Nodejs
에 필요한 OS, 라이브러리, 의존성 패키지를 찾아서 하나의 컨테이너
로 만들고, MongoDB
에 필요한 OS, 라이브러리, 의존성 패키지를 찾아서 하나의 컨테이너
로 만들고 각각 어플리케이션에 대해서 독립적으로 작업을 진행할 수 있다.
그래서 도커가 뭔데?
먼저, Linux 배포판은 어떻게 생겼지?
세상에 존재하는 여러가지 리눅스 배포판들 Ubuntu, Fedora, CentOS, Debian등 다양한 OS들은 전부 같은 리눅스 커널
을 이용해서 만들어졌다. 리눅스 배포판들은 결국 공유하는 리눅스 커널
위에 자신들의 목적을 위한 소프트웨어를 만들어 올린다. Docker는 이 공유하는 리눅스 커널
을 이용해서 작동한다.
Docker는 그럼 어떻게 작동하는걸까?
Ubuntu를 사용한다고 생각해보자. 그 위에 Docker를 설치한다. 그리고 Docker를 이용해 다른 OS를 실행하려면, 같이 공유하는 리눅스 커널
위에 다른 OS가 사용하는 소프트웨어
를 위에 올려서 사용할 수 있게 해준다. 즉 같은 커널을 공유하는 OS를 소프트웨어만 설치해서 사용할 수 있는 것이다.
Windows, MacOS에서의 Docker
그렇다면 리눅스 커널을 사용하지 않는 다른 OS에서는 어떻게 Docker를 실행할까? 다른 OS에서도 분명 Docker를 설치하고, 실행할 수 있다. 다른 OS에서 docker는 리눅스 가상머신
을 이용한다. 리눅스 가상머신 위에 docker를 올리고, 그 위에 다른 OS들의 소프트웨어를 설치해서 사용할 수 있다.
그래서 결국 컨테이너가 뭔데?
이미지에 대해서
이미지는 하나의 앱을 실행하기 위한 설계도와 같다. 만약 우분투에서 Nodejs 앱을 실행하고 싶다면, 우분투 소프트웨어와 Nodejs 소프트웨어를 준비해야한다. 이를 모두 준비해둔 하나의 객체를 이미지라고 한다.
각 이미지는 레이어
로 이루어져있다. 그렇기에 이미지를 재사용함에 있어서 굉장한 이점을 가진다. Ubuntu에 Nodejs가 아니라 다른 소프트웨어를 준비하면 다른 어플리케이션을 실행할 수 있는 이미지가 된다.
이런 이미지들을 도커를 이용해서 실행하면 그것이 하나의 컨테이너가 된다.
컨테이너를 생성하기
컨테이너를 생성하는것은 이미지에서 하나의 인스턴스
를 생성하는 것과 같다. 그러므로 하나의 이미지로 여러개의 어플리케이션을 실행할 수 있다.
웹프로젝트를 만들기로 했을 때, 여러개의 redis어플리케이션과 여러개의 nodejs 어플리케이션을 실행한다고 하자. 이 때 하나의 이미지로 여러개의 컨테이너를 만들면 여러개의 어플리케이션이 실행된다.
이렇게 만들어진 각각의 컨테이너는 서로 독립적
으로 존재한다. 컨테이너 내에서 어떤 작업을 하더라도 다른 컨테이너에 영향을 끼치지 않고, 이미지에도 아무런 영향이 가지 않는다. 또한 같은 이미지로 만들어진 여러개의 컨테이너 간에도 서로 아무런 영향을 끼치지 않고 작업이 이루어진다.
이는 각각의 컨테이너가 고유의 루트디렉터리
를 가지고 있기에 가능하다. 하나의 컨테이너는 자기 자신만의 루트디렉터리를 가지고, 이 안에서 모든 작업을 처리한다. 이에 대해서 더 자세한 이야기는 Daegwon Nacyot Kim님의 도커 컨테이너는 가상머신인가요? 프로세스인가요? 포스트에 자세하게 설명되어 있다.
마치며
이까지 도커에 대한 개념을 간단히 다루어 봤다. 즉 도커란, 리눅스 커널을 이용해서 하나의 어플리케이션을 컨테이너라는 이름으로 독립적으로 실행할 수 있게 해주는 프로그램이다. 이를 이용하면 각종 어플리케이션을 하나의 OS에서 어플리케이션 마다 적합한OS, 라이브러리, 의존성패키지등을 설치해서 실행 시킬 수 있다.