본문 바로가기

잡다/docker

[docker] 도커에 대한 설명

상황에 따라 다양한 환경에서 동일한 작업을 수행해야 하는 경우가 있다. 이때 이 환경이라는 녀석이 참 골치 아픈데, 서로 다른 환경은 보통 서로 다른 동작 방식을 가지고 있는 경우가 많기 때문이다.

 예를 들어, 동일한 프로그램을 설치할 때, Window 운영체제에 대해 설치하는 방식과 linux 운영체제에서 설치하는 방식은 큰 차이가 존재한다. linux의 경우 대부분의 파일을 apt 등의 패키지 매니저를 통해 설치할 수 있으나, Window 계열에서는 보통 해당 웹사이트를 방문하여 대응되는 프로그램을 설치하게 된다. 설치 과정 말고도, Window 및 Linux에서 지원하는 System call의 종류, OS 자체의 작동 방식 및 구현 등의 차이에 의해서도 동일한 소스 파일을 가져다 놓아도 다른 결과를 가져올 수 있다. 윈도우 계열에서 "ls -al" 명령을 코드 변경없이 수행할 수 있을까? 기본적으로 윈도우에는 ls 명령도 없고, /bin/bash 와 같은 것도 없기 때문에 당연히 exel 등의 시스템 콜을 이용한 명령은 불가능 할 것이다.

 심지어 운영체제라는 커다란 환경이 동일하더라도, PC의 설정이나 버전 등에 의해 다른 결과를 가져올 수도 있다. 많은 사람들이 경험해 봤겠지만, 분명 나의 데스크탑에서는 잘 돌아가던 코드가 이상하게도 다른 컴퓨터로 옮기기만 하면 작동하지 않는 경우도 많다.

 따라서, 많은 경우 언급한 환경적인 차이에 대한 수정 작업이 필요한데, 프로그램이 동작하지 않는 이유에 대한 정보를 명확하게 알 수 있는 것도 아니기 때문에 수많은 시행착오가 필요하다. 심한 경우 그날 작업을 포기하고 다음날 다시 시작해봤더니, 신기하게도 어제와는 달리 잘 작동하기도 한다. 만약 해당 프로그램이 완성된 것이 아니라, 지속적으로 작성 및 보수해야 하는 것이라면? 앞으로도 이런 환경 차이를 감안하며 서로 다른 환경에 대해 테스트하고 문제를 해결하는 끔찍한 시행착오를 서비스가 진행되는 동안 계속해야 한다.

 이런 고통의 고리를 끊기 위해서는 내가 작성한 프로그램이 어떤 환경에서도, 어떤 컴퓨터에서도 동일한 행위에 대해 동일한 결과를 산출한다는 것을 보장해야만 한다. 도커는 나의 소중한 프로그램에 대해 프로그램의 코드나 환경 정보 등을 유지하는 "이미지" 라는 스냅샷을 기반으로, 서로 격리된 프로세스인 컨테이너를 생성하여 이를 실행하는 방식으로 동작한다. 따라서 도커를 이용하면 환경에 대한 차이, dependencies 등을 걱정할 필요 없이 어떤 환경에서도 동일한 작업을 빠르게 수행할 수 있다는 장점이 있다.

 

도커란?

도커는 앞서 언급한 컨테이너(서로 격리된 프로세스) 을 생성하고, 실행하는 일종의 플랫폼 또는 환경이다. Docker Client, Docker Server, Docker Machine, Docker Images, Docker Hub, Docker Compose 등의 상호작용으로 작동한다.

Image는 특정 프로그램을 실행하는데 필요한 모든 설정(config) 및 dependencies 등을 가진 단일 파일이다. 해당 파일에 존재하는 프로그램은 컨테이너라는 형태로 구체화된다.

Container은 Image에 기반하여 생성되는 독립된 프로세스로, 각 컨테이너들은 Image의 정보를 이용하여 독립적인 환경에서 작동하게 된다.

당신이 윈도우 환경에서 도커를 설치하게 되면 ( 공식 사이트에서 환경에 맞게 설치 ), WSL2를 요구하는 모습을 볼 수 있다.  WSL은 Window Subsystem for Linux의 약자로, 윈도우 환경에서 리눅스를 가상머신 없이 실행 가능하도록 해주는 프로그램이다. 그런데, 왜 도커는 리눅스 환경을 요구할까?

 

리눅스 환경과 도커

앞서 언급한 도커의 목적과 동작에 대해 상기해보자. 도커는 환경에 대한 차이나 depenencies 등을 고려하지 않고 어떤 환경에서든지 동일한 동작을 수행하는 것을 목적으로 하며, 도커의 컨테이너는 각 프로세스의 격리를 기반으로 작동한다고 했다. 이때 프로세스 각각에 대해 다루는 것은 OS 커널 수준의 동작이므로, 사용자는 프로세스를 관리하기 위해 각 운영체제에서 지원하는 system call을 이용해야 한다. 이때 컨테이너를 위한 프로세스 및 하드웨어의 격리를 리눅스 환경을 이용하여 진행하기 때문에, 도커가 리눅스 환경을 요구하는 것이다.

구체적으로 이용하는 리눅스 특유의 기능은 다음과 같다.

Linux Namespace : 커널 수준에서 각각의 프로세스를 namespace을 이용하여 격리한다.

Linux Control Group : 커널 수준에서 CPU, 메모리, 디스크, I/O, 네트워크 등의 리소스를 프로세스에 대해 격리한다.

 운영체제가 최신 Window 계열이라면, Hyper-V 기술을 이용하여 도커를 이용할 수도 있다고 한다. 아래 문서에서는 해당 기능을 설명하며, 해당 기능 역시 docker 기반으로 작동하는 것으로 보인다.

 

격리 모드

Hyper-V 격리가 프로세스 격리 컨테이너와 어떻게 다른지 설명합니다.

docs.microsoft.com

 

도커 설치

1. 도커 공식 사이트에 방문한다. 

 

Empowering App Development for Developers | Docker

Learn how Docker helps developers bring their ideas to life by conquering the complexity of app development.

www.docker.com

 

2. Get Started를 누른다.

 

3. Docker Desktop에서 운영체제에 맞는 파일을 다운로드 하고, 해당 파일을 설치한다.

 

단순히 웹사이트에 들어가서 파일을 설치하면 되는 부분이라, 설명할 것이 없다.

 

결론

도커는 다양한 환경에서 동일한 동작을 수행할 수 있도록 프로그램 및 프로그램에 필요한 설정을 이미지라는 단일 파일로 구워서, 해당 프로그램을 컨테이너라는 서로 격리된 프로세스의 형태로 생성하고 실행하는 과정을 도와주는 플랫폼으로, 내부적으로 리눅스 기반의 System Call을 이용한다 ( 최근에는 윈도우의 Hyper-V 기반으로도 가능하기는 하다).

도커를 이용하면 동일한 이미지를 이용하여 어떤 환경에서도 동일한 동작을 수행할 수 있으므로, 다른 환경에 대한 설정 작업이나 코드의 수정이 필요하지 않아 다양한 환경에서 프로그램의 일관성을 유지하며, 장기적으로는 유지보수에도 유리하다는 장점을 가진다.