본문 바로가기

DevOps & Infra/Docker

[Infrastructure/Docker] 도커 비지박스(BusyBox) 사용하기

비지박스(BusyBox)란?

BusyBox는 통용되는 Unix 유틸리티 여러 개를 아주 작은 애플리케이션으로 결합한 이미지입니다. 자원 사용이 한정적인 임베디드 시스템에서 사용하기 위한 목적으로 이미지 크기가 작다는 것이 특징입니다.

$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
ubuntu       latest    ff0fea8310f3   2 weeks ago    72.8MB
busybox      latest    2fb6fc2d97e1   2 weeks ago    1.24MB

최신 Ubuntu와 BusyBox 용량을 비교하면 약 70MB와 1.24MB로 크기 차이가 상당합니다. BusyBox의 버전에 따라서 차이가 있지만 일반적으로 1~5MB 사이의 크기를 갖고 있습니다.

  • Unix 유틸리티의 최적화된 패키지
  • 리소스 최적화, 임베디드 시스템, 디스크 사용이 제한된 환경에 적합
  • Unix 유틸리티가 필요한 간단한 테스트를 위해 사용

BusyBox의 주요 목적은 임베디드 시스템처럼 디스크 사용이 제한 환경에서의 리소스 최적화입니다. 도커 파일에서 BusyBox 기본 이미지를 사용하고, 애플리케이션을 제작을 하는 것이 일반적입니다.

# Dockerfile
FROM busybox

이번 포스트에서는 테스트 환경 구축에 중심을 두고 BusyBox 사용법을 간단히 소개하고자 합니다.

BusyBox 컨테이너의 실행 및 종료

CLI에서 다음 명령문을 사용하여 BusyBox 컨테이너를 실행합니다. 로컬 호스트에 BusyBox 이미지가 없으면 최신 버전을 다운로드 받아 실행합니다.

$ docker run -it --rm busybox

BusyBox를 기본 이미지로 삼는 애플리케이션을 제작하는 경우가 아니라면, Unix 유틸리티의 간단한 사용을 위해 컨테이너를 실행 할 수 있습니다. 이 때 --rm 플래그를 추가하여 일회성 컨테이너가 되도록 실행합니다.

BusyBox가 실행되면 다음과 같이 컨테이너에서 사용 가능한 Unix 유틸리티의 리스트를 출력 할 수 있습니다.

# ls /bin
[                  ether-wake         less               pmap               swapon
[[                 expand             link               popmaildir         switch_root
acpid              expr               linux32            poweroff           sync
add-shell          factor             linux64            powertop           sysctl
addgroup           fakeidentd         linuxrc            printenv           syslogd
adduser            fallocate          ln                 printf             tac
(생략)

컨테이너를 종료하려면 다음과 같이 입력합니다.

# exit

Windows 또는 MacOS에서 Linux 명령어 사용

BusyBox를 사용하면 다른 OS에서 쉽게 Linux 명령어를 사용 할 수 있습니다. 우선 로컬 호스트의 네트워크를 사용하도록 BusyBox 컨테이너를 실행합니다.

$ docker run -it --rm --network=host busybox

예를 들어 telnet의 경우 Windows 또는 MacOS에서는 기본으로 지원하지 않습니다. 이처럼 Linux 명령어를 다른 OS에서 사용하려면 추가 설치 등의 수고로움이 따릅니다.

# telnet www.naver.com 80
Connected to www.naver.com

BusyBox 컨테이너를 사용하면 타 OS에서의 Linux 명령어의 접근성이 훨씬 높아집니다. 특히 일회성 테스트 등의 목적이라면, 테스트 환경을 구축하는데 들이는 시간을 단축하고 개발에 더 집중 할 수 있습니다.