macOS Docker/Vagrant 开发环境
前言
Docker 相比虚拟机有很多优势,但在非 Linux 环境下运行会遇到文件系统同步的问题,IO 效率低下(使用 cached 或 delegated 标记也几乎无提升),在 Mac 下可以考虑使用 xhyve 虚拟机和 NFS/virtio-9p 加速 Mac 下的 Docker。但根据 https://github.com/kubernetes/minikube/issues/4291#issuecomment-494335628 ,0.4.0 版本的 docker-machine-driver-xhyve (Docker Machine 和 xhyve 之间的驱动)将导致 Docker 无法挂载 volume,可以选择安装 0.3.3-1 的旧版。但 0.3.3-1 版本的 docker-machine-driver-xhyve 在创建 docker machine 前的 precheck 中,仅接受 Virtualbox 5,导致在安装 Virtualbox 6 后 precheck 失败,可以考虑卸载 Virtualbox 或安装 5 的版本。另外,根据 https://github.com/machine-drivers/docker-machine-driver-xhyve#does-not-clean-up-the-vmnet-when-remove-a-vm ,删除 docker machine 将不会清理 vmnet,可能最多只能创建255个虚拟机,暂无解决方案。再者,docker-machine-driver-xhyve 这个项目有点 dead project 的意思,开发者更新不勤。因此,我折腾了挺久得到这样的结果觉得没有意思,决定选择传统的 Vagrant。以下介绍 Vagrant 开发环境和 0.3.3-1 版的 docker-machine-driver-xhyve 下的 Docker 开发环境(仅作备份)。
Vagrant
安装
如果是 PHP 项目,建议使用 laravel/homestead
box,再在其上自行安装其他内容,也可选择 ubuntu/bionic64
这样的纯系统 box。
brew cask install vagrant
git clone https://github.com/laravel/homestead.git ~/Projects/Homestead && cd ~/Projects/Homestead
git checkout v8.5.6 # 在 https://github.com/laravel/homestead/releases 查看最新 tag
bash init.sh
打开 homestead 文件夹下的 Homestead.yaml ,简单修改即可适合 web 项目,以下给出示例。
---
# 删除 vagrant machine 后会自动备份 MySQL
backup: true
folders:
- map: ~/Projects/Playground
to: /home/projects
type: "nfs" # nfs 更快
# 配置 sites 会自动配置好 nginx
# sites:
# - map: homestead.test
# to: /home/vagrant/code/public
# 端口转发
# ports:
# - send: 80
# to: 80
# - send: 7777
# to: 777
# protocol: udp
(可选)安装 Swoole
cd /tmp && curl -SL "https://github.com/swoole/swoole-src/archive/v4.3.4.tar.gz" -o swoole.tar.gz && mkdir -p swoole && tar -xf swoole.tar.gz -C swoole --strip-components=1 && rm swoole.tar.gz && cd swoole && phpize && ./configure --enable-openssl --enable-http2 --enable-mysqlnd && make && make install && echo "extension=swoole.so" >> /etc/php/7.3/cli/conf.d/swoole.ini
Docker(仅作备份)
安装
使用 cask 下的 docker 套件,包含了大部分需要的内容,会导致后面 docker-machine-driver-xhyve 依赖的 docker-machine 安装后不能创建软链接。
brew cask install docker
open /Applications/Docker.app
安装 xhyve 轻量虚拟机。
brew install xhyve
安装 docker-machine-driver-xhyve 驱动。
brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/7310c563d662ddbe094f46f9600cad30ad3551a6/Formula/docker-machine-driver-xhyve.rb
赋予 docker-machine-driver-xhyve root 权限。
sudo chown root:wheel $(brew --prefix)/opt/docker-machine-driver-xhyve/bin/docker-machine-driver-xhyve
sudo chmod u+s $(brew --prefix)/opt/docker-machine-driver-xhyve/bin/docker-machine-driver-xhyve
创建基于 xhyve 的 docker machine。
# 使用 docker-machine create --driver xhyve --help 查看可用的参数
docker-machine create --driver xhyve --xhyve-virtio-9p --xhyve-cpu-count -1 --xhyve-memory-size 2048 default
# 或者使用 nfs
docker-machine create --driver xhyve --xhyve-experimental-nfs-share --xhyve-cpu-count -1 --xhyve-memory-size 2048 default
# 将相关环境变量加入 bashrc
echo "eval \"\$(docker-machine env default)\"" >> ~/.bashrc && source ~/.bashrc # bash
echo "eval \"\$(docker-machine env default)\"" >> ~/.zshrc && source ~/.zshrc # zsh
运行与测试
根据这个测试命令,我在我的电脑上得到的结果是:
docker run --rm -it -v "$(PWD):/pwd" -w /pwd alpine time dd if=/dev/zero of=speedtest bs=1024 count=100000
100000+0 records in
100000+0 records out
real 0m 6.33s
user 0m 0.03s
sys 0m 0.45s
相比默认情况下的50多秒有成倍的性能提升。