0. 앞선 글

 

Docker 이미지의 태그들 중에서 -alpine이라는 태그가 달려있는 이미지들을 자주 볼 수 있습니다. 이 글에선 alpine이 무엇인지, 왜 사용하는지에 대해서 알아봅니다.

 

이 글은 The 3 Biggest Wins When Using Alpine as a Base Docker Image을 번역 한 글입니다.

 

 

 

1. Alpine?

 

Alpine은 다음과 같이 설명됩니다.

 

Small. Simple. Secure. Alpine Linux is a security-oriented, lightweight Linux distribution based on musl libc and busybox.
- 가볍고 단순하며 안전합니다. 알파인 리눅스는 musl libc와 busybox를 기반으로 한 보안지향의 경량 리눅스 배포판입니다.

 

 

 

2. 가장 큰 이점은 컨테이너의 용량이 작아진다는 것입니다.

 

세탁과 같은 상황에서 줄어든다는 것은 나쁜 상황이겠지만 Docker의 세계에서는 Docker 이미지가 더 작아진다는 의미이므로 기대할만한 상황이 됩니다.

Alpine 3.6의 Dockerized 버전의 무게는 3.98MB입니다.

비교를 위해 Alpine을 다른 인기 Linux 배포판과 비교해 보자면 그 크기는 다음 표와 같습니다: 

DISTRIBUTION VERSION SIZE
Debian Jessie 123MB
CentOS 7 193MB
Fedora 25 231MB
Ubuntu 16.04 118MB
Alpine 3.6 3.98MB

 

크기 차이 좀 보세요. 알파인은 데비안보다 약 30배 작습니다.

Docker Hub는 수많은 풀을 처리합니다. API를 조사해 보면 이 글이 작성되는 시점(2017년도 기준)에 Debian에 35,555,107개의 pull이, Alpine은 135,136,475개의 pull이 있었음을 알 수 있습니다.

이러한 pull로 인해 모든 바이트가 전송될까요? 아마도 그렇지 않을 것입니다. 그러나 당신이 한 예상은 제가 한 것처럼 좋을 것입니다. 최소한 상황을 보는 관점은 되어줍니다.

 

S3를 통해 Debian과 Alpine을 최대 3,500만 번 전송하는 데 드는 예상 비용:

DISTRIBUTION GIGS TRANSFERRED S3 TRANSFER COST
Debian 4,373,278 $416,310.72
Alpine 141,509 $17,832.06

 

S3의 가격 계산기 비용으로 Debian과 Alpine을 최대 3,500만 번 전송하는 데 거의 $400,000 USD의 차이가 발생하게 됩니다..

아마도 여러분이 그 정도의 규모로 운영하고 있지 않을 것이라는 건 압니다. 그러나 모든 규모 수준에서 클라우드의 전송 비용에 있어서는 실질적인 절감 효과가 있습니다.

이미지 크기를 100MB 이상 줄일 수 있다는 것은 큰 일입니다.

많은 패키지가 설치된 실제 웹 애플리케이션에서 Alpine을 사용하면 최종 이미지 크기가 2배 또는 3배 정도 절약되므로 마이크로 벤치마크에만 유용한 것은 아닙니다. 최대 100MB 절약은 이미지에 무엇이 내장되어 있는지에 관계없이 고정되어 있는 이점입니다.

 

 

3. 알파인은 빠릅니다.

 

더 작은 Docker 이미지를 처리할 때 비용만이 유일한 장점은 아닙니다.

Docker 이미지를 다운로드하고  CURL을 설치하고 싶다고 가정해 보겠습니다. Debian과 Alpine의 경우 시간이 얼마나 걸릴까요?

 

여기서는 2가지 테스트를 수행하겠습니다.

첫 번째 테스트는 30MB 가정용 케이블 연결을 사용하여 기본 Docker 이미지를 시스템에 다운로드하고 CURL을 설치할 것이며 시스템에 이미지가 다운로드되어있지 않은 환경입니다.

두 번째 테스트는 CURL을 설치하기 전에 시스템에 이미 기본 Docker 이미지가 있다는 점을 제외하면 위와 동일합니다.

 

테스트 1의 결과:

## Debian
time docker run --rm debian sh -c "apt-get update && apt-get install curl"
real 0m 27.928s
user 0m 0.019s
sys 0m 0.077s

 

