macOS 컨테이너 머신
Source: Hacker News
Container machine은 Mac에서 원활하게 동작하는 고도로 통합된 Linux 환경을 제공합니다. 컨테이너 머신은 빠르고 가볍으며 영구적입니다. 표준 OCI 이미지를 기반으로 하며, 이미지를 빌드하고 공유할 수 있습니다. 자동 사용자 및 홈 디렉터리 공유와 같은 호스트 통합 기능을 통해 터미널 어디에서든 Linux 환경에 빠르고 쉽게 접근할 수 있습니다.
왜 컨테이너 머신인가
컨테이너는 일반적으로 애플리케이션을 모델링합니다. 반면 컨테이너 머신은 Linux 환경 자체를 모델링합니다. 이미지의 init 시스템을 실행하므로 장기 실행 서비스 등록이나 프로세스 감독 하에 애플리케이션을 테스트할 수 있습니다.
컨테이너 머신은 자동으로 사용자 이름과 홈 디렉터리를 Linux 환경에 매핑합니다. 저장소와 dotfile이 양쪽 플랫폼에서 모두 사용 가능합니다. macOS에서 편집기를 사용하면서 동시에 Linux 환경 안에서 애플리케이션을 빌드하고 실행할 수 있습니다.
-
Mac에서 편집하고 내부에서 빌드
저장소는 macOS의$HOME에 존재하고, 컨테이너 머신 안에서는/Users/에 마운트됩니다. macOS 편집기나 IDE를 사용하고, 컴파일과 실행은 컨테이너 머신 안에서 수행합니다. -
Linux 아티팩트에 macOS 네이티브 도구 사용
프로파일러, 스크린샷 도구, 브라우저, GUI 디버거 등 macOS 도구가 컨테이너 머신이 보는 동일한 파일을 직접 확인합니다. “빌드했다”와 “검사한다” 사이에 복사 단계가 없습니다. -
테스트용 실제 Linux 서비스
데이터베이스 등 스택에 필요한 서비스를 시스템 서비스로 실행합니다.systemctl start postgresql명령은systemd가 설치된 이미지에서 동작합니다. -
대상 배포판당 하나의 환경
alpine,ubuntu,debian등 목표 배포판마다 컨테이너 머신을 여러 개 만들 수 있습니다. 각 머신은 동일한$HOME과 macOS의 동일한 dotfile을 공유합니다. 다양한 배포판에서 애플리케이션을 빠르게 테스트하세요.
빠른 시작
# your Mac home dir, mounted in
container machine run -n dev # 인터랙티브 쉘; $HOME에 있는 저장소로 이동
container machine create alpine:latest --name dev
container machine run -n dev whoami # 호스트 사용자 이름, root가 아님
container machine run -n dev pwd # /home/ — macOS 홈 디렉터리가 마운트된 경로
container machine run -n dev # 인터랙티브 쉘; $HOME에 있는 저장소로 이동
container machine run 은 쉘을 얻거나 단일 명령을 실행할 때 사용합니다. 컨테이너 머신이 정지돼 있으면 run 이 먼저 부팅합니다.
컨테이너 머신 안에서 작업하기
쉘 열기 혹은 단일 명령 실행
명령을 지정하지 않으면 container machine run 은 호스트 계정과 동일한 사용자로 인터랙티브 쉘을 엽니다.
container machine run -n dev
명령을 전달하면 한 번 실행하고 종료합니다.
container machine run -n dev uname -a
container machine run -n dev -- cat /proc/cpuinfo
기본 머신 지정
기본 컨테이너 머신을 지정하면 -n 플래그를 생략할 수 있습니다.
container machine set-default dev
container machine run # 기본값인 dev에서 동작
목록, 상세 조회, 정지, 삭제
container machine ls # 모든 컨테이너 머신 목록
container machine inspect dev # 하나에 대한 JSON 상세 정보
container machine stop dev # 컨테이너 머신 정지
container machine rm dev # 영구 저장소 포함 삭제
container machine 은 별칭 m 을 가집니다. 따라서 m ls, m run 등도 동일하게 동작합니다.
CPU·메모리 크기 조정 또는 홈 마운트 변경
container machine set 은 디스크상의 설정을 업데이트합니다. 변경 사항은 다음 정지·시작 이후에 적용됩니다.
container machine set -n dev cpus=4 memory=8G
container machine stop dev
container machine run -n dev -- nproc
메모리 기본값은 호스트 메모리의 절반이며, 홈 마운트는 rw(기본), ro, none 중 선택할 수 있습니다.
직접 만든 컨테이너 머신 이미지 사용하기
/sbin/init 를 포함하는 모든 Linux 이미지가 컨테이너 머신으로 사용할 수 있습니다. 예를 들어, 아래 Dockerfile 은 systemd 와 일반적인 CLI 도구가 포함된 Ubuntu 24.04 컨테이너 머신 이미지를 빌드합니다.
FROM ubuntu:24.04
ENV container container
RUN apt-get update && \
apt-get install -y \
dbus systemd openssh-server net-tools iproute2 iputils-ping curl wget vim-tiny man sudo && \
apt-get clean && \
rm -rf /var/lib/apt/lists/* && \
yes | unminimize
RUN >/etc/machine-id
RUN >/var/lib/dbus/machine-id
RUN systemctl set-default multi-user.target
RUN systemctl mask \
dev-hugepages.mount \
sys-fs-fuse-connections.mount \
systemd-update-utmp.service \
systemd-tmpfiles-setup.service \
console-getty.service
RUN systemctl disable \
networkd-dispatcher.service
RUN sed -i -e 's/^AcceptEnv LANG LC_*$/#AcceptEnv LANG LC_*/' /etc/ssh/sshd_config
이미지를 빌드하고 이를 기반으로 컨테이너 머신을 생성합니다.
container build -t local/ubuntu-machine:latest .
container machine create local/ubuntu-machine:latest --name ubuntu
기본적으로 container 는 첫 부팅 시 내장된 설정 스크립트를 실행해 앞서 설명한 사용자를 프로비저닝합니다. 직접 설정 스크립트를 사용하려면 이미지에 실행 가능한 /etc/machine/create-user.sh 를 추가하면 됩니다. 이 스크립트는 첫 부팅 시 root 권한으로 한 번 실행되며 다음 환경 변수가 설정됩니다.
CONTAINER_GIDCONTAINER_HOMECONTAINER_MACHINE_IDCONTAINER_UIDCONTAINER_USER