[Docker in Action] Welcome to Docker

2022. 4. 5. 08:54DevOps/Docker & Kubernetes

 

 

 

What is Docker?

도커는 프로그램을 빌드하고, 저장하고, 실행하는 방법을 제공하는 오픈소스 프로젝트로, 컨테이너(container)라는 OS Technology를 사용해서 안전하고 가벼운 프로그램 런타임 환경을 제공합니다.

 

Hello World

각 OS환경에 맞는 도커를 설치한 뒤에, CLI(Command Line Interface)에 아래와 같은 명령어를 입력하면, 다음과 같이 여러 개의 레이어를 다운로드한 후에, "hello world"라는 문장을 출력하고 프로그램이 종료되는 것을 확인할 수 있습니다. 실제로 어떤 일이 일어나고 있는지를 조금 더 자세히 살펴보겠습니다.

docker run dockerinaction/hello_world

 

  1. "docker run"이라는 명령어는 Docker에게 아래 이미지의 시퀀스를 시작하겠다고 알려주는 것입니다. 즉, 프로그램을 설치하고 컨테이너 안에서 실행하기 위한 명령어입니다.

  2. "dockerinaction/hello_world"는 명령어가 아니라 파라미터를 의미합니다. 즉 "docker run" 명령어를 통해 실행시키려는 프로그램의 이름을 의미하며 도커에서는 이를 "image name"이라고 합니다. 이미지는 파일과 메타데이터의 모음을 의미하며, 프로그램을 실행시키기 위해 필요한 여러 파일들과 설정값들을 포함하고 있습니다.

 

 

 

실제로 위의 커맨드를 실행시키면 Docker는 다음의 순서로 프로그램을 실행합니다.

  1. Docker는 "dockerinaction/hello_world" 이미지가 이미 다운로드되어 로컬 저장소에 있는지를 확인합니다. 해당 이미지를 처음 실행하는 것이라면 로컬 저장소에 해당 이미지가 없을 것이고, 그러면 Docker는 이 이미지를 원격 저장소에서 다운로드합니다. 원격 저장소를 "Docker Hub" 이라고 부르며 Docker Public Registry를 의미합니다. (git remote repository와 유사한 개념)

  2. 이미지가 설치되고 나면 도커는 새로운 컨테이너를 생성하고, 프로그램을 실행합니다. 프로그램은 "hello world"를 출력하고 종료하도록 설계되어 있으며 출력 후에 프로그램은 종료됩니다.

  3. 프로그램이 종료되면 컨테이너는 "stopped" 상태로 마크됩니다. 프로그램이 종료되면 컨테이너도 종료되며, 컨테이너를 재시작하면 프로그램도 재실행됩니다. 

 

한번 프로그램을 실행하고 나면 Remote Registry의 이미지가 Local Repository(로컬 머신의 저장소)로 다운되기 때문에 동일한 run 커맨드를 통해 다시 프로그램을 실행하게 되면 이번에는 다음과 같이 비교적 간단한 프로세스를 거쳐 프로그램이 실행됩니다.

 

 

 

Containers

컨테이너는 2005년 Sun의 Solaris 등장과 함께 런타임 환경, 즉 "runtime environment"를 지칭하는 용어가 되었습니다. (그전까지는 jail이라고 불렸다고 합니다.) 컨테이너의 목적은 컨테이너에서 동작하는 프로그램이 명시적으로 허용되지 않은 시스템의 리소스에 접근할 수 없도록 "환경을 격리" 시키는 것이었는데, 실제로 이 컨테이너는 "제대로" 만드는 것은 높은 난이도를 가진 일이었기 때문에 여러 어려움들이 있었습니다. 도커는 이 문제를 컨테이너 엔진을 통해 해결하였으며, 항상 일관적인 best practice 컨테이너를 생성하고 관리할 수 있도록 합니다. 실제로 도커 안에서 동작하는 모든 애플리케이션(소프트웨어)들은 모두 컨테이너 내에서 동작합니다.

 

Running Software in containers for isolation

도커 컨테이너는 가상 머신(Virtual Machine, VM)과는 다르게 하드웨어 가상화(Hardware Virtualization)를 하지 않습니다. 실제로 도커 컨테이너 안에서 동작하는 프로그램은 가상 머신의 커널이 아닌 시스템 OS의 커널 인터페이스와 직접 통신하는 방식을 사용하며, 이로 인해 가상 머신을 사용한 프로세스 격리보다 훨씬 더 가벼운 실행환경을 제공합니다.

 

 