Debian을 모두 다운로드하고 apt-get 업데이트를 실행한 다음 CURL을 설치하는 데 실제 시간은 약 28초입니다.

 

## Alpine
time docker run --rm alpine sh -c "apk update && apk add curl"
real 0m 5.698s
user 0m 0.008s
sys 0m 0.037s

 

반면에 Alpine을 사용하면 약 5배 더 빠르게 완료되었습니다. 28초와 5초를 기다리는 것을 비교하는 건 가벼운 게 아닙니다. 상당한 시간입니다.

프로그래밍 테스트가 30초 또는 5초 안에 완료될 때까지 기다리는 것이 얼마나 짜증 나는 일인지 생각해 보십시오.

 

테스트 2의 결과:

## Debian
time docker run --rm debian sh -c "apt-get update && apt-get install curl"
real 0m 9.170s
user 0m 0.000s
sys 0m 0.031s

 

분명히 30MB 케이블이 병목 현상을 일으키고 있어 apt-get update를 실행하고 컬을 설치하는 데에는 9초 이상이 걸렸습니다.

 

##Alpine

time docker run --rm alpine sh -c "apk update && apk add curl"
real 0m 3.040s
user 0m 0.017s
sys 0m 0.008s

 

반면 알파인은 단 3초 만에 완료했습니다. 약 3배 정도 개선된 셈입니다.

 

새 Docker 이미지를 새로운 서버로 다운로드할 때 Alpine에서 초기 풀링 속도가 상당히 빨라질 것으로 예상할 수 있습니다. 네트워크 속도가 느릴수록 그 차이는 더 커집니다.

자동 확장 기능이 있고 많은 서버를 가동하는 경우라면 이는 매우 큰 문제입니다. 이는 서버가 더 빠른 속도로 트래픽을 수용할 준비가 되었음을 의미합니다.

서버를 많이 가동하지 않으면 속도 이점이 크게 떨어지지만 데이터 전송 및 저장 비용은 여전히 100MB 이상 절약됩니다.

 

 

4. 알파인은 안전합니다.

 

크기가 훨씬 작은 또 다른 장점은 공격을 받는 표면적이 훨씬 적다는 것입니다.

시스템에 패키지와 라이브러리가 많지 않으면 잘못될 수 있는 일이 거의 없습니다.

몇 년 전에 "ShellShock"이라는 이름으로 공격해 해커가 피해를 입은 경우 컴퓨터에 대한 제어권을 얻을 수 있는 불쾌한 Bash 공격이 있었습니다.

알파인에는 Bash는 기본적으로 설치되지 않기 때문에 해당 공격에서 무사했습니다..

 

또한 대부분의 배포판은 기본적으로 수많은 서비스를 실행합니다. 최신 Debian 또는 Ubuntu 시스템의 ps aux 출력 길이는 1마일이나 됩니다. 이는 Docker가 아닌 설정에서는 합리적일 수 있지만 Dockerized 애플리케이션에는 기본적으로 시작되는 대부분의 작업이 필요하지 않을 가능성이 있습니다.

알파인은 훨씬 다른 접근 방식을 취합니다. 기본적으로 너무 많이 시작하지 않으며 필요한 것만 시작하기를 기대합니다. 이는 Dockerized 애플리케이션에 적합합니다.

 

작업에 가장 적합한 도구를 사용하세요


알파인은 보안 전반에 대해서도 강력한 입장을 취했습니다. 개발팀은 특정 패키지를 보다 안전한 버전으로 교체하는 것을 두려워하지 않습니다. 예를 들어 OpenSSL을 LibreSSL로 대체했습니다.

위에 링크된 페이지에서 이 인용문이 정말 마음에 듭니다.

While OpenSSL is trying to fix the broken code, libressl has simply removed it.

 - OpenSSL이 손상된 코드를 수정하려고 시도하는 동안 libressl은 이를 제거했습니다.

 

제 생각엔 이것이 바로 알파인의 특징이라고 생각합니다. 작고 안전한 Linux 배포판이 되겠다는 약속을 실제로 실천하고 있습니다. 기본 Docker 이미지로 사용될 때 Docker와 함께 사용하기에 완벽한 콤보입니다.

 

 

 

 

 

 

반응형

+ Recent posts