หรือติดต่อผ่าน 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 bootloader ที่ได้รับการดูแลอย่างดีมีฟังก์ชันการทำงานที่ยอดเยี่ยมมากมายที่ผู้ใช้ 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
จะเป็น Docker Bridge IP ซึ่งเป็นพีซีของคุณ แต่คุณสามารถใช้ 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 ปัจจุบันทั้งหมด
เซฟโหมด: ปิดการใช้งานนักเทียบท่าชั่วคราวเพื่อให้คุณสามารถย้ายโฟลเดอร์นักเทียบท่าได้ชั่วคราว
killall dockerd
systemctl disable --now docker
systemctl disable --now docker.socket
systemctl stop docker
systemctl stop docker.socket
ตอนนี้ Docker daemon ปิดอยู่ ให้ย้าย /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-2564 - เพิ่ม High Sierra, Mojave
เลือกอย่างใดอย่างหนึ่งเหล่านี้ในขณะที่ สร้าง ซึ่งไม่เกี่ยวข้องเมื่อใช้การดึงนักเทียบท่า:
--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
ขณะนี้มีรูปภาพหลายรูป แต่ละภาพมีกรณีการใช้งานที่แตกต่างกัน (อธิบายด้านล่าง):
เซียร์ราสูง:
ซ้อม:
คาทาลิน่า:
บิ๊กซูร์:
มอนเทอเรย์ สร้างภาพของคุณเอง:
Ventura สร้างภาพของคุณเอง:
Sonoma สร้างภาพของคุณเอง:
ระบบ Catalina ที่สร้างไว้ล่วงหน้าโดย Sick.Codes: ชื่อผู้ใช้: user
รหัสผ่าน: alpine
Naked: การตั้งค่าการนำภาพมาเอง (ใช้ข้อใดข้อหนึ่งข้างต้นก่อน):
Naked Auto: เช่นเดียวกับด้านบน แต่มี -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
ขอขอบคุณเซฟาซาราที่มีส่วนร่วมในการสนับสนุนครั้งสำคัญนี้
อย่าลังเลที่จะเปิดปัญหา หากคุณประสบปัญหาเล็กน้อยในการใช้งาน Docker-OSX หรือมีคำถามใดๆ
อย่างไรก็ตาม ก่อนที่คุณจะเปิดปัญหา โปรดตรวจสอบปัญหาที่ปิดแล้วและยืนยันว่าคุณกำลังใช้เวอร์ชันล่าสุดของพื้นที่เก็บข้อมูลนี้ ปัญหาของคุณอาจได้รับการแก้ไขแล้ว! คุณอาจเห็นคำตอบของคุณในส่วนคำถามและคำตอบด้านล่าง
ติดตาม @sickcodes!
สำหรับความพยายามที่ซับซ้อนยิ่งขึ้น เราขอเสนอบริการสนับสนุนดังต่อไปนี้:
ในกรณีที่คุณสนใจ โปรดติดต่อ @sickcodes บน Twitter หรือคลิกที่นี่
Docker-OSX ได้รับอนุญาตภายใต้ GPL v3+ ยินดีรับผลงานและชื่นชมอย่างมาก ที่จริงแล้วคุณได้รับอนุญาตให้ใช้ Docker-OSX เป็นเครื่องมือในการสร้างซอฟต์แวร์ที่เป็นกรรมสิทธิ์
หากคุณจริงจังกับความปลอดภัยของ Apple และอาจพบค่าหัวข้อบกพร่อง 6 หลักภายในโปรแกรม 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
ให้ตรวจสอบลิงก์นี้ ตรวจสอบว่าคุณได้เลือก "แสดงไฟล์ที่ซ่อน" และ "แสดงนามสกุลไฟล์" ในตัวเลือก File Explorer ผลลัพธ์ควรเป็นดังนี้:
[wsl2]
nestedVirtualization=true
ไปที่ WSL distro ของคุณ (เรียกใช้ 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 run เพื่อชี้ 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
ลบดิสก์ที่ใหญ่ที่สุด (ค่าเริ่มต้นประมาณ 200GB) อย่าแก้ไขดิสก์ที่มีขนาดเล็กกว่า -- หากคุณไม่สามารถคลิก erase
ได้ คุณอาจต้องลดขนาดดิสก์ลง 1kb
(ไม่บังคับ) สร้างพาร์ติชันโดยใช้พื้นที่ที่ไม่ได้ใช้เพื่อจัดเก็บระบบปฏิบัติการและไฟล์ของคุณ หากคุณต้องการจำกัดความจุ (สำหรับพาร์ติชัน Xcode 12 อย่างน้อย 60GB)
คลิก Reinstall macOS
ระบบอาจต้องรีบูตหลายครั้งระหว่างการติดตั้ง
นี่เป็นจุดเริ่มต้นที่ดีหากคุณประสบปัญหาในการเดินทาง โดยเฉพาะอย่างยิ่งหากคุณยังไม่คุ้นเคยกับ Docker มากนัก
แค่ต้องการทำคอนเทนเนอร์อย่างรวดเร็วใช่ไหม? ดูส่วนตัวอย่างการสร้างคอนเทนเนอร์ของเรา
คำถามและคำตอบในการแก้ไขปัญหาเฉพาะเจาะจง/ขั้นสูงเพิ่มเติมสามารถพบได้ในคำถามและคำตอบเพิ่มเติม คุณควรตรวจสอบปัญหาที่ปิดไปแล้วด้วย อาจมีคนอื่นได้รับคำถามแบบที่คุณตอบไปแล้ว แม้ว่าคุณจะไม่พบคำถามนั้นในเอกสารนี้ก็ตาม!
ดูการตั้งค่าเริ่มต้น
docker: unknown server OS: .
See 'docker run --help'.
ซึ่งหมายความว่า docker daemon ของคุณไม่ได้ทำงานอยู่
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'
หมายเหตุ การใช้งาน CPU จะถูกแชร์ ซึ่งต่างจากหน่วยความจำ เพื่อให้คุณสามารถจัดสรร CPU ทั้งหมดของคุณไปยังคอนเทนเนอร์ได้
หากคุณใช้ sudo dockerd
หรือ dockerd ถูกควบคุมโดย systemd/systemctl คุณจะต้องอยู่ในกลุ่ม 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
และต้องการใช้อิมเมจด้านล่างซ้ำอีกครั้งในภายหลังหรือไม่
หมายเหตุ: ดูตัวอย่างการสร้างคอนเทนเนอร์ก่อนเพื่อดูวิธีไปยังจุดที่เกี่ยวข้อง
นี่เป็นเวลาที่คุณต้องการเรียกใช้คอนเทนเนอร์ SAME อีกครั้งในภายหลัง คุณอาจจำเป็นต้องใช้ 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/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 +
คุณไม่สามารถจัดสรร RAM ได้มากกว่าที่เครื่องของคุณมี ค่าเริ่มต้นคือ 3 กิกะไบต์: -e RAM=3
หากคุณกำลังพยายามจัดสรร RAM ให้กับคอนเทนเนอร์มากกว่าที่คุณมีอยู่ในปัจจุบัน คุณอาจเห็นข้อผิดพลาดดังต่อไปนี้: cannot set up guest memory 'pc.ram': Cannot allocate memory
ดูเพิ่มเติม: ที่นี่, ที่นี่.
ตัวอย่างเช่น (ด้านล่าง) buff/cache
มี RAM ที่จัดสรรไว้แล้ว 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
ตรวจสอบ RAM อีกครั้ง:
[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
ในเซสชัน Terminal ที่รันคอนเทนเนอร์ ให้รัน:
/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
ตรวจสอบให้แน่ใจว่าได้คอมมิตอิมเมจนักเทียบท่าใหม่และบันทึกหรือสร้างใหม่ตามที่อธิบายไว้ในส่วนการลดพื้นที่ดิสก์
จากนั้นรันด้วยอาร์กิวเมนต์เหล่านี้
# 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
หรือให้นักเทียบท่าสร้างเมื่อรันไทม์ (ดูด้านล่าง)
ให้ตรวจสอบหมายเลขประจำเครื่องของคุณก่อนเข้าสู่ระบบ 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
ขั้นตอนแรกคือการหยุด docker daemon
sudo systemctl stop docker
ขั้นตอนที่สองคือการเปลี่ยนการกำหนดค่าคอนเทนเนอร์
/var/lib/docker/containers/[container-id]/config.v2.json
(สมมติว่า WIDTH เดิมของคุณคือ 1,024 และ HEIGHT คือ 768 คุณสามารถค้นหา 1,024 และแทนที่ด้วยค่าใหม่ได้ เช่นเดียวกับ 768)
ขั้นตอนสุดท้ายคือการรีสตาร์ท docker daemon
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
ซึ่งหมายความว่ารูปภาพจะขยายใหญ่ขึ้นเมื่อคุณใช้งาน แต่ระบบปฏิบัติการเกสต์คิดว่าคุณมีพื้นที่ว่าง 200GB
อ่านอย่างเดียว
# 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 จะต้องเริ่มต้นในฐานะรูท
นอกจากนี้ยังอาจเป็นไปได้ที่จะบรรลุการส่งผ่าน 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 ที่เราต้องการส่งผ่านไปยัง VM:
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 ในขณะที่ VM กำลังทำงานอยู่!
นี่คือภาชนะที่ฉันชอบ คุณสามารถจัดหาดิสก์อิมเมจที่มีอยู่เป็นอาร์กิวเมนต์บรรทัดคำสั่ง 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
คำสั่ง Quick Start ควรใช้งานได้นอกกรอบ โดยที่คุณคงบรรทัดต่อไปนี้ไว้ ทำงานใน 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
.
ตัวอย่าง QEMU VNC ดั้งเดิม
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 คอนเทนเนอร์ LAN ของคุณ
ตอนนี้คุณสามารถเชื่อมต่อ VNC กับคอนเทนเนอร์ใด ๆ ที่สร้างด้วยคำสั่งนี้ได้โดยตรง!
หรือคุณสามารถเปิดใช้งานโปรโตคอล SPICE ซึ่งอนุญาตให้ใช้ remote-viewer
เพื่อเข้าถึงคอนเทนเนอร์ OSX ของคุณแทนที่จะเป็น VNC
หมายเหตุ: -disable-ticketing
จะอนุญาตให้เข้าถึง VM โดยไม่ผ่านการตรวจสอบสิทธิ์ ดูคู่มือเครื่องเทศสำหรับความช่วยเหลือในการตั้งค่าการเข้าถึงที่มีการรับรองความถูกต้อง ("การออกตั๋ว")
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 server
/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
สิ่งเหล่านี้เป็นสิ่งที่คาดหวังไม่มากก็น้อย ตราบใดที่คุณสามารถบูตเข้าสู่คอนเทนเนอร์ได้และทุกอย่างยังใช้งานได้ ก็ไม่มีเหตุผลที่จะต้องกังวลเกี่ยวกับสิ่งเหล่านี้
ดูเพิ่มเติมที่: ที่นี่