Docker란 애플리케이션 패키징 기술을 제공하는 가상화 컨테이너 플랫폼이다.
한 컨테이너에 시스템 환경설정, 앱, dependencies 등 앱 구동을 위한 환경들을 패키징 해놓고 다른 서버나 pc에서도 얼마든지 동작이 가능하게끔 한다.
따라서 갑자기 개발 환경이 바뀌거나 서버를 증축해야할 때마다 새롭게 환경을 셋팅하는 것이 아닌, 컨테이너만 실행하면 되는 것이다.
컨테이너 가상화 기술을 제공하는 플랫폼이 여러곳이 있지만 가장 보편적으로 많이 쓰이는 것이 Docker이다.
위에서 잠시 언급했듯이 container에 앱을 위한 환경을 패키징 해놓으면 서버를 옮기거나 다른 개발자 컴퓨터에 동일한 환경이 필요할 때 컨테이너로 편리하게 환경을 구축할 수 있다.
또한 docker는 고사양의 컴퓨터 자원을 최대한 활용하기 위해 사용한다. 한 컴퓨터에 하나의 서비스만 돌리기에는 컴퓨터의 성능이 너무나 좋아졌기 때문에, 한 서비스를 구동하고 남는 리소스들을 docker를 통해 다른 서비스를 구동하여 활용도를 높이는 것이다.
AWS의 EC2를 예로 들자면 이미 생성해놓은 EC2 인스턴스가 있을때, 한 인스턴스 내에 여러 컨테이너를 구동시킬 수 있다는 것이다.
그렇다면 하이퍼바이저를 이용한 VM과는 어떤 차이가 있을까?
VM은 하드웨어 위에 VMware나 Parallels 와 같은 하이퍼바이저 소프트웨어를 이용하여 각각의 가상 머신을 만드는 것이다. 하이퍼바이저가 게스트마다 가상 환경을 할당해주고 개별 가상환경에 에러가 생겨도 다른 환경엔 영향을 주지 않도록 한다.
이 방식의 가장 큰 단점은 개별적인 os 설치에 있다.
가상환경 마다 OS를 따로 설치해주어야 하므로 운영체제의 리소스를 많이 차지하거나 OS 설치에도 시간이 오래 걸리는 등 서비스 자체가 무거워진다.
반면 docker는 별도의 OS 설치가 필요하지 않고 운영체제가 돌아가기 위한 파일 시스템만 있으면 된다. host OS 위에 container engine만 설치해주면 여러 어플리케이션을 독립된 환경에서 구동시킬 수 있다.
컨테이너 엔진이 설치된 host os를 공유하기 때문에 훨씬 가볍다고 할 수 있다.
Docker의 구성요소로 dockerfile, image, container를 살펴볼 것이다.
Dockerfile은 컨테이너를 어떻게 만들어야 하는지에 대한 설명서라고 할 수 있다.
Dockerfile에는 아래와 같은 내용이 포함된다.
Dockerfile을 작성했다면 이를 토대로 Image를 빌드할 수 있다.
이 이미지는 현재 실행되고 있는 앱의 환경을 그대로 담고 있다고 보면 된다. 이렇게 만들어진 image는 불변의 상태가 된다.
이미지만 있으면 서버 개수가 유동적으로 늘어나도 언제든지 똑같은 환경으로 실행시킬 수 있다.
Image를 고립된 환경에서 실행하는 것이 container이다. 즉, 어플리케이션은 이미지를 통해 컨테이너 내에서 실행되고 있다고 볼 수 있다.
docker compose는 복수의 컨테이너를 정의하고 동작시키기 위한 툴이다.
docker compose로 여러 컨테이너를 관리함은 물론 docker-compose.yml파일에 정의된 내용을 통해 하나의 명령어로 다수의 컨테이너를 실행 시킬 수 있다.
다음의 절차로 docker compose를 활용할 수 있다.
Dockerfile
을 작성한다.docker-compose.yml
를 작성한다.docker-compose up
명령어로 docker-compse.yml
에 정의된 내용을 토대로 컨테이너를 실행한다.자세한 내용은 다음 포스팅에서 다루도록 한다.