
-
컨테이너화 만나보기
Mac에서 Linux 컨테이너를 생성 및 실행하기 위해 Swift로 작성된 오픈 소스 프로젝트인 컨테이너화를 만나보세요. 컨테이너화가 Linux 컨테이너에 비공개로 안전하게 접근하는 방법을 알아보세요. 오픈 소스 컨테이너 CLI 도구가 컨테이너화 패키지를 활용하여 Mac에서 Linux 컨테이너를 빌드, 실행 및 배포할 수 있는, 간단하지만 강력한 기능을 제공하는 방법을 확인하세요.
챕터
- 0:00 - 서론
- 0:48 - 컨테이너의 정의
- 3:50 - 컨테이너화 자세히 살펴보기: 이미지 관리
- 5:53 - 컨테이너화 자세히 살펴보기: 가상화
- 6:53 - 컨테이너화 자세히 살펴보기: 컨테이너 환경
- 9:19 - 명령어 라인 도구
- 11:45 - 요약
리소스
-
비디오 검색…
안녕하세요 저는 Michael입니다 오늘은 새로운 오픈 소스 프레임워크를 소개하고자 합니다 컨테이너화는 Swift 프레임워크로서 기본 앱 느낌의 컨테이너화된 응용 프로그램을 빌드합니다 컨테이너화의 보안, 개인정보 보호 및 성능에 대한 집중이 Linux 컨테이너 디자인과 구현에 어떤 도움이 되었는지 보겠습니다 컨테이너화 프레임워크를 둘러보기 전에 먼저 컨테이너에 대해 알아보겠습니다 그런 다음 컨테이너화에서 나온 API를 보겠습니다 마지막으로 컨테이너 빌드, 실행 및 관리를 위한 명령 라인 도구를 살펴보겠습니다 그러면 이제 컨테이너의 정의와 컨테이너로 문제 해결하는 일반적인 사례를 보겠습니다 Linux 컨테이너는 서버 측 응용 프로그램을 빌드, 테스트 및 배포하는 데 표준으로 자리 잡았습니다 서버 측 워크로드를 대규모로 배포할 때 이 워크로드는 다양한 환경에서 실행되어야 합니다 컨테이너를 사용하면 워크로드를 호스트 컴퓨터에서 분리하고 워크로드끼리도 분리 가능합니다 컨테이너를 사용하면 로컬 컴퓨터에서 배포 환경을 복제할 수도 있습니다 덕분에 로컬에서 응용 프로그램 개발 및 테스트가 가능합니다 마치 프로덕션 환경에서 실행되는 것처럼 말입니다 가능한 이유는 개발자가 컨테이너로 응용 프로그램과 응용 프로그램의 종속성을 패키징할 수 있기 때문입니다 종속성에는 바이너리, 동적 라이브러리, 애셋 등이 있습니다 응용 프로그램 및 종속성을 함께 패키징하면 컨테이너가 호스트 컴퓨터나 다른 컨테이너와는 다른 버전의 종속성을 보유할 수 있습니다 결과는 단일 배포 가능 단위인 컨테이너에 패키징됩니다 컨테이너에는 추가적인 런타임 분리 기능도 있습니다 컨테이너에는 보통 호스트 머신과 분리된 네트워크 스택이 있습니다 개인정보 보호를 위해 컨테이너의 실행 프로세스에서는 호스트나 다른 컨테이너 프로세스 보기와 검사를 못합니다 컨테이너는 서로 독립적으로 크기를 조절하고 확장합니다 CPU, 메모리, 디스크와 같은 리소스를 워크로드의 필요에 따라 할당할 수 있습니다
macOS에서 Linux 컨테이너를 실행하려면 Linux 환경을 가상화해야 합니다 기존의 솔루션은 대규모 가상 컴퓨터를 생성하여 실행 중인 컨테이너를 모두 호스팅하는 것입니다 이 가상 컴퓨터에 리소스가 할당되며 컨테이너가 추가되면 해당 리소스를 필요한 곳에 분배합니다 Mac의 추가 디렉토리와 파일을 공유해야 하는 경우 먼저 가상 컴퓨터와 공유한 후 해당 데이터를 요청한 특정 컨테이너에 제공합니다 Linux 컨테이너를 macOS로 가져올 방법을 모색할 때 달성하고자 하는 몇 가지 목표가 있었습니다 보안 측면에서 우리의 목표는 현재 대규모 가상 컴퓨터와 동일한 분리 수준을 각 컨테이너에 실현하기입니다 또한 가상 컴퓨터 내부의 핵심 유틸리티와 동적 라이브러리에 대한 필요를 줄이는 것입니다 이렇게 하면 해당 항목의 최신 상태 유지에 필요한 공격 표면과 유지 관리 비용이 줄어듭니다 개인정보 보호 측면에서는 컨테이너별로 디렉토리 접근 권한을 제한해야 합니다 디렉토리를 요청하는 컨테이너에 한해 해당 콘텐츠에 접근할 수 있어야 합니다 또한 원활하면서 사용자의 리소스를 존중하는 환경을 구현해야 합니다
컨테이너화를 빌드할 때 이 디자인 목표를 고려했습니다 컨테이너화는 오픈 소스 Swift 프레임워크입니다 이미지 관리, 컨테이너 실행 Swift의 init 시스템을 위한 API를 제공해 줍니다 이제 컨테이너 만드는 방법에 대한 몇 가지 API를 보겠습니다 먼저 컨테이너화의 이미지 관리 처리 방법을 확인해 보겠습니다
대부분의 컨테이너는 이미지로 만듭니다 이미지는 배포 아티팩트인데 파일 시스템 콘텐츠와 기본 구성을 포함하고 있습니다 이미지는 새 컨테이너 제작 시 템플릿 역할을 합니다
컨테이너화는 이미지의 파일 시스템 콘텐츠와 구성을 위한 API를 제공합니다 이 작업을 구성하는 요소는 레지스트리에 대한 요청 이미지의 저장 및 배포를 처리하는 서비스 레지스트리의 응답을 로컬 파일 시스템에 기록, 사용 단계입니다
이미지가 로컬에 존재하게 되면 이미지의 구성을 새 컨테이너의 시작점으로 사용할 수 있습니다 이미지 구성의 포함 사항으로는 실행할 기본 프로세스 프로세스가 실행되는 작업 디렉토리 실행할 사용자가 있습니다 이미지의 파일 시스템 콘텐츠에는 응용 프로그램에 대한 파일과 디렉토리가 포함됩니다 이미지의 콘텐츠에 원활하게 접근할 수 있도록 파일 시스템은 블록 기기로 노출됩니다 블록 기기는 대규모 파일을 만드는 작업과 이 파일을 파일 시스템으로 포맷하는 작업으로 구성됩니다 Linux 컨테이너에서 이 블록 기기를 사용하려면 Linux에서 이해할 수 있는 파일 시스템으로 포맷해야 합니다 EXT4가 널리 사용되는 Linux 파일 시스템이며 컨테이너화에서 제공하는 Swift 패키지를 사용하면 포맷하고, 디렉토리 구조를 만들고 Swift에서 직접 EXT4 파일 시스템을 채울 수 있습니다 이미지로 컨테이너를 만든 후에는 Linux 가상 컴퓨터를 시작해 컨테이너를 실행합니다 보안 측면에서 우리의 목표는 대규모 가상 컴퓨터와 동일한 분리 수준을 구현하고 시작된 컨테이너 모두에 이를 적용하는 것이었습니다 이를 위해 컨테이너화에서는 각 컨테이너를 자체 가상 경량컴퓨터에서 실행 하며 1초 미만에 시작됩니다 이 방식에서는 각 컨테이너에 자체 전용 IP 주소가 있다는 이점도 있습니다 전용 IP 주소 덕분에 각 컨테이너에 대한 네트워크 접근이 원활하며 컨테이너에서 제공하는 서비스에 접근하고자 할 때 개별 포트를 매핑할 필요가 없습니다 디렉토리와 파일을 공유할 때 디렉토리 요청 컨테이너에 한해 콘텐츠에 접근할 수 있습니다 CPU 및 메모리와 같은 리소스도 마찬가지입니다 실행 중인 컨테이너가 없으면 리소스가 할당되지 않습니다 시작하면 가상 컴퓨터 내부에서 다음 단계가 진행됩니다 컨테이너화에서 시작 전에 런타임 환경을 설정하는 방법을 살펴보겠습니다 가상 컴퓨터를 시작하면 초기 프로세스가 생성됩니다 이 프로세스의 바이너리는 컨테이너화의 일부인 최소한의 파일 시스템에서 제공됩니다 이 파일 시스템에는 vminitd라는 바이너리가 있습니다 vminitd는 Swift 내장 init 시스템 이며 가상 컴퓨터 내부에서 첫 번째 프로세스로 실행됩니다
초기 프로세스가 실행되면서 컨테이너 실행 이전과 도중에 다양한 담당 책임이 등장합니다 vminitd는 네트워크 인터페이스에 IP 주소 할당 작업과 블록 기기로 노출되는 이미지의 콘텐츠 등을 파일 시스템에 마운트하는 작업을 담당합니다 가상 컴퓨터 내부에서 실행되는 모든 프로세스의 시작 및 감독도 담당합니다 vminitd에는 호스트에서 프로세스를 생성하고 관리할 수 있는 API가 있습니다 기존에는 대규모 가상 컴퓨터를 사용할 때 전체 시스템으로 부팅했습니다 이러한 대규모 가상 컴퓨터의 파일 시스템에는 libc 구현, 동적 라이브러리 cd, cp, ls와 같은 핵심 유틸리티가 포함됩니다 보안 측면에서 컨테이너의 공격 표면을 줄이고자 합니다 컨테이너화의 파일 시스템에는 핵심 유틸리티가 없습니다 동적 라이브러리와 libc 구현도 없습니다 vminitd를 이 제한된 환경에서 실행하려면 즉 연결할 라이브러리가 없는 환경에서 실행하려면 vminitd를 정적 실행 파일로 컴파일합니다 Swift의 Static Linux SDK를 사용해 Mac에서 직접 정적 Linux 바이너리를 크로스 컴파일할 수 있습니다 또한 정적 연결을 완벽하게 지원하는 libc 구현인 musl을 사용할 수 있습니다 이를 통해 vminitd를 Mac에서 크로스 컴파일된 정적 Linux 실행 파일을 생성 이 분리된 환경에서 실행합니다 컨테이너화는 모든 핵심 구성 요소를 결합, Linux 컨테이너로 솔루션을 빌드하는 데 강력한 API를 제공합니다 이제 컨테이너를 간단하고 안정적으로 실행하는 방법인 명령 라인 도구를 보겠습니다 컨테이너 도구는 컨테이너화 API로 빌드된 CLI와 XPC 서비스로 구성됩니다 이러한 서비스는 저장, 이미지 관리, 그리고 컨테이너에 IP 주소 할당과 DNS 요청을 처리하는 네트워크 서비스에 대한 지원을 제공합니다 마지막으로 컨테이너의 관리 및 런타임입니다 우선 터미널로 들어가서 컨테이너를 사용해 이미지를 로컬 컴퓨터로 가져와 보겠습니다 이제 터미널에 들어왔고 container image pull을 입력하면 됩니다
그리고 이미지 이름을 입력합니다 이 데모에서는 alpine:latest 라고 하겠습니다 이 명령 실행 시 컨테이너가 이미지 콘텐츠 및 구성을 로컬로 가져온 다음 사용할 블록 파일을 만듭니다 좋습니다
이제 로컬에 이미지가 있고 이미지로 컨테이너를 실행합니다
이 도구는 이미지의 파일 시스템 콘텐츠 및 구성으로 컨테이너를 만듭니다 그런 다음 컨테이너화 API를 사용해 컨테이너를 실행할 가벼운 가상 컴퓨터를 시작합니다 이제 터미널로 돌아가서 실제 동작을 확인해 보겠습니다 container run을 입력 하여 실행 명령을 시작하며 대화형 셸을 실행하려고 합니다 -t와 i 플래그로 각각 터미널 기기와 대화형 입력을 추가합니다 마지막으로 이미지 이름과 실행할 명령을 입력합니다 셸을 의미하는 sh가 되겠고요 수백 밀리초 이내에 대화형 셸로 들어갑니다 이어서 컨테이너의 런타임 환경을 검사하며 uname -a를 실행하면 Linux 환경임을 알 수 있습니다 그리고 컨테이너의 분리 상태 때문에 ps aux와 같은 명령을 실행하면 현재 셸과 ps 프로세스만 볼 수 있습니다 호스트나 다른 컨테이너의 여타 프로세스는 보이지 않습니다 이상은 컨테이너 명령라인툴이며 GitHub에서도 확인하세요 컨테이너화 API를 사용하면 컨테이너를 위한 안전하고 원활한 비공개 경험을 제공합니다 macOS에 컨테이너화 프리미티브 도입에 함께해 주세요 Linux 컨테이너 통합 프로젝트를 빌드하는 데 관심이 있으시다면 GitHub의 컨테이너화 프레임워크를 확인해 보세요 가벼운 가상 컴퓨터를 시작하는 소스 코드를 확인하세요 vminitd를 위해 마련된 크로스 플랫폼 Swift 패키지를 보고 예제 프로젝트를 확인해 보세요 컨테이너 실행 작업을 시작하려면 컨테이너 도구를 사용하고 GitHub 대화에 참여하세요 소스 코드 보기, 문제 제출 pull 요청을 할 수 있습니다 여러분의 다음 결과물을 기대하고 있겠습니다
-
-
9:58 - Container Image Pull
container image pull alpine:latest
-
10:43 - Container Run
container run -t -i alpine:latest sh
-
-
- 0:00 - 서론
컨테이너화라는 새로운 오픈 소스 Swift 프레임워크를 통해 개발자는 네이티브한 느낌으로 안전하고, 개인적이며, 고성능의 컨테이너화된 Linux 애플리케이션을 빌드할 수 있습니다. 프레임워크에는 컨테이너 생성, 관리, 실행을 위한 API와 명령줄 도구가 포함되어 있습니다.
- 0:48 - 컨테이너의 정의
Linux 컨테이너는 작업 부하 및 종속성을 분리하여 서버 측 애플리케이션 배포를 혁신하고 개발자가 특정 요구 사항에 맞게 애플리케이션을 패키징할 수 있도록 합니다. 이러한 패키징을 통해 로컬 및 프로덕션 설정에서 일관된 환경을 구축하고 개발과 테스트를 간소화할 수 있습니다. 컨테이너는 런타임 격리를 제공하고 macOS에서 Linux 컨테이너를 실행하려면 가상화가 필요합니다. 컨테이너화의 목표는 강력한 보안 격리를 달성하고, 가상 머신 오버헤드를 줄이며, 컨테이너별 디렉터리 액세스 제어를 통해 개인 정보 보호 기능을 강화하고, 사용자 리소스를 존중하는 고성능 환경을 제공하는 것입니다.
- 3:50 - 컨테이너화 자세히 살펴보기: 이미지 관리
컨테이너화는 Swift에 내장된 이미지 관리, 컨테이너 실행, 강력한 초기화 시스템을 위한 API를 제공합니다. 컨테이너화는 레지스트리에서 이미지를 가져오는 방식으로 작동합니다. 이미지는 새 컨테이너의 파일 시스템 콘텐츠 및 기본 구성을 담고 있는 템플릿 역할을 합니다. 이미지 구성에서는 실행할 기본 프로세스, 작업 디렉터리, 사용자 ID를 지정할 수 있습니다. 컨테이너화는 성능이 준수한 액세스를 위해 이미지의 파일 시스템을 블록 기기로 노출하여 널리 사용되는 Linux 파일 시스템인 EXT4를 사용하여 블록 기기를 포맷합니다.
- 5:53 - 컨테이너화 자세히 살펴보기: 가상화
Swift에서 EXT4 파일 시스템을 직접 채우려면 시스템이 컨테이너화를 통해 가벼운 VM 수준 격리, 1초 미만의 시작 시간, 각 컨테이너에 대한 전용 IP, 안전한 파일 및 디렉터리 공유를 제공하는 컨테이너 실행을 위한 Linux VM을 시작합니다.
- 6:53 - 컨테이너화 자세히 살펴보기: 컨테이너 환경
컨테이너화는 컨테이너가 실행될 때만 CPU와 메모리와 같은 리소스가 동적으로 할당되는 VM을 활용합니다. 이 VM 내 최소 파일 시스템에는 Swift에 내장된 초기화 시스템인 ‘vminitd’ 바이너리가 포함되어 있습니다. ‘vminitd’는 첫 번째 프로세스로 실행되어 네트워크 인터페이스를 관리하고, 파일 시스템을 마운트하고, 이후의 모든 프로세스를 실행하고 감독합니다. 보안을 강화하기 위해 파일 시스템에서 핵심 유틸리티, 동적 라이브러리, ‘libc’가 제거되었습니다. 이를 위해 ‘vminitd’는 Swift의 Static Linux SDK를 사용하여 정적 실행 파일로 컴파일됩니다.
- 9:19 - 명령어 라인 도구
컨테이너화는 Linux 컨테이너를 중심으로 솔루션을 구축할 수 있는 강력한 API를 제공합니다. 명령줄 툴인 ‘컨테이너’는 이러한 API를 활용하여 스토리지, 이미지, 네트워크를 관리하고 컨테이너를 실행합니다. 사용자는 ‘container image pull’을 사용하여 로컬로 이미지를 가져온 다음 ‘container run -t -i
’를 사용하여 대화형으로 컨테이너를 실행할 수 있습니다. 이러한 접근 방식은 가벼운 VM을 생성하여 격리를 제공하는데, ‘ps aux’가 컨테이너 프로세스만 표시하는 것처럼 보입니다. 해당 툴은 GitHub에서 사용할 수 있습니다. - 11:45 - 요약
macOS는 이제 안전하고, 개인적이며, 성능이 준수한 Linux 컨테이너를 구현하는 Containerization API를 지원합니다. GitHub에서 Containerization 프레임워크에 액세스하여 소스 코드를 살펴보고 예제 프로젝트를 확인하세요. 컨테이너 툴은 즉시 사용 가능합니다. GitHub을 통해 커뮤니티 피드백을 보내 주시기 바랍니다.