Или свяжитесь через Linkedin, если это конфиденциально: https://www.linkedin.com/in/sickcodes.
Или через https://sick.codes/contact/
Этот проект поддерживается Sick.Codes. (Твиттер)
Дополнительные кредиты можно найти здесь: https://github.com/sickcodes/Docker-OSX/blob/master/CREDITS.md.
Кроме того, полный список всех участников можно найти здесь: https://github.com/sickcodes/Docker-OSX/graphs/contributors.
Большое спасибо @kholia за поддержку основного проекта, на основе которого построена Docker-OSX: OSX-KVM.
Также особая благодарность @thenickdude, который поддерживает ценный форк KVM-OpenCore, начатый @Leoyzen!
Особая благодарность команде OpenCore по адресу: https://github.com/acidanthera/OpenCorePkg. Их хорошо поддерживаемый загрузчик обеспечивает большую часть великолепной функциональности, которая нравится пользователям Docker-OSX :)
Если вам нравится этот проект, рассмотрите возможность внести свой вклад здесь или выше!
Видеоурок по настройке также доступен здесь: https://www.youtube.com/watch?v=wLezYl77Ll8.
Пользователи Windows: нажмите здесь, чтобы просмотреть примечания ниже!
Впервые здесь? попробуйте первоначальную настройку, в противном случае попробуйте воспользоваться приведенными ниже инструкциями, чтобы использовать Catalina или Big Sur.
Названия релизов и их версия:
docker run -it
--device /dev/kvm
-p 50922:10022
-v /tmp/.X11-unix:/tmp/.X11-unix
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-e SHORTNAME=catalina
sickcodes/docker-osx:latest
# docker build -t docker-osx .
docker run -it
--device /dev/kvm
-p 50922:10022
-v /tmp/.X11-unix:/tmp/.X11-unix
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-e SHORTNAME=big-sur
sickcodes/docker-osx:latest
# docker build -t docker-osx .
docker run -it
--device /dev/kvm
-p 50922:10022
-v /tmp/.X11-unix:/tmp/.X11-unix
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-e GENERATE_UNIQUE=true
-e MASTER_PLIST_URL= ' https://raw.githubusercontent.com/sickcodes/osx-serial-generator/master/config-custom.plist '
-e SHORTNAME=monterey
sickcodes/docker-osx:latest
# docker build -t docker-osx .
docker run -it
--device /dev/kvm
-p 50922:10022
-v /tmp/.X11-unix:/tmp/.X11-unix
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-e GENERATE_UNIQUE=true
-e MASTER_PLIST_URL= ' https://raw.githubusercontent.com/sickcodes/osx-serial-generator/master/config-custom.plist '
-e SHORTNAME=ventura
sickcodes/docker-osx:latest
# docker build -t docker-osx .
docker run -it
--device /dev/kvm
-p 50922:10022
-v /tmp/.X11-unix:/tmp/.X11-unix
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-e GENERATE_UNIQUE=true
-e CPU= ' Haswell-noTSX '
-e CPUID_FLAGS= ' kvm=on,vendor=GenuineIntel,+invtsc,vmware-cpuid-freq=on '
-e MASTER_PLIST_URL= ' https://raw.githubusercontent.com/sickcodes/osx-serial-generator/master/config-custom-sonoma.plist '
-e SHORTNAME=sonoma
sickcodes/docker-osx:latest
# docker build -t docker-osx .
# 40GB disk space required: 20GB original image 20GB your container.
docker pull sickcodes/docker-osx:auto
# boot directly into a real OS X shell with a visual display [NOT HEADLESS]
docker run -it
--device /dev/kvm
-p 50922:10022
-v /tmp/.X11-unix:/tmp/.X11-unix
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-e GENERATE_UNIQUE=true
sickcodes/docker-osx:auto
# username is user
# password is alpine
docker run -it
--device /dev/kvm
-p 50922:10022
-v /tmp/.X11-unix:/tmp/.X11-unix
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-e SHORTNAME=high-sierra
sickcodes/docker-osx:latest
# docker build -t docker-osx .
docker run -it
--device /dev/kvm
-p 50922:10022
-v /tmp/.X11-unix:/tmp/.X11-unix
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-e SHORTNAME=mojave
sickcodes/docker-osx:latest
# docker build -t docker-osx .
Это особенно хороший способ загрузки контейнера, если CDN Docker (или ваше соединение) работает медленно.
wget https://images2.sick.codes/mac_hdd_ng_auto.img
docker run -it
--device /dev/kvm
-p 50922:10022
-v " ${PWD} /mac_hdd_ng_auto.img:/image "
-v /tmp/.X11-unix:/tmp/.X11-unix
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-e GENERATE_UNIQUE=true
-e MASTER_PLIST_URL=https://raw.githubusercontent.com/sickcodes/Docker-OSX/master/custom/config-nopicker-custom.plist
-e SHORTNAME=catalina
sickcodes/docker-osx:naked
Сначала включите SSH при совместном использовании сети внутри гостя. Измените -e "USERNAME=user"
и -e "PASSWORD=password"
на свои учетные данные. Контейнер добавит себя в ~/.ssh/authorized_keys
Поскольку вы не видите экран, используйте PLIST с nopicker, например:
# Catalina
# wget https://images2.sick.codes/mac_hdd_ng_auto.img
# Monterey
wget https://images.sick.codes/mac_hdd_ng_auto_monterey.img
docker run -it
--device /dev/kvm
-p 50922:10022
-v " ${PWD} /mac_hdd_ng_auto_monterey.img:/image "
-v /tmp/.X11-unix:/tmp/.X11-unix
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-e " USERNAME=user "
-e " PASSWORD=alpine "
-e GENERATE_UNIQUE=true
-e MASTER_PLIST_URL=https://raw.githubusercontent.com/sickcodes/Docker-OSX/master/custom/config-nopicker-custom.plist
-e SHORTNAME=monterey
sickcodes/docker-osx:naked-auto
Самый простой и безопасный способ — sshfs
# on Linux/Windows
mkdir ~ /mnt/osx
sshfs user@localhost:/ -p 50922 ~ /mnt/osx
# wait a few seconds, and ~/mnt/osx will have full rootfs mounted over ssh, and in userspace
# automated: sshpass -p <password> sshfs user@localhost:/ -p 50922 ~/mnt/osx
Если у вас ноутбук, см. следующий раздел usbfluxd.
Если у вас настольный ПК, вы можете воспользоваться инструкциями @Silfalion: https://github.com/Silfalion/Iphone_docker_osx_passthrough.
Видеоруководство по настройке usbfluxd также доступно здесь: https://www.youtube.com/watch?v=kTk5fGjK_PM.
Этот метод РАБОТАЕТ на ноутбуке, ПК, на чем угодно!
Спасибо @nikias за usbfluxd через https://github.com/corellium!
Это делается внутри Linux.
Откройте 3 терминала в Linux
Подключение вашего устройства через USB в Linux позволяет вам открыть usbmuxd
через порт 5000
, используя https://github.com/corellium/usbfluxd, для другой системы в той же сети.
Убедитесь, что usbmuxd
, socat
и usbfluxd
установлены.
sudo pacman -S libusbmuxd usbmuxd avahi socat
Доступно в AUR: https://aur.archlinux.org/packages/usbfluxd/.
yay usbfluxd
Подключите свой iPhone или iPad.
Терминал 1
sudo systemctl start usbmuxd
sudo avahi-daemon
Терминал 2:
# on host
sudo systemctl restart usbmuxd
sudo socat tcp-listen:5000,fork unix-connect:/var/run/usbmuxd
Терминал 3:
sudo usbfluxd -f -n
Это делается внутри macOS.
Установите доморощенный.
172.17.0.1
обычно является IP-адресом моста Docker, которым является ваш компьютер, но вы можете использовать любой IP из ip addr
...
Терминал macOS:
# on the guest
brew install make automake autoconf libtool pkg-config gcc libimobiledevice usbmuxd
git clone https://github.com/corellium/usbfluxd.git
cd usbfluxd
./autogen.sh
make
sudo make install
Примите соединение USB через TCP и отобразитесь как локальное:
(возможно, вам придется изменить 172.17.0.1
на IP-адрес хоста. например, проверьте ip addr
)
# on the guest
sudo launchctl start usbmuxd
export PATH=/usr/local/sbin: ${PATH}
sudo usbfluxd -f -r 172.17.0.1:5000
Закройте приложения, такие как Xcode, и откройте их снова, и ваше устройство должно появиться!
Если вам нужно снова запустить Linux, сотрите текущие usbfluxd, usbmuxd и socat:
sudo killall usbfluxd
sudo systemctl restart usbmuxd
sudo killall socat
ПОСМОТРЕТЬ команды в https://github.com/sickcodes/osx-optimizer!
Переместите /var/lib/docker, следуя приведенному ниже руководству.
Учебное пособие здесь: https://sick.codes/how-to-run-docker-from-block-storage/
Следуйте приведенному выше руководству только в том случае, если вас устраивает удаление всех текущих изображений/слоев Docker.
Безопасный режим: временно отключите Docker, чтобы можно было временно переместить папку Docker.
killall dockerd
systemctl disable --now docker
systemctl disable --now docker.socket
systemctl stop docker
systemctl stop docker.socket
Теперь, когда демон Docker отключен, переместите куда-нибудь /var/lib/docker.
Затем символически свяжите где-нибудь /var/lib/docker:
mv /var/lib/docker /run/media/user/some_drive/docker
ln -s /run/media/user/some_drive/docker /var/lib/docker
# now check if /var/lib/docker is working still
ls /var/lib/docker
Если вы видите папки, значит, все сработало. Вы можете перезапустить Docker или просто перезагрузиться, если хотите быть уверенным.
14.11.2021 — Добавлена Высокая Сьерра, Мохаве
Выберите один из них при создании , не имеющий значения при использовании docker pull:
--build-arg SHORTNAME=high-sierra
--build-arg SHORTNAME=mojave
--build-arg SHORTNAME=catalina
--build-arg SHORTNAME=big-sur
--build-arg SHORTNAME=monterey
--build-arg SHORTNAME=ventura
--build-arg SHORTNAME=sonoma
В настоящее время существует несколько изображений, каждое из которых имеет разные варианты использования (поясняется ниже):
Высокая Сьерра:
Мохаве:
Каталина:
Биг-Сур:
Монтерей создай свой собственный образ:
Вентура создай свой собственный образ:
Сонома создай свой собственный образ:
Готовая система Catalina от Sick.Codes: имя пользователя: user
, пароль: alpine
Обнаженная: настройка «принеси свое изображение» (сначала используйте любое из вышеперечисленных):
Голый автоматический режим: то же, что и выше, но с -e USERNAME
и -e PASSWORD
и -e OSX_COMMANDS="put your commands here"
localhost:50922
)localhost:8888
), если используется версия ./vncdocker commit
:auto
(половина для базового образа, половина для образа среды выполненияОбразы, созданные на основе содержимого этого репозитория, также для удобства доступны в Docker Hub : https://hub.docker.com/r/sickcodes/docker-osx.
Полный список доступных образов Docker и их назначение можно найти в Инструкции.
Docker-OSX поддерживает Kubernetes.
Диаграмму и документацию Kubernetes Helm можно найти в каталоге helm.
Спасибо cephasara за этот важный вклад.
Не стесняйтесь открыть проблему, если у вас возникнут незначительные проблемы с запуском Docker-OSX или возникнут какие-либо вопросы.
Однако прежде чем открыть проблему, проверьте закрытые проблемы и подтвердите, что вы используете последнюю версию этого репозитория — возможно, ваши проблемы уже решены! Вы также можете увидеть свой ответ в разделе вопросов и ответов ниже.
Следуйте @sickcodes!
Для более сложных задач мы предлагаем следующие услуги поддержки:
Если вам интересно, свяжитесь с @sickcodes в Твиттере или нажмите здесь.
Docker-OSX распространяется под лицензией GPL v3+. Вклад приветствуется и очень ценится. Фактически вам разрешено использовать Docker-OSX в качестве инструмента для создания проприетарного программного обеспечения.
Если вы серьезно относитесь к безопасности Apple и, возможно, находите шестизначные вознаграждения за ошибки в рамках программы Apple Bug Bounty, то вы попали по адресу! Дополнительные примечания: законны ли Hackintosh, OSX-KVM или Docker-OSX?
Названия продуктов, логотипы, бренды и другие товарные знаки, упомянутые в рамках данного проекта, являются собственностью соответствующих владельцев товарных знаков. Эти владельцы торговых марок никоим образом не связаны с нашим хранилищем. Они никоим образом не спонсируют и не поддерживают этот проект.
Доступно несколько различных образов Docker-OSX, подходящих для разных целей.
sickcodes/docker-osx:latest
— я просто хочу попробовать.sickcodes/docker-osx:latest
— я хочу использовать Docker-OSX для разработки/защиты приложений в Xcode (войдите в Xcode, Transporter)sickcodes/docker-osx:naked
— я хочу использовать Docker-OSX для целей, связанных с CI/CD (войдите в Xcode, Transporter) Создайте свой личный имидж, используя :latest
или big-sur
. Затем вытащите изображение из изображения. После этого вы сможете дублировать это изображение и импортировать его в контейнер :naked
, чтобы неоднократно возвращать контейнер в предыдущее состояние.
sickcodes/docker-osx:auto
— меня интересует только использование командной строки (полезно для компиляции программного обеспечения или безголового использования Homebrew).
sickcodes/docker-osx:naked
— мне нужен iMessage/iCloud для исследования безопасности.
sickcodes/docker-osx:big-sur
— я хочу запустить Big Sur.
sickcodes/docker-osx:monterey
— я хочу запустить Монтерей.
sickcodes/docker-osx:ventura
— я хочу запустить Ventura.
sickcodes/docker-osx:sonoma
— я хочу запустить Sonoma.
sickcodes/docker-osx:high-sierra
— я хочу запустить High Sierra.
sickcodes/docker-osx:mojave
— я хочу запустить Mojave.
Прежде чем делать что-либо еще, вам необходимо включить аппаратную виртуализацию в BIOS. Как именно это будет зависеть от вашей конкретной машины (и BIOS), но это должно быть просто.
Затем вам понадобится QEMU и некоторые другие зависимости от вашего хоста:
# ARCH
sudo pacman -S qemu libvirt dnsmasq virt-manager bridge-utils flex bison iptables-nft edk2-ovmf
# UBUNTU DEBIAN
sudo apt install qemu qemu-kvm libvirt-clients libvirt-daemon-system bridge-utils virt-manager libguestfs-tools
# CENTOS RHEL FEDORA
sudo yum install libvirt qemu-kvm
Затем включите libvirt и загрузите модуль ядра KVM:
sudo systemctl enable --now libvirtd
sudo systemctl enable --now virtlogd
echo 1 | sudo tee /sys/module/kvm/parameters/ignore_msrs
sudo modprobe kvm
Запуск Docker-OSX в Windows возможен с использованием WSL2 (Windows 11 + подсистема Windows для Linux).
У вас должна быть установлена Windows 11 сборки 22000+ (21H2 или выше).
Сначала установите WSL на свой компьютер, выполнив эту команду в PowerShell администратора. Для получения дополнительной информации посмотрите здесь.
Это установит Ubuntu по умолчанию.
wsl --install
Вы можете убедиться, что WSL2 включен, используя wsl -l -v
в PowerShell. Чтобы просмотреть другие доступные дистрибутивы, используйте wsl -l -o
.
Если вы ранее установили WSL1, обновите WSL 2. Проверьте эту ссылку, чтобы обновить WSL1 до WSL2.
После установки WSL перейдите в C:/Users/<Your_Name>/.wslconfig
и добавьте в конец nestedVirtualization=true
(если файл не существует, создайте его). Для получения дополнительной информации о файле .wslconfig
перейдите по этой ссылке. Убедитесь, что вы выбрали «Показать скрытые файлы» и «Показать расширения файлов» в параметрах проводника. Результат должен быть таким:
[wsl2]
nestedVirtualization=true
Зайдите в свой дистрибутив WSL (запустите wsl
в powershell) и проверьте, включен ли KVM, с помощью команды kvm-ok
. Вывод должен выглядеть так:
INFO: /dev/kvm exists
KVM acceleration can be used
Используйте команду sudo apt -y install bridge-utils cpu-checker libvirt-clients libvirt-daemon qemu qemu-kvm
чтобы установить его, если это не так.
Теперь скачайте и установите Docker для Windows, если он еще не установлен.
После установки зайдите в Настройки и установите эти 2 флажка:
General -> "Use the WSL2 based engine";
Resources -> WSL Integration -> "Enable integration with my default WSL distro",
Убедитесь, что установлены x11-apps
. Используйте команду sudo apt install x11-apps -y
чтобы установить его, если это не так.
Наконец, есть 3 способа получить видеовыход:
Чтобы использовать встроенный сервер X-11 WSLg, измените эти две строки в команде запуска docker, чтобы указать Docker-OSX на WSLg.
-e "DISPLAY=${DISPLAY:-:0.0}"
-v /mnt/wslg/.X11-unix:/tmp/.X11-unix
Или попробуйте:
-e "DISPLAY=${DISPLAY:-:0}"
-v /mnt/wslg/.X11-unix:/tmp/.X11-unix
Информацию об Ubuntu 20.x для Windows см. в № 458.
Загрузите базовую систему macOS (нажмите Enter)
Нажмите Disk Utility
Сотрите САМЫЙ БОЛЬШОЙ диск (около 200 ГБ по умолчанию), НЕ ИЗМЕНЯЙТЕ МАЛЕНЬКИЕ ДИСКИ. -- если вы не можете нажать erase
, возможно, вам придется уменьшить размер диска на 1 КБ.
(необязательно) Создайте раздел, используя неиспользуемое пространство для размещения ОС и ваших файлов, если вы хотите ограничить емкость. (Для раздела Xcode 12 не менее 60 ГБ.)
Нажмите Reinstall macOS
Во время установки системе может потребоваться несколько перезагрузок.
Это отличное место для начала, если у вас возникли проблемы с началом работы, особенно если вы еще не очень знакомы с Docker.
Просто хотите быстро сделать контейнер? Ознакомьтесь с нашим разделом примеров создания контейнеров.
Более конкретные/расширенные вопросы и ответы по устранению неполадок можно найти в разделе Дополнительные вопросы и ответы. Также следует просмотреть закрытые выпуски. Возможно, кто-то другой уже получил ответ на вопрос, подобный вашему, даже если вы не можете найти его в этом документе!
См. первоначальную настройку.
docker: unknown server OS: .
See 'docker run --help'.
Это означает, что ваш демон докера не запущен.
pgrep dockerd
не должен ничего возвращать
Поэтому у вас есть несколько вариантов.
sudo dockerd
для использования Docker на переднем плане. Я использую это.
Или
sudo systemctl --start dockerd
чтобы запустить dockerd сейчас.
Или
sudo systemctl --enable --now dockerd
для запуска dockerd при каждой перезагрузке и сейчас.
Примеры:
-e EXTRA='-smp 6,sockets=3,cores=2'
-e EXTRA='-smp 8,sockets=4,cores=2'
-e EXTRA='-smp 16,sockets=8,cores=2'
Обратите внимание: в отличие от памяти, использование ЦП является общим. поэтому вы можете выделить все свои процессоры в контейнер.
Если вы используете sudo dockerd
или dockerd контролируется systemd/systemctl, вы должны находиться в группе Docker. Если вы не в группе Docker:
sudo usermod -aG docker " ${USER} "
а также при необходимости добавьте себя в группы kvm и libvirt:
sudo usermod -aG libvirt " ${USER} "
sudo usermod -aG kvm " ${USER} "
См. также: первоначальная настройка.
# run ad hoc
sudo dockerd
# or daemonize it
sudo nohup dockerd &
# enable it in systemd (it will persist across reboots this way)
sudo systemctl enable --now docker
# or just start it as your user with systemd instead of enabling it
systemctl start docker
Большое спасибо нашим участникам, которые на данный момент решили почти все мыслимые проблемы!
https://github.com/sickcodes/Docker-OSX/blob/master/CREDITS.md
Создали контейнер с docker run
и хотите позже повторно использовать базовый образ?
Примечание: сначала посмотрите примеры создания контейнеров, чтобы узнать, как добраться до точки, где это применимо.
Это на случай, если вы захотите снова запустить тот же контейнер позже. Возможно, вам придется использовать docker commit
, чтобы сохранить контейнер, прежде чем вы сможете его повторно использовать. Проверьте, сохраняется ли ваш контейнер с помощью docker ps --all
.
Если вы не запустите это, у вас каждый раз будет новое изображение.
# look at your recent containers and copy the CONTAINER ID
docker ps --all
# docker start the container ID
docker start -ai abc123xyz567
# if you have many containers, you can try automate it with filters like this
# docker ps --all --filter "ancestor=sickcodes/docker-osx"
# for locally tagged/built containers
# docker ps --all --filter "ancestor=docker-osx"
Вы также можете извлечь файл .img
из контейнера, который хранится в /var/lib/docker
, и передать его в качестве аргумента времени выполнения для образа :naked
Docker.
См. также: здесь.
Контейнеры, использующиеsickcodes sickcodes/docker-osx:auto
можно остановить во время запуска.
# find last container
docker ps -a
# docker start old container with -i for interactive, -a for attach STDIN/STDOUT
docker start -ai -i < Replace this with your ID >
Вы можете увидеть одну или несколько ошибок, связанных с libgtk, если у вас еще не все настроено для аппаратной виртуализации. Если вы еще этого не сделали, ознакомьтесь с разделом начальной настройки и разделом регулярных проверок, так как вы, возможно, пропустили какой-либо этап установки или не имеете всех необходимых зависимостей Docker, готовых к работе.
См. также: здесь.
Если вы еще не настроили xhost, попробуйте следующее:
echo $DISPLAY
# ARCH
sudo pacman -S xorg-xhost
# UBUNTU DEBIAN
sudo apt install x11-xserver-utils
# CENTOS RHEL FEDORA
sudo yum install xorg-x11-server-utils
# then run
xhost +
Вы не можете выделить больше оперативной памяти, чем имеет ваша машина. По умолчанию — 3 гигабайта: -e RAM=3
.
Если вы пытаетесь выделить контейнеру больше оперативной памяти, чем доступно на данный момент, вы можете увидеть следующую ошибку: cannot set up guest memory 'pc.ram': Cannot allocate memory
. См. также: здесь, здесь.
Например (ниже) buff/cache
уже содержит 20 гигабайт выделенной оперативной памяти:
[user@hostname ~] $ free -mh
total used free shared buff/cache available
Mem: 30Gi 3.5Gi 7.0Gi 728Mi 20Gi 26Gi
Swap: 11Gi 0B 11Gi
Очистите буфер и кеш:
sudo tee /proc/sys/vm/drop_caches <<< 3
Теперь проверьте ОЗУ еще раз:
[user@hostname ~] $ free -mh
total used free shared buff/cache available
Mem: 30Gi 3.3Gi 26Gi 697Mi 1.5Gi 26Gi
Swap: 11Gi 0B 11Gi
Примечание. AppleALC, alcid
и VoodooHDA-OC не поддерживают кодеки. Однако IORegistryExplorer показывает, что компонент контроллера работает.
docker run
--device /dev/kvm
-e AUDIO_DRIVER=pa,server=unix:/tmp/pulseaudio.socket
-v " /run/user/ $( id -u ) /pulse/native:/tmp/pulseaudio.socket "
-v /tmp/.X11-unix:/tmp/.X11-unix
sickcodes/docker-osx
docker run
--device /dev/kvm
-e AUDIO_DRIVER=pa,server=unix:/tmp/pulseaudio.socket
-v " /run/user/ $( id -u ) /pulse/native:/tmp/pulseaudio.socket "
-v /tmp/.X11-unix:/tmp/.X11-unix
-e PULSE_SERVER=unix:/tmp/pulseaudio.socket
sickcodes/docker-osx pactl list
docker run
--device /dev/kvm
-e AUDIO_DRIVER=pa,server=unix:/tmp/pulseaudio.socket
-v /mnt/wslg/runtime-dir/pulse/native:/tmp/pulseaudio.socket
-v /mnt/wslg/.X11-unix:/tmp/.X11-unix
sickcodes/docker-osx
В зависимости от ваших потребностей можно перенаправить дополнительные порты. В этом примере мы будем использовать Mac OSX для размещения nginx:
host:10023 <-> 10023:container:10023 <-> 80:guest
На хост-машине запустите:
docker run -it
--device /dev/kvm
-p 50922:10022
-e ADDITIONAL_PORTS= ' hostfwd=tcp::10023-:80, '
-p 10023:10023
sickcodes/docker-osx:auto
В сеансе терминала, где запущен контейнер, запустите:
/bin/bash -c " $( curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh ) "
brew install nginx
sudo sed -i -e ' s/8080/80/ ' /usr/local/etc/nginx/nginx.confcd
# sudo nginx -s stop
sudo nginx
Теперь nginx должен быть доступен через порт 10023.
Кроме того, вы можете объединить несколько операторов, например:
-e ADDITIONAL_PORTS= ' hostfwd=tcp::10023-:80,hostfwd=tcp::10043-:443, '
-p 10023:10023
-p 10043:10043
Возможно, вам не потребуется ничего делать с настройкой по умолчанию, чтобы включить подключение к Интернету изнутри контейнера. Кроме того, curl
может работать, даже если ping
не работает.
Смотрите обсуждение здесь и здесь и здесь.
Это не требуется для ЛОКАЛЬНОЙ установки.
Также обратите внимание, что это может привести к утечке вашего IP-адреса со стороны хоста, даже если вы используете VPN в контейнере.
Однако если вы пытаетесь удаленно подключиться к экземпляру Docker-OSX (например, к экземпляру Docker-OSX, размещенному в центре обработки данных), это может улучшить вашу производительность:
# enable for current session
sudo sysctl -w net.ipv4.ip_forward=1
# OR
# sudo tee /proc/sys/net/ipv4/ip_forward <<< 1
# enable permanently
sudo touch /etc/sysctl.conf
sudo tee -a /etc/sysctl.conf << EOF
net.ipv4.ip_forward = 1
EOF
# or edit manually with the editor of your choice
nano /etc/sysctl.conf || vi /etc/sysctl.conf || vim /etc/sysctl.conf
# now reboot
Поделиться папкой с гостем довольно просто.
Ваша папка будет находиться в /mnt/hostshare внутри контейнера Arch, который затем будет передан через QEMU.
Затем смонтируйте с помощью sudo -S mount_9p hostshare
изнутри Mac.
Например,
FOLDER= ~ /somefolder
-v " ${FOLDER} :/mnt/hostshare "
-e EXTRA= " -virtfs local,path=/mnt/hostshare,mount_tag=hostshare,security_model=passthrough,id=hostshare "
Полный пример:
# stat mac_hdd_ng.img
SHARE= ~ /somefolder
docker run -it
--device /dev/kvm
-p 50922:10022
-v /tmp/.X11-unix:/tmp/.X11-unix
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-v " ${PWD} /mac_hdd_ng.img:/home/arch/OSX-KVM/mac_hdd_ng.img "
-v " ${SHARE} :/mnt/hostshare "
-e EXTRA= " -virtfs local,path=/mnt/hostshare,mount_tag=hostshare,security_model=passthrough,id=hostshare "
sickcodes/docker-osx:latest
# !!! Open Terminal inside macOS and run the following command to mount the virtual file system
# sudo -S mount_9p hostshare
Чтобы открыть общий доступ к папке с помощью NFS, настройте папку на хост-компьютере, например, /srv/nfs/share
, а затем добавьте в /etc/exports
:
/srv/nfs/share 127.0.0.1/0(insecure,rw,all_squash,anonuid=1000,anongid=985,no_subtree_check)
Возможно, вам придется перезагрузить экспорт сейчас, после чего этот каталог начнет использоваться совместно.
# reload shared folders
sudo exportfs -arv
Источник и объяснение
Предоставьте разрешения на общую папку для anonuid
и anongid
, где anonuid
и anongid
соответствуют разрешениям вашего пользователя Linux; id -u
id -u ; id -g
напечатает userid:groupid
chown 1000:985 /srv/nfs/share
chmod u+rwx /srv/nfs/share
Запустите контейнер Docker-OSX с дополнительным флагом --network host
Создайте и смонтируйте папку nfs из терминала Mac:
mkdir -p ~/mnt
sudo mount_nfs -o locallocks 10.0.2.2:/srv/nfs/share ~/mnt
Запустите свой контейнер.
Выберите порт, например, 7700
.
lsusb
для получения vid:pid
В Linux: sudo usbredirserver -p 7700 1e3d:2096
Теперь в окне Docker нажмите Enter, чтобы увидеть консоль (qemu)
.
Вы можете добавить/удалить диск с помощью таких команд, даже после запуска компьютера:
chardev-add socket,id=usbredirchardev1,port=7700,host=172.17.0.1
device_add usb-redir,chardev=usbredirchardev1,id=usbredirdev1,debug=4
PORT=7700
IP_ADDRESS=172.17.0.1
-e EXTRA= " -chardev socket,id=usbredirchardev1,port= ${PORT} ,host= ${IP_ADDRESS} -device usb-redir,chardev=usbredirchardev1,id=usbredirdev1,debug=4 " `
Настройки брандмауэра Fedora по умолчанию могут препятствовать доступу сетевого интерфейса Docker к Интернету. Чтобы решить эту проблему, вам необходимо внести интерфейс в белый список в брандмауэре:
# Set the docker0 bridge to the trusted zone
sudo firewall-cmd --permanent --zone=trusted --add-interface=docker0
sudo firewall-cmd --reload
Проверьте, включена ли на вашем компьютере аппаратная виртуализация:
sudo tee /sys/module/kvm/parameters/ignore_msrs <<< 1
egrep -c ' (svm|vmx) ' /proc/cpuinfo
-e NETWORKING=vmxnet3
-e NETWORKING=e1000-82545em
du -sh *
, начиная с каталога /
, и найти большие каталоги, из которых можно удалить файлы. Например, ненужные кэшированные файлы, платформы Xcode и т. д.sudo trimforce enable
и перезагрузитесь.dd if=/dev/zero of=./empty && rm -f empty
docker cp stoppedcontainer:/home/arch/OSX-KVM/mac_hdd_ng.img .
qemu-img check -r all mac_hdd_ng.img
чтобы исправить ошибки.qemu-img convert -O qcow2 mac_hdd_ng.img deduped.img
и еще раз проверьте наличие ошибок.qemu-img convert -c -O qcow2 deduped.img compressed.img
для дальнейшего сжатия образа. Хотя это может снизить скорость выполнения, но должно уменьшить размер примерно на 25%. FROM sickcodes/docker-osx
USER arch
COPY --chown=arch ./deduped.img /home/arch/OSX-KVM/mac_hdd_ng.img
Сначала убедитесь, что автозагрузка включена
Далее вам нужно настроить автоматический запуск SSH.
sudo systemsetup -setremotelogin on
Обязательно зафиксируйте новый образ Docker и сохраните его или перестройте, как описано в разделе об уменьшении дискового пространства.
Затем запустите его с этими аргументами.
# Run with the -nographic flag, and enable a telnet interface
docker run
--device /dev/kvm
-p 50922:10022
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-e EXTRA= " -monitor telnet::45454,server,nowait -nographic -serial null "
mycustomimage
Если вы собираете Docker-OSX локально, вам, вероятно, захочется использовать зеркала Arch Linux.
Расположение зеркал можно найти здесь (используются двухбуквенные коды стран): https://archlinux.org/mirrorlist/all/.
docker build -t docker-osx:latest
--build-arg RANKMIRRORS=true
--build-arg MIRROR_COUNTRY=US
--build-arg MIRROR_COUNT=10
--build-arg SHORTNAME=catalina
--build-arg SIZE=200G .
Передавайте любые устройства/каталоги в контейнер Docker и аргументы QEMU, используя удобную опцию поставщика аргументов времени выполнения -e EXTRA=
.
# example customizations
docker run
-e RAM=4
-e SMP=4
-e CORES=4
-e EXTRA= ' -usb -device usb-host,hostbus=1,hostaddr=8 '
-e INTERNAL_SSH_PORT=23
-e MAC_ADDRESS= " $( xxd -c1 -p -l 6 /dev/urandom | tr ' n ' ' : ' | cut -c1-17 ) "
-e AUDIO_DRIVER=alsa
-e IMAGE_PATH=/image
-e SCREEN_SHARE_PORT=5900
-e DISPLAY=:0
-e NETWORKING=vmxnet3
--device /dev/kvm
--device /dev/snd
-v /tmp/.X11-unix:/tmp/.X11-unix
docker-osx:latest
Сгенерируйте серийные номера в ./custom
ИЛИ заставьте docker генерировать их во время выполнения (см. ниже).
В любой момент проверьте свой серийный номер перед входом в iCloud и т. д.
# this is a quick way to check your serial number via cli inside OSX
ioreg -l | grep IOPlatformSerialNumber
# test some commands
sshpass -p ' alpine ' ssh user@localhost -p 50922 ' ping google.com '
# check your serial number
sshpass -p ' alpine ' ssh user@localhost -p 50922 ' ioreg -l | grep IOPlatformSerialNumber '
# ARCH
pacman -S libguestfs
# UBUNTU DEBIAN
apt install libguestfs -y
# RHEL FEDORA CENTOS
yum install libguestfs -y
Внутри папки ./custom
вы найдете 4
скрипта.
config-nopicker-custom.plist
opencore-image-ng.sh
Эти два файла взяты из OSX-KVM.
Вам не нужно трогать эти два файла.
В config.plist 5 значений заменены заполнителями. Нажмите здесь, чтобы увидеть эти значения без причины.
generate-unique-machine-values.sh
Этот сценарий сгенерирует серийные номера с Mac-адресами, а также выведет их в CSV/TSV, а также создаст bootdisk image
. Вы можете создать сотни, ./custom/generate-unique-machine-values.sh --help
./custom/generate-unique-machine-values.sh
--count 1
--tsv ./serial.tsv
--bootdisks
--output-bootdisk OpenCore.qcow2
--output-env source.env.sh
Или если у вас есть какие-то конкретные серийные номера...
generate-specific-bootdisk.sh
generate-specific-bootdisk.sh
--model " ${DEVICE_MODEL} "
--serial " ${SERIAL} "
--board-serial " ${BOARD_SERIAL} "
--uuid " ${UUID} "
--mac-address " ${MAC_ADDRESS} "
--output-bootdisk OpenCore-nopicker.qcow2
# proof of concept only, generates random serial numbers, headlessly, and quits right after.
docker run --rm -it
--device /dev/kvm
-p 50922:10022
-e NOPICKER=true
-e GENERATE_UNIQUE=true
-e DEVICE_MODEL= " iMacPro1,1 "
sickcodes/docker-osx:auto
# -e OSX_COMMANDS='ioreg -l | grep IOPlatformSerialNumber'
# run the same as above 17gb auto image, with SSH, with nopicker, and save the bootdisk for later.
# you don't need to save the bootdisk IF you supply specific serial numbers!
docker run -it
--device /dev/kvm
-p 50922:10022
-e NOPICKER=true
-e GENERATE_SPECIFIC=true
-e DEVICE_MODEL= " iMacPro1,1 "
-e SERIAL= " C02TW0WAHX87 "
-e BOARD_SERIAL= " C027251024NJG36UE "
-e UUID= " 5CCB366D-9118-4C61-A00A-E5BAF3BED451 "
-e MAC_ADDRESS= " A8:5C:2C:9A:46:2F "
-e OSX_COMMANDS= ' ioreg -l | grep IOPlatformSerialNumber '
sickcodes/docker-osx:auto
# run an existing image in current directory, with a screen, with SSH, with nopicker.
stat mac_hdd_ng.img # make sure you have an image if you're using :naked
docker run -it
-v " ${PWD} /mac_hdd_ng.img:/image "
--device /dev/kvm
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-v /tmp/.X11-unix:/tmp/.X11-unix
-p 50922:10022
-e NOPICKER=true
-e GENERATE_SPECIFIC=true
-e DEVICE_MODEL= " iMacPro1,1 "
-e SERIAL= " C02TW0WAHX87 "
-e BOARD_SERIAL= " C027251024NJG36UE "
-e UUID= " 5CCB366D-9118-4C61-A00A-E5BAF3BED451 "
-e MAC_ADDRESS= " A8:5C:2C:9A:46:2F "
-e WIDTH=1000
-e HEIGHT=1000
sickcodes/docker-osx:naked
Если вы хотите генерировать серийные номера, создайте их во время выполнения, используя -e GENERATE_UNIQUE=true
Или вы можете создать их внутри папки ./custom
. И затем используйте:
-e GENERATE_SPECIFIC=true
-e SERIAL= " "
-e BOARD_SERIAL= " "
-e UUID= " "
-e MAC_ADDRESS= " "
stat mac_hdd_ng_testing.img
touch ./output.env
# generate fresh random serial numbers, with a screen, using your own image, and save env file with your new serial numbers for later.
docker run -it
--device /dev/kvm
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-v /tmp/.X11-unix:/tmp/.X11-unix
-p 50922:10022
-e NOPICKER=true
-e GENERATE_UNIQUE=true
-e GENERATE_SPECIFIC=true
-e DEVICE_MODEL= " iMacPro1,1 "
-v " ${PWD} /output.env:/env "
-v " ${PWD} /mac_hdd_ng_testing.img:/image "
sickcodes/docker-osx:naked
Чтобы использовать iMessage или iCloud, вам необходимо изменить 5
значений.
SERIAL
BOARD_SERIAL
UUID
MAC_ADDRESS
ROM
— это просто MAC-адрес в нижнем регистре, без :
между каждым словом.
Вы можете указать контейнеру сгенерировать их для вас, используя -e GENERATE_UNIQUE=true
Или сообщите контейнеру использовать определенные, используя -e GENERATE_SPECIFIC=true
-e GENERATE_SPECIFIC=true
-e DEVICE_MODEL= " iMacPro1,1 "
-e SERIAL= " C02TW0WAHX87 "
-e BOARD_SERIAL= " C027251024NJG36UE "
-e UUID= " 5CCB366D-9118-4C61-A00A-E5BAF3BED451 "
-e MAC_ADDRESS= " A8:5C:2C:9A:46:2F "
Разрешение дисплея контролируется этой строкой:
https://github.com/sickcodes/Docker-OSX/blob/master/custom/config-nopicker-custom.plist#L819
Вместо монтирования этого диска Docker-OSX сгенерирует новый OpenCore.qcow2
, используя этот крутой трюк:
-e GENERATE_UNIQUE=true
-e WIDTH=800
-e HEIGHT=600
Чтобы использовать WIDTH
/ HEIGHT
, вы должны использовать либо -e GENERATE_UNIQUE=true
, либо -e GENERATE_SPECIFIC=true
.
Загрузка займет примерно на 30 секунд больше, поскольку необходимо создать новый загрузочный раздел с помощью libguestfs
.
-e GENERATE_SPECIFIC=true
-e WIDTH=1920
-e HEIGHT=1080
-e SERIAL= " "
-e BOARD_SERIAL= " "
-e UUID= " "
-e MAC_ADDRESS= " "
# using an image in your current directory
stat mac_hdd_ng.img
docker run -it
--device /dev/kvm
-p 50922:10022
-v " ${PWD} /mac_hdd_ng.img:/image "
-v /tmp/.X11-unix:/tmp/.X11-unix
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-e GENERATE_SPECIFIC=true
-e DEVICE_MODEL= " iMacPro1,1 "
-e SERIAL= " C02TW0WAHX87 "
-e BOARD_SERIAL= " C027251024NJG36UE "
-e UUID= " 5CCB366D-9118-4C61-A00A-E5BAF3BED451 "
-e MAC_ADDRESS= " A8:5C:2C:9A:46:2F "
-e MASTER_PLIST_URL=https://raw.githubusercontent.com/sickcodes/Docker-OSX/master/custom/config-nopicker-custom.plist
-e WIDTH=1600
-e HEIGHT=900
sickcodes/docker-osx:naked
# generating random serial numbers, using the DIY installer, along with the screen resolution changes.
docker run -it
--device /dev/kvm
-p 50922:10022
-v /tmp/.X11-unix:/tmp/.X11-unix
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-e GENERATE_UNIQUE=true
-e WIDTH=800
-e HEIGHT=600
sickcodes/docker-osx:latest
Вот еще несколько резолюций! Если ваше разрешение недействительно, по умолчанию оно будет 800x600.
-e WIDTH=800
-e HEIGHT=600
-e WIDTH=1280
-e HEIGHT=768
-e WIDTH=1600
-e HEIGHT=900
-e WIDTH=1920
-e HEIGHT=1080
-e WIDTH=2560
-e HEIGHT=1600
Первый шаг — остановить демон докера.
sudo systemctl stop docker
Второй шаг — изменить конфигурацию контейнера в
/var/lib/docker/containers/[container-id]/config.v2.json
(Предположим, ваша исходная ШИРИНА — 1024, а ВЫСОТА — 768. Вы можете найти 1024 и заменить его новым значением. То же самое для 768.)
Последний шаг — перезапустить демон докера.
sudo systemctl restart docker
Передайте диск в контейнер как том, а затем снова передайте диск в дополнительные функции командной строки QEMU с помощью .
Используйте config-custom.plist
потому что вы, вероятно, хотите увидеть меню загрузки, в противном случае пропустите первую строку:
DISK_TWO= " ${PWD} /mount_me.img "
-e MASTER_PLIST_URL= 'https://raw.githubusercontent.com/sickcodes/osx-serial-generator/master/config-custom.plist'
-v "${DISK_TWO}:/disktwo"
-e EXTRA= '-device ide-hd,bus=sata.5,drive=DISK-TWO -drive id=DISK-TWO,if=none,file=/disktwo,format=qcow2'
OSX_IMAGE= " ${PWD} /mac_hdd_ng_xcode_bigsur.img "
DISK_TWO= " ${PWD} /mount_me.img "
docker run -it
--device /dev/kvm
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-v /tmp/.X11-unix:/tmp/.X11-unix
-e MASTER_PLIST_URL= ' https://raw.githubusercontent.com/sickcodes/osx-serial-generator/master/config-custom.plist '
-v " ${OSX_IMAGE} " :/image
-v " ${DISK_TWO} " :/disktwo
-e EXTRA= ' -device ide-hd,bus=sata.5,drive=DISK-TWO -drive id=DISK-TWO,if=none,file=/disktwo,format=qcow2 '
sickcodes/docker-osx:naked
См. также: здесь.
В Docker-OSX мы используем образы qcow2
.
Это означает, что образ увеличивается по мере его использования, но гостевая ОС считает, что у вас доступно 200 ГБ.
ТОЛЬКО ЧТЕНИЕ
# mount the qemu image like a real disk
sudo modprobe nbd max_part=8
sudo qemu-nbd --connect=/dev/nbd0 ./image.img
sudo fdisk /dev/nbd0 -l
mkdir -p ./mnt
sudo mount /dev/nbd0p1 ./mnt
# inspect partitions (2 partitions)
sudo fdisk /dev/nbd0 -l
# mount using apfs-linux-rw OR apfs-fuse
mkdir -p ./part
sudo mount /dev/nbd0p2 ./part
sudo apfs-fuse -o allow_other /dev/nbd0p2 ./part
Когда вы закончите просмотр своего диска, вы можете отключить раздел, диск и удалить устройство обратной связи:
sudo umount ./part
sudo umount ./mnt
sudo qemu-nbd --disconnect /dev/nbd0
sudo rmmod nbd
Во-первых, QEMU необходимо запустить от имени пользователя root.
Также потенциально возможно выполнить сквозную передачу USB, изменив разрешения устройства в контейнере. Смотрите здесь.
Например, создайте новый Dockerfile со следующим
FROM sickcodes/docker-osx
USER arch
RUN sed -i -e s/exec qemu/exec sudo qemu/ ./Launch.sh
COPY --chown=arch ./new_image.img /home/arch/OSX-KVM/mac_hdd_ng.img
Где new_image.img
— это изображение qcow2, которое вы извлекли. Затем перестройте с помощью docker build .
Далее нам нужно узнать номера шин и портов USB-устройства, через которое мы хотим подключиться к виртуальной машине:
lsusb -t
/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/6p, 5000M
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/12p, 480M
| __ Port 2: Dev 5, If 0, Class=Human Interface Device, Driver=usbhid, 12M
| __ Port 2: Dev 5, If 1, Class=Chip/SmartCard, Driver=, 12M
| __ Port 3: Dev 2, If 0, Class=Wireless, Driver=, 12M
| __ Port 3: Dev 2, If 1, Class=Wireless, Driver=, 12M
| __ Port 5: Dev 3, If 0, Class=Video, Driver=uvcvideo, 480M
| __ Port 5: Dev 3, If 1, Class=Video, Driver=uvcvideo, 480M
В этом примере мы хотим пройти через устройство смарт-карты. Устройство, которое нам нужно, находится на шине 1 и порту 2.
Также могут быть различия, если ваше устройство использует USB 2.0 (ehci) и USB 3.0 (xhci). Подробнее см. здесь.
# hostbus and hostport correspond to the numbers from lsusb
# runs in privileged mode to enable access to the usb devices.
docker run
--privileged
--device /dev/kvm
-e RAM=4
-p 50922:10022
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-e EXTRA= " -device virtio-serial-pci -device usb-host,hostbus=1,hostport=2 "
mycustomimage
Вы должны увидеть, как устройство отображается, когда вы выполняете system_profiler SPUSBDataType
в оболочке MacOS.
Важное примечание: это приведет к тому, что хост-система потеряет доступ к USB-устройству во время работы виртуальной машины!
Это мой любимый контейнер. Вы можете указать существующий образ диска в качестве аргумента командной строки Docker.
Извлеките изображения с помощью sudo find /var/lib/docker -name mac_hdd_ng.img -size +10G
Укажите свой собственный локальный образ с аргументом команды -v "${PWD}/mac_hdd_ng.img:/image"
и используйте sickcodes/docker-osx:naked
при указании Docker создать контейнер.
Голый образ предназначен для загрузки любого существующего файла .img, например, в текущем рабочем каталоге ( $PWD
).
По умолчанию это изображение имеет переменную NOPICKER
, которая имеет значение "true"
. Это пропускает меню выбора диска. Используйте -e NOPICKER=false
или любую другую строку, кроме слова true
чтобы войти в меню загрузки.
Это позволяет вам использовать другие диски вместо пропуска меню загрузки, например, диск восстановления или дисковую утилиту.
docker pull sickcodes/docker-osx:naked
# run your own image + SSH
# change mac_hdd_ng.img
docker run -it
--device /dev/kvm
-p 50922:10022
-v " ${PWD} /mac_hdd_ng.img:/image "
-v /tmp/.X11-unix:/tmp/.X11-unix
-e " DISPLAY= ${DISPLAY :-: 0.0} "
sickcodes/docker-osx:naked
# run local copy of the auto image + SSH + Boot menu
docker run -it
--device /dev/kvm
-p 50922:10022
-v " ${PWD} /mac_hdd_ng_auto.img:/image "
-v /tmp/.X11-unix:/tmp/.X11-unix
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-e " NOPICKER=false "
sickcodes/docker-osx:naked
Команда «Быстрый запуск» должна работать «из коробки» при условии, что вы сохраните следующие строки. Работает на auto
и naked
машинах:
-v /tmp/.X11-unix:/tmp/.X11-unix
-e "DISPLAY=${DISPLAY:-:0.0}"
-e OSX_COMMANDS
позволяет запускать любые команды внутри контейнера.
docker pull sickcodes/docker-osx:auto
# boot to OS X shell + display + specify commands to run inside OS X!
docker run -it
--device /dev/kvm
-p 50922:10022
-v /tmp/.X11-unix:/tmp/.X11-unix
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-e " OSX_COMMANDS=/bin/bash -c " put your commands here " "
sickcodes/docker-osx:auto
# Boots in a minute or two!
ИЛИ, если у вас уже есть изображение и вы просто хотите войти в систему и выполнить произвольные команды:
docker pull sickcodes/docker-osx:naked-auto
# boot to OS X shell + display + specify commands to run inside OS X!
docker run -it
--device /dev/kvm
-p 50922:10022
-v /tmp/.X11-unix:/tmp/.X11-unix
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-e USERNAME=yourusername
-e PASSWORD=yourpassword
-e " OSX_COMMANDS=/bin/bash -c " put your commands here " "
sickcodes/docker-osx:naked-auto
# Boots in a minute or two!
Существует множество других потенциальных вариантов использования, которые могут идеально работать с Docker-OSX, некоторые из которых вы увидите ниже!
Для безголового контейнера удалите следующие две строки из команды docker run
:
# -v /tmp/.X11-unix:/tmp/.X11-unix
# -e "DISPLAY=${DISPLAY:-:0.0}"
Это особенно полезно для конвейеров CI/CD.
# run your own image headless + SSH
docker run -it
--device /dev/kvm
-p 50922:10022
-v " ${PWD} /mac_hdd_ng.img:/image "
sickcodes/docker-osx:naked
Необходимо изменить -it на -i, чтобы иметь возможность взаимодействовать с консолью QEMU.
Чтобы выйти из контейнера с помощью -i, вы должны docker kill <containerid>
. Например, чтобы убить все, docker ps | xargs docker kill
.
Пример собственного VNC QEMU
docker run -i
--device /dev/kvm
-p 50922:10022
-p 5999:5999
-v /tmp/.X11-unix:/tmp/.X11-unix
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-e EXTRA= " -display none -vnc 0.0.0.0:99,password=on "
sickcodes/docker-osx:big-sur
# type `change vnc password myvncusername` into the docker terminal and set a password
# connect to localhost:5999 using VNC
# qemu 6 seems to require a username for vnc now
НЕ TLS/HTTPS шифруется вообще!
Или ssh -N [email protected] -L 5999:127.0.0.1:5999
, где 1.1.1.1
— IP-адрес вашего удаленного сервера.
(Примечание: если вы закроете порт 5999 и используете SSH-туннель, это станет безопасным.)
Добавьте следующую строку:
-e EXTRA="-display none -vnc 0.0.0.0:99,password=on"
В терминале Docker нажимайте enter
, пока не увидите (qemu)
.
Введите change vnc password someusername
Введите пароль для вашего нового имени пользователя VNC^.
Вам также понадобится IP-адрес контейнера: docker inspect <containerid> | jq -r '.[0].NetworkSettings.IPAddress'
Или ip n
обычно сначала показывает IP-адрес контейнера.
Теперь VNC подключается с использованием IP-адреса контейнера Docker, например 172.17.0.2:5999
Удаленный VNC через SSH: ssh -N [email protected] -L 5999:172.17.0.2:5999
, где 1.1.1.1
— это IP-адрес вашего удаленного сервера, а 172.17.0.2
— IP-адрес вашего контейнера локальной сети.
Теперь вы можете напрямую подключить VNC к любому контейнеру, созданному с помощью этой команды!
При желании вы можете включить протокол SPICE, который позволяет использовать remote-viewer
для доступа к вашему контейнеру OSX, а не VNC.
Примечание. -disable-ticketing
разрешит доступ к виртуальной машине без проверки подлинности. См. руководство по Spice, чтобы узнать, как настроить доступ с проверкой подлинности («Ticketing»).
docker run
--device /dev/kvm
-p 3001:3001
-p 50922:10022
-e " DISPLAY= ${DISPLAY :-: 0.0} "
-e EXTRA= " -monitor telnet::45454,server,nowait -nographic -serial null -spice disable-ticketing,port=3001 "
mycustomimage
Затем просто выполните remote-viewer spice://localhost:3001
и добавьте --spice-debug
для отладки.
# You can create an image of an already configured and setup container.
# This allows you to effectively duplicate a system.
# To do this, run the following commands
# make note of your container id
docker ps --all
docker commit containerid newImageName
# To run this image do the following
docker run
--device /dev/kvm
--device /dev/snd
-v /tmp/.X11-unix:/tmp/.X11-unix
newImageName
docker pull sickcodes/docker-osx:auto
# boot directly into a real OS X shell with no display (Xvfb) [HEADLESS]
docker run -it
--device /dev/kvm
-p 50922:10022
sickcodes/docker-osx:auto
# username is user
# password is alpine
# Wait 2-3 minutes until you drop into the shell.
docker pull sickcodes/docker-osx:latest
docker run -it
--device /dev/kvm
--device /dev/snd
-v /tmp/.X11-unix:/tmp/.X11-unix
-e " DISPLAY= ${DISPLAY :-: 0.0} "
sickcodes/docker-osx:latest
# press CTRL + G if your mouse gets stuck
# scroll down to troubleshooting if you have problems
# need more RAM and SSH on localhost -p 50922?
docker run -it
--device /dev/kvm
--device /dev/snd
-p 50922:10022
-v /tmp/.X11-unix:/tmp/.X11-unix
-e " DISPLAY= ${DISPLAY :-: 0.0} "
sickcodes/docker-osx:latest
# turn on SSH after you've installed OS X in the "Sharing" settings.
ssh user@localhost -p 50922
Добавьте дополнительную опцию -e NOPICKER=true
.
Старые машины:
# find your containerID
docker ps
# move the no picker script on top of the Launch script
# NEW CONTAINERS
docker exec containerID mv ./Launch-nopicker.sh ./Launch.sh
# VNC-VERSION-CONTAINER
docker exec containerID mv ./Launch-nopicker.sh ./Launch_custom.sh
# LEGACY CONTAINERS
docker exec containerID bash -c " grep -v InstallMedia ./Launch.sh > ./Launch-nopicker.sh
chmod +x ./Launch-nopicker.sh
sed -i -e s/OpenCore.qcow2/OpenCore-nopicker.qcow2/ ./Launch-nopicker.sh
"
В настройках контейнера по-прежнему включены автоматические обновления. Возможно, вы захотите их отключить. У нас есть планы на будущее по развитию этого направления.
${DISPLAY:-:0.0}
? $DISPLAY
— это переменная оболочки, которая ссылается на ваш сервер отображения X11.
${DISPLAY}
— то же самое, но позволяет объединять переменные следующим образом:
${DISPLAY}_${DISPLAY}
напечатает :0.0_:0.0
$DISPLAY_$DISPLAY
напечатает :0.0
...потому что $DISPLAY_
— это не $DISPLAY
${variable:-fallback}
позволяет вам установить «резервную» переменную, которая будет подставлена, если $variable
не установлена.
Вы также можете использовать ${variable:=fallback}
для установки этой переменной (в вашем текущем терминале).
Мы предполагаем, что в Docker-OSX :0.0
— это переменная $DISPLAY
по умолчанию.
Вы можете увидеть, что у вас
echo $DISPLAY
Таким образом, ${DISPLAY:-:0.0}
будет использовать любую переменную, установленную для вас сервером X11, иначе :0.0
-v /tmp/.X11-unix:/tmp/.X11-unix
? -v
— это параметр командной строки Docker, который позволяет передать том в контейнер.
Каталог, который мы разрешаем использовать контейнеру Docker, представляет собой сокет дисплея X-сервера.
/tmp/.X11-unix
Если мы позволим контейнеру Docker использовать тот же сокет дисплея, что и наша собственная среда, то любые приложения, которые вы запускаете внутри контейнера Docker, также будут отображаться на вашем экране! https://www.x.org/archive/X11R6.8.0/doc/RELNOTES5.html
При инициализации или загрузке контейнера вы можете увидеть ошибки из консоли (qemu)
следующего вида: ALSA lib blahblahblah: (function name) returned error: no such file or directory
. Это более-менее ожидаемо. Пока вы можете загрузиться в контейнер и все работает, нет причин беспокоиться об этом.
См. также: здесь.