目标:MacOSM1/M2下安装和启动Lima,构建和Win一致的内核环境,为后面使用Docker做准备
0.碎碎念
为什么会有这一篇文章呢,是因为本人十分好奇MacOS,然后上了一个终极大当(不是),在某一个夜晚,冲动的夜晚,剁手买了M2的Mac。
然后自然是到了喜闻乐见的安装环境。先是使用了Mac下面的Docker Desktop,通过DockerFile+DockerCpmpose安装Oracle19C的时候反复出现了错误,经过多次排查安装方式是绝对没有问题的,在阿里云Centos8和腾讯云Ubuntu22.04分别安装成功!!!安装成功的那一瞬间我的内心是崩溃的,一度产生卖掉Mac的冲动,本着既然已经买了就算要卖,也要把这个问题解决的信念,反复搜索,偶然在GitHub的一些Issues让我看到了一个回答,M1/M2芯片目前是无法通过Docker安装Oracle的。
这是一个M1/M2永远都不可能安装成功的错误(目前)!!!原因是因为Oracle19C运行需要使用到系统的底层内核AMD4才可以,然而苹果下的Docker任何版本都是ARM64,这就导致目前Oracle根本没有办法在Mac M2/M1芯片上正常运行。
后面经历了将近一周的排坑我使用了Github上的一个项目Lima(此处)和Colima(此处),感谢Lima!!不然我的Mac就要转手卖掉了(Mac是非常好的学习机!!强制学习)。
1.Lima
1.安装Lima
# 通过MacOS终端安装Lima
brew install lima
2.创建Lima实例
通过docker_lima.yaml文件,创建一个Docker模板的实例
limactl start --name=default /usr/local/share/lima/examples/docker_lima.yaml
docker_lima.yaml文件文件值得注意的地方
# 挂载设置
mounts:
- location: "~" # 挂载目录,这是挂载整个Users目录
writable: true # 是否能在Lima容器里编辑文件
docker_lima.yaml文件
# Example to use Docker instead of containerd & nerdctl
# $ limactl start ./docker.yaml
# $ limactl shell docker docker run -it -v $HOME:$HOME --rm alpine
# To run `docker` on the host (assumes docker-cli is installed):
# $ export DOCKER_HOST=$(limactl list docker --format 'unix://{{.Dir}}/sock/docker.sock')
# $ docker ...
# This example requires Lima v0.8.0 or later
images:
# Try to use release-yyyyMMdd image if available. Note that release-yyyyMMdd will be removed after several months.
- location: "https://cloud-images.ubuntu.com/releases/22.04/release-20230210/ubuntu-22.04-server-cloudimg-amd64.img"
arch: "x86_64"
digest: "sha256:4401cf7e994842f11398a54d0159b689b2fcace166be6147013f128ddb15875e"
- location: "https://cloud-images.ubuntu.com/releases/22.04/release-20230210/ubuntu-22.04-server-cloudimg-arm64.img"
arch: "aarch64"
digest: "sha256:d044311b6e2d838f1175a67a5f7fa6bc0936f8001180df539025ec6587c33d28"
# Fallback to the latest release image.
# Hint: run `limactl prune` to invalidate the cache
- location: "https://cloud-images.ubuntu.com/releases/22.04/release/ubuntu-22.04-server-cloudimg-amd64.img"
arch: "x86_64"
- location: "https://cloud-images.ubuntu.com/releases/22.04/release/ubuntu-22.04-server-cloudimg-arm64.img"
arch: "aarch64"
arch: "x86_64"
mounts:
- location: "~"
writable: true
# 9p:
# # 对于可写的共享目录, cache 推荐类型为 mmap, 不写好像默认 fscache
# cache: "mmap"
# containerd is managed by Docker, not by Lima, so the values are set to false here.
containerd:
system: false
user: false
provision:
- mode: system
# This script defines the host.docker.internal hostname when hostResolver is disabled.
# It is also needed for lima 0.8.2 and earlier, which does not support hostResolver.hosts.
# Names defined in /etc/hosts inside the VM are not resolved inside containers when
# using the hostResolver; use hostResolver.hosts instead (requires lima 0.8.3 or later).
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
- 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
hostResolver:
# hostResolver.hosts requires lima 0.8.3 or later. Names defined here will also
# resolve inside containers, and not just inside the VM itself.
hosts:
host.docker.internal: host.lima.internal
portForwards:
- guestSocket: "/run/user/{{.UID}}/docker.sock"
hostSocket: "{{.Dir}}/sock/docker.sock"
message: |
To run `docker` on the host (assumes docker-cli is installed), run the following commands:
------
docker context create lima-{{.Name}} --docker "host=unix://{{.Dir}}/sock/docker.sock"
docker context use lima-{{.Name}}
docker run hello-world
------
3.使用Lima
输入lima即可启动default容器,启动后的容器,启动后的容器和正常的Debian没有区别
lima
4.当lima下面的docker想使用科学上网
注意:MacOS Socks需要开启局域网模式。
# 查看宿主机IP地址
ipconfig getifaddr en0
# Docker容器内设置socks
export http_proxy="http://192.168.50.75:7890"
export https_proxy="http://192.168.50.75:7890"
export all_proxy="socks5://192.168.50.75:7890"
# 还原socks
unset http_proxy
unset https_proxy
unset all_proxy
Comments NOTHING