macOS 컨테이너 머신

발행: (2026년 6월 10일 AM 09:29 GMT+9)
8 분 소요

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_GID
  • CONTAINER_HOME
  • CONTAINER_MACHINE_ID
  • CONTAINER_UID
  • CONTAINER_USER
0 조회
Back to Blog

관련 글

더 보기 »

‘More Like This’의 진화

In many search scenarios, the user does not start from an empty query box, but from an existing result. A user opens an article and wants to find related materi...

죽음이다

I’m feeling hungry, so I go to my kitchen and turn on the stove. I inadvertently have the handle of the frying pan sitting above the flame and when I go to pick...