Docker on Lima로 기기 잠금 해제Desktop for Mac
곳곳에서 대안이 화제가 됐는데 저도
그 중에서도 Lima에서 Docker를 이동하는 방법이 가장 간단한데, Docker Desktop for Mac의 사용감에 가깝기 때문에 이 방법을 소개하고자 합니다.
이른바 리마
Linux의 VM은 MacOS에서 시작할 수 있으며 VirtualBox에 가까운 이미지입니다.
VirtualBox와의 차이는 다음과 같습니다.
limactl start
. 명령을 두드리기만 하면 됩니다그냥 Lima를 쓰지 그랬어요.
Lima에는 contained가 포함되어 있습니다.
지정
lima nerdctl compose -f docker-compose.yml up
을 통해 리마의contaainerd에서 컨테이너를 가동하고 지금까지docker-compose.yml
를 사용할 수 있다.다만, 리마를 직접 사용할 수 없다는 이유에서다.
nerdctl compose
가 전부 실현된 것은 아니다docker-compose
의 명령Docker on Lima?
이러한 문제를 해결하기 위해 Lima에서 Docker Engine을 시작하고 UNIX 필드 플러그를 통해 Docker에 직접 접근하는 방법을 사용했습니다.
사전 준비
MacOS에 대한 최대 파일 설명자 증가
macOS와 Lima는 현재 버전에서 SSHOFS를 통해 파일을 공유합니다.
이러한 관계로 인해 Docker 내의 파일 작업이든 MacOS 측의 파일 접근이든 모두 실행되기 때문에 파일 설명자의 상한선에 걸리기 쉽다(macOS 기본 상한선은 256).
유효성을 검사할 때 Docker 컨테이너에 sprite 이미지를 생성하는 동안 오류가 발생했습니다
Operation not permitted : open
.이 잘못된 내용 때문에 맥OS 측의 파일 설명자 상한선에 걸렸을 줄은 몰랐습니다. 원인의 특정에 상당히 고생이 많았는데...
macOS 파일 설명자 상한선을 높이는 방법은 다음과 같습니다.
<?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
.다음 로그가 표시되면 성공합니다.
? 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
주의점
/var/run/docker.sock
파일을 덮어씁니다.이 경우 기호 링크를 다시 만듭니다.장래에9p 및 삼바의 전환 계획가 있을 수 있기 때문에 대응할 수 있다면 개선될 수 있을 것이다.
M1Mac에서 MySQL이 작동하지 않는 것 같지만 이번 구성 때문이 아니라 M1Mac의 문제(인터넷상에서 MariDB를 이용해 회피하는 것 같다).
Reference
이 문제에 관하여(Docker on Lima로 기기 잠금 해제Desktop for Mac), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/matsukaz/articles/31bc31ff1c54b4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)