macOS 컨테이너 머신

1 hour ago 1
  • Container machine은 Mac에서 원활히 동작하는 빠르고 가벼운 영속 Linux 환경이며, 빌드와 공유가 가능한 표준 OCI 이미지 기반으로 작동함
  • 일반 컨테이너가 애플리케이션 모델에 가깝다면, 컨테이너 머신은 Linux 환경을 모델로 하며 이미지의 init 시스템을 실행해 장기 실행 서비스와 프로세스 감독 환경을 지원함
  • 사용자명과 홈 디렉터리가 자동 매핑되어 macOS의 저장소와 dotfiles를 Linux 환경에서도 사용할 수 있고, Mac 편집기나 IDE로 편집하면서 내부에서 빌드·실행할 수 있음
  • container machine run은 셸을 열거나 단일 명령을 실행하며, 중지된 컨테이너 머신은 먼저 부팅한 뒤 명령을 수행함
  • /sbin/init을 포함한 Linux 이미지는 컨테이너 머신으로 사용할 수 있고, 첫 부팅 시 기본 사용자 설정 스크립트 또는 사용자 정의 /etc/machine/create-user.sh를 실행할 수 있음

개요

  • Container machine은 Mac에서 통합된 Linux 환경을 제공하며, 빠르고 가볍고 영속적인 환경으로 동작함
  • 표준 OCI 이미지를 기반으로 하며, 이미지를 빌드하고 공유할 수 있음
  • 자동 사용자 및 홈 디렉터리 공유 같은 호스트 통합 기능으로 터미널 위치와 관계없이 Linux 환경에 빠르게 접근할 수 있음

컨테이너 머신이 필요한 이유

  • 일반 컨테이너는 보통 애플리케이션을 기준으로 모델링되지만, 컨테이너 머신은 Linux 환경을 기준으로 모델링됨
  • 컨테이너 머신은 이미지의 init 시스템을 실행해 장기 실행 서비스를 등록하거나 프로세스 감독자 아래에서 애플리케이션을 테스트할 수 있음
  • 사용자명과 홈 디렉터리가 Linux 환경에 자동 매핑되어 저장소와 dotfiles를 macOS와 Linux 양쪽에서 사용할 수 있음
  • macOS에서 편집기와 도구를 직접 쓰면서, Linux 환경 안에서 애플리케이션을 빌드하고 실행할 수 있음
  • Mac에서 편집하고 내부에서 빌드

    • 저장소는 macOS의 $HOME에 있으며, 컨테이너 머신 내부에서는 /Users/<username>에 마운트됨
    • macOS 편집기나 IDE를 사용하고, 컴파일과 실행은 컨테이너 머신 내부에서 수행할 수 있음
  • Linux 산출물에 macOS 네이티브 도구 사용

    • Mac의 프로파일러, 스크린샷 도구, 브라우저, GUI 디버거는 컨테이너 머신이 보는 파일과 같은 파일을 볼 수 있음
    • 빌드한 산출물을 검사하기 위해 파일을 복사하는 단계가 필요하지 않음
  • 테스트용 실제 Linux 서비스

    • 데이터베이스나 스택에 필요한 서비스를 시스템 서비스로 실행할 수 있음
    • systemd가 설치된 이미지에서는 systemctl start postgresql을 사용할 수 있음
  • 대상 배포판별 환경

    • alpine, ubuntu, debian 같은 대상 배포판 수만큼 컨테이너 머신을 만들 수 있음
    • 각 컨테이너 머신은 Mac의 같은 $HOME과 같은 dotfiles를 사용함
    • 여러 배포판에서 애플리케이션을 빠르게 테스트할 수 있음

빠른 시작

  • alpine:latest 이미지로 dev라는 컨테이너 머신을 만들고 명령을 실행할 수 있음
container machine create alpine:latest --name dev container machine run -n dev whoami # 호스트 사용자명, root 아님 container machine run -n dev pwd # /home/<you> — Mac 홈 디렉터리가 마운트됨 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에서 동작함
  • 목록, 검사, 중지, 삭제

    • 컨테이너 머신 목록 확인, JSON 세부 정보 조회, 중지, 삭제 명령을 사용할 수 있음
    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와 일반 명령줄 도구를 갖춘 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
Read Entire Article