도커를 사용한다는 것은 User Space, 즉 하드웨어와 OS위에 올려진 사용자가 접근 가능한 공간에서 2개의 프로그램을 사용하는 것을 의미합니다. 하나는 Docker Engine이고, 다른 하나는 Docker CLI입니다. 아래 그림처럼 각각의 컨테이너는 Docker Engine의 Child Process로써 동작하며, 각 프로세스는 독립적인 메모리 서브 스페이스와 user space를 차지합니다. 즉 프로세스 간 격리가 잘 되어 있다는 것입니다.

 

 

Shipping Containers

도커 컨테이너를 실제로 물류를 운송하는 컨테이너와 같이 생각할 수 있는데(metaphor) 해당 컨테이너 내에는 프로그램을 실행하기 위한 모든 정보들과 의존성들(operation system kernel을 제외한)이 들어있습니다. 컴포넌트를 구성하는 이러한 내용물들의 묶음을 "image"라고 부릅니다. 

 

물류 컨테이너

 

 

Docker image는 컨테이너 안에서 동작하는 프로그램이 반드시 필요로 하는 파일들의 "snapshot"의 묶음을 의미합니다. 따라서 하나의 이미지로부터 여러 개의 컨테이너를 생성시켜 프로그램을 동작시킬 수 있습니다.

 

 

What Problems does Docker Solve?

 

 

도커가 등장하게 된 배경은 "프로그램 간 격리"를 지원하기 위해서입니다. 이는 결국 "프로그램 간 격리"가 잘 되지 않아서 어떠한 "문제"가 발생했기 때문인데, 실제로 위의 그림처럼, 하나의 OS 시스템 안에서 여러 개의 프로그램들이 서로 다른 의존성을 "상호 참조"하게 되는 경우, 아래와 같은 문제점들이 발생하게 되며, 프로그램이 하나 추가될 때마다, 이러한 문제점들은 비선형적으로 커진다는 문제가 있습니다. 

 

  • What happens if one application needs an upgraded dependency, but the other does not?
  • What happens when you remove an application? Is it really gone?
  • Can you remove old dependencies?
  • Can you remember all the changes you had to make to install the software you now want to remove?

 

또한 가장 중요한 문제점 중의 하나가 "보안 취약성"인데, 이렇게 하나의 프로그램이 전체 User Space의 모든 리소스들에 대해 접근 권한을 가지게 되면 프로그램 중 하나가 의존성으로 사용하는 오픈소스에 보안 취약성이 발견되었을 때 전체 OS가 보안 위협에 노출될 가능성이 커지게 됩니다. 

 

Getting Organized

도커를 사용하게 되면 위에서 이야기한 "의존성의 문제(dependency problems)"를 해결할 수 있습니다. 도커는 하나의 프로그램 실행을 위한 모든 환경 정보를 컨테이너와 이미지로 격리하기 때문에 서로 다른 프로그램(서로 다른 컨테이너에서 실행되는) 간의 의존성 문제로 충돌하는 문제가 발생하지 않습니다.

 

 

 

Improving Portability

도커는 Natively Linux OS 위에서 동작하고, macOS와 Window를 지원하기 위해 조그만 Virtual Machine을 사용합니다. 도커에서 macOS, Window OS 환경 포팅을 위해 사용하는 가상 머신의 경우 위에서 설명한 가상 머신을 사용한 프로세스 격리와는 조금 다른데, 위에서 설명한 가상 머신을 사용한 프로세스 격리는 프로그램 하나를 띄우기 위해 host OS위에 또 다른 가상 머신을 띄워 동작시키므로 여러 개의 프로그램을 띄우기 위해 여러개의 가상 머신을 띄워야 하지만, 도커에서 사용하는 가상 머신은 "모든 컨테이너를" 띄우기 위해 "단 하나"의 "작은" 가상 머신을 띄웁니다.

 

On macOS and Windows, Docker uses a single, small virtual machine to run all the containers. By taking this approach, the overhead of running a virtual machine is fixed, while the number of containers can scale up.

 

실제로 도커 이미지를 구성하는 내용물들은 "consistent set of dependencies"로 "단 한번" 쓰여야 하기 때문에 Linux 시스템 기반으로 동작해야 하며, 때문에 다른 OS에서 이를 포팅할 수단이 필요한 것입니다. 따라서 도커가 Linux가 아닌 다른 환경에서 동작할 경우 이렇게 조그만 가상 머신을 하나 띄워서 일관적인 포팅 수단을 제공합니다.

 

 

Protecting Your Computer

도커를 사용해서 컨테이너를 다른 컨테이너와 격리시키게 되면 사용자가 명시하지 않는 한, 컨테이너 안에서 다른 컨테이너나 Host OS의 리소스에 직접 접근할 수 없기 때문에 보안 취약성을 어느 정도 해결한다는 장점이 있습니다.

 

 What this means for you or your business is that the scope of any security threat associated with running a particular application is limited to the scope of the application itself.

 

 

반응형