Skip to main content

Docker

도커는 운영체제 수준의 가상화를 통해 애플리케이션을 컨테이너라고 하는 프로세스로 실행할 수 있는 오픈소스 플랫폼이다.


Container

docker-vm

컨테이너의 구조를 설명할 때 가상 머신과 많이 비교한다.

컨테이너는 시스템으로부터 격리된 하나 이상의 프로세스로, 이미지에 명시된 리소스만 접근할 수 있다. 그래서 한 종류의 운영체제만 사용할 수 있는 데 반해, 가상 머신Hypervisor로부터 여러 개의 운영체제을 생성할 수 있다.

컨테이너는 가상화와는 다른 점이 있다. 위 이미지처럼 가상 머신의 경우, 여러 개의 운영체제에 물리적으로 격리된 리소스를 각각 할당해 실행한다. 이렇게 되면, 각 머신은 많은 시스템 리소스를 사용하게 되기 때문에, 크기도 크고 실행 시간도 상대적으로 느리다.

반면에, 컨테이너의 경우 실행하려는 애플리케이션에서 필요로 하는 기능만 포함 돼 있고, 운영체제 수준에서 가상화되기 때문에 Host OS를 여러 컨테이너에서 공유할 수 있다. 이러한 점에서 별개의 OS를 각기 할당하고, 물리적인 리소스를 분리해 사용하는 가상 머신과 다르다.


플랫폼 중립적

Docker의 가장 큰 특징이라 할 수 있는, 플랫폼 중립적이란 말이 과연 무엇을 뜻할까?

플랫폼 중립적이라는 말은 하나의 이미지가 모든 프로세서 환경에서 동일하게 동작한다는 말이 아니라, Container 라는게 다양한 플랫폼에서 동작할 수 있다는 의미이다. 하지만 중요한건, 어떤 타겟 플랫폼으로 빌드 하느냐를 설정해주는 것이다.

어떤 CPU Architecture를 타깃으로 하느냐는 이미지를 빌드하는 호스트머신을 따라간다. 따라서 타겟 플랫폼에 맞게 빌드를 해야한다.

가령, M1 Arm Architecture에서 빌드된 이미지의 경우, x86 프로세서의 EC2 인스턴스에서 실행되지 않을 수 있다.

그래서 다음의 Dockerfile처럼 타겟 플랫폼을 정의할 수 있다.

FROM --platform=linux/amd64 node:18-alpine AS deps

...

이는 간단히 Docker의 Buildkit이라는 데몬 프로세스로부터, 현재 지원하는 설정 가능 플랫폼들의 목록을 확인할 수 있다.

$ docker buildx ls

NAME/NODE DRIVER/ENDPOINT STATUS PLATFORMS

default * docker
default default running linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6

즉, 현재 default라는 이름으로 Buildkit을 사용하고 있고, 지원하는 플랫폼은 위와 같아서, 다음과 같이 설정할 수 있는 것이다.

FROM --platform=linux/amd64 node:18-alpine AS deps

...
FROM --platform=linux/arm64 node:18-alpine AS deps

...
FROM --platform=linux/arm/v6 node:18-alpine AS deps

...
FROM --platform=linux/arm/v7 node:18-alpine AS deps

...

따라서 타겟 인스턴스의 플랫폼에 맞게 적절하게 빌드해야 한다.

Related Links