Docker on Lima로 기기 잠금 해제Desktop for Mac

9638 단어 Dockerlimatech
드디어 Docker Desktop의 유상화의 기한(2/1유상화 시작)이 다가왔다.
곳곳에서 대안이 화제가 됐는데 저도
  • Vagrant
  • Multipass
  • podman
  • Lima
  • 주위의 상황을 검증했다.
    그 중에서도 Lima에서 Docker를 이동하는 방법이 가장 간단한데, Docker Desktop for Mac의 사용감에 가깝기 때문에 이 방법을 소개하고자 합니다.

    이른바 리마


    https://github.com/lima-vm/lima
    Linux의 VM은 MacOS에서 시작할 수 있으며 VirtualBox에 가까운 이미지입니다.
    VirtualBox와의 차이는 다음과 같습니다.
  • 간단한 가져오기
  • brew로 간단하게 설치
  • 간단한 설치
  • 시작하려는 VM 환경을 정의하는 yaml 파일을 준비합니다limactl start. 명령을 두드리기만 하면 됩니다
  • MacOS와 고객 OS 간의 원활한 공동 작업
  • 공유 파일 시스템 및 네트워크 등
  • 그냥 Lima를 쓰지 그랬어요.


    Lima에는 contained가 포함되어 있습니다.
    지정
    lima nerdctl compose -f docker-compose.yml up
    
    을 통해 리마의contaainerd에서 컨테이너를 가동하고 지금까지docker-compose.yml를 사용할 수 있다.
    다만, 리마를 직접 사용할 수 없다는 이유에서다.
  • nerdctl compose가 전부 실현된 것은 아니다docker-compose의 명령
  • locallstack을 사용할 때locallstack에서 UNIX역 콘센트를 통해 Docker 협업
  • 때로는 IDE 등에서 Docker 협업도 하고 싶다
  • Docker on Lima?


    이러한 문제를 해결하기 위해 Lima에서 Docker Engine을 시작하고 UNIX 필드 플러그를 통해 Docker에 직접 접근하는 방법을 사용했습니다.

    사전 준비


    MacOS에 대한 최대 파일 설명자 증가


    macOS와 Lima는 현재 버전에서 SSHOFS를 통해 파일을 공유합니다.
    이러한 관계로 인해 Docker 내의 파일 작업이든 MacOS 측의 파일 접근이든 모두 실행되기 때문에 파일 설명자의 상한선에 걸리기 쉽다(macOS 기본 상한선은 256).
    유효성을 검사할 때 Docker 컨테이너에 sprite 이미지를 생성하는 동안 오류가 발생했습니다Operation not permitted : open.
    이 잘못된 내용 때문에 맥OS 측의 파일 설명자 상한선에 걸렸을 줄은 몰랐습니다. 원인의 특정에 상당히 고생이 많았는데...
    macOS 파일 설명자 상한선을 높이는 방법은 다음과 같습니다.
  • /Library/LaunchDaemons/limit.maxfiles.plist 파일 만들기
  • <?xml version="1.0" encoding="UTF-8"?>  
      <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"  
              "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
      <plist version="1.0">
        <dict>
          <key>Label</key>
          <string>limit.maxfiles</string>
          <key>ProgramArguments</key>
          <array>
            <string>launchctl</string>
            <string>limit</string>
            <string>maxfiles</string>
            <string>64000</string>
            <string>64000</string>
          </array>
          <key>RunAtLoad</key>
          <true/>
          <key>ServiceIPC</key>
          <false/>
        </dict>
      </plist>
    
  • 파일의 소유자를 루트로 변경
  • sudo chown root /Library/LaunchDaemons/limit.maxfiles.plist
    
  • 설정의 유효성
  • sudo launchctl load -w /Library/LaunchDaemons/limit.maxfiles.plist
    

  • MacOS 재부팅

  • 확인 반영
  • $ ulimit -a
    Maximum size of core files created                           (kB, -c) 0
    Maximum size of a process’s data segment                     (kB, -d) unlimited
    Maximum size of files created by the shell                   (kB, -f) unlimited
    Maximum size that may be locked into memory                  (kB, -l) unlimited
    Maximum resident set size                                    (kB, -m) unlimited
    Maximum number of open file descriptors                          (-n) 64000
    Maximum stack size                                           (kB, -s) 8192
    Maximum amount of cpu time in seconds                   (seconds, -t) unlimited
    Maximum number of processes available to a single user           (-u) 2048
    Maximum amount of virtual memory available to the shell      (kB, -v) unlimited
    

    환경 구조


    Lima 설치


    brew로만 설치합니다.간단하다
    brew install lima
    

    lima.파일 만들기


    다음 내용의limasample.yml 파일을 생성합니다.
    내용은lima의 창고에 포함된Docker의 example을 사용했다.
    작업 디렉터리를 마운트하기 위해서, 필요할 때 mounts의location 지정을 수정합니다.
    arch: "default"
    images:
      - location: "https://cloud-images.ubuntu.com/impish/current/impish-server-cloudimg-amd64.img"
        arch: "x86_64"
      - location: "https://cloud-images.ubuntu.com/impish/current/impish-server-cloudimg-arm64.img"
        arch: "aarch64"
    cpus: 4
    memory: "8GiB"
    disk: "100GiB"
    mounts:
      - location: "~"
        # CAUTION: `writable` SHOULD be false for the home directory.
        # Setting `writable` to true is possible, but untested and dangerous.
        writable: false
      # 作業ディレクトリを指定
      - location: "~/Documents/workspaces"
        writable: true
    ssh:
      localPort: 60006
      loadDotSSHPubKeys: true
    containerd:
      # Enable system-wide (aka rootful)  containerd and its dependencies (BuildKit, Stargz Snapshotter)
      # Default: false
      system: false
      # Enable user-scoped (aka rootless) containerd and its dependencies
      # Default: true
      user: true
    provision:
      # `system` is executed with the root privilege
      - mode: system
        script: |
          #!/bin/sh
          sed -i 's/host.lima.internal.*/host.lima.internal host.docker.internal/' /etc/hosts
      - mode: system
        script: |
          #!/bin/bash
          set -eux -o pipefail
          command -v docker >/dev/null 2>&1 && exit 0
          export DEBIAN_FRONTEND=noninteractive
          curl -fsSL https://get.docker.com | sh
          # NOTE: you may remove the lines below, if you prefer to use rootful docker, not rootless
          systemctl disable --now docker
          apt-get install -y uidmap dbus-user-session
      # `user` is executed without the root privilege
      - mode: user
        script: |
          #!/bin/bash
          set -eux -o pipefail
          systemctl --user start dbus
          dockerd-rootless-setuptool.sh install
          docker context use rootless
    probes:
      - script: |
          #!/bin/bash
          set -eux -o pipefail
          if ! timeout 30s bash -c "until command -v docker >/dev/null 2>&1; do sleep 3; done"; then
            echo >&2 "docker is not installed yet"
            exit 1
          fi
          if ! timeout 30s bash -c "until pgrep rootlesskit; do sleep 3; done"; then
            echo >&2 "rootlesskit (used by rootless docker) is not running"
            exit 1
          fi
        hint: See "/var/log/cloud-init-output.log". in the guest
    portForwards:
      - guestSocket: "/run/user/{{.UID}}/docker.sock"
        hostSocket: "{{.Dir}}/sock/docker.sock"
    message: |
      To run `docker` on the host (assumes docker-cli is installed):
      $ export DOCKER_HOST=unix://{{.Dir}}/sock/docker.sock
      $ docker ...
    

    Lima VM 시작


    처음 시작할 때


    yml 시작 지정
    limactl start lima_sample.yml
    
    처음의 경우
  • Proceed with the default configuration
  • Open an editor to override the configuration
  • 옵션을 선택하십시오Proceed with the default configuration.
    다음 로그가 표시되면 성공합니다.
    ? Creating an instance "lima_sample" Proceed with the default configuration
    
    ...
    
    INFO[0147] [hostagent] The final requirement 1 of 1 is satisfied
    INFO[0147] READY. Run `limactl shell lima_sample` to open the shell.
    INFO[0147] To run `docker` on the host (assumes docker-cli is installed):
    INFO[0147] $ export DOCKER_HOST=unix:///Users/xxx/.lima/lima_sample/sock/docker.sock
    INFO[0147] $ docker ...
    

    2차 이후 부팅 시


    두 번째 이후에는 파일을 지정하지 않고 Lima VM의 이름을 지정하여 시작합니다.
    limactl start lima_sample
    

    Lima에서 Docker 액세스 준비


    Lima에서 실행 중인 Docker~/.lima/lima_sample/sock/docker.sock를 사용합니다.
    이렇게 하면 Docker Desktop for Mac의 환경과 다르기 때문에 /var/run/docker.sock에 기호 링크를 만듭니다.
    sudo ln -sf ~/.lima/lima_sample/sock/docker.sock /var/run/docker.sock
    
    쉽게 전환하려면 DOCKER_HOST 를 통해서도 지정할 수 있습니다.
    export DOCKER_HOST=unix://$HOME/.lima/lima_sample/sock/docker.sock
    

    Docker 활용


    위 단계에서 Docker가 Lima에서 실행되었습니다.
    $ docker ps
    CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
    
    이후 보통과 마찬가지로 docker-compose 등을 사용할 수 있다.

    Lima VM 상태 확인


    $ limactl list
    NAME              STATUS     SSH                ARCH      CPUS    MEMORY    DISK      DIR
    lima_sample       Running    127.0.0.1:60006    x86_64    4       8GiB      100GiB    /Users/xxxx/.lima/lima_sample
    

    Lima VM 중지


    limactl stop lima_sample
    

    Lima VM 환경 폐기


    limactl delete lima_sample
    

    주의점

  • Docker Desktop for Mac를 시작하면/var/run/docker.sock 파일을 덮어씁니다.이 경우 기호 링크를 다시 만듭니다.
  • 환경과 응용의 특성에 따라 달라지지만 SSHOS를 사용해서 그런지 Docker Desktop for Mac보다 성능이 떨어집니다.
    장래에9p 및 삼바의 전환 계획가 있을 수 있기 때문에 대응할 수 있다면 개선될 수 있을 것이다.
  • 인증은 Intel Mac에서 수행합니다.
    M1Mac에서 MySQL이 작동하지 않는 것 같지만 이번 구성 때문이 아니라 M1Mac의 문제(인터넷상에서 MariDB를 이용해 회피하는 것 같다).
  • 좋은 웹페이지 즐겨찾기