前言
Docker 为 macOS 平台提供了一个非常方便的开发环境,要知道 MAMP 环境在 macOS 是付费的,其实我挺纳闷的,Apache 是免费的,MySQL 是免费的,PHP 也是开源的,怎么集成在 macOS 上就成了付费软件,颇有一种拿别人的成果赚自己的钱的感觉。
我使用 Docker 有一段时间了,再享受它带来的便利的同时也总感觉什么地方怪怪的,但也说不出来。直到和同事联调接口的时候,同事忍受不了我的本地环境非要让我更新到测试环境。我:???
本地环境的响应速度实在令人错愕:平均响应时间:2000ms+,如果接口里还有 CURL 的话还要翻倍。
天下苦秦久矣
无奈之下,检索关键字:docker so slow,结果还真不少。
首先来到 docker for mac 的一个 Issues,讨论甚是热闹,其中一个回答得很多赞。如下:
wadjeroudi : For those who look for a workaround and didn't read the whole thread, here is the solution :
https://github.com/EugenMayer/docker-sync
原文地址:https://github.com/docker/for-mac/issues/77#issuecomment-245210458
接着找到 docker-sync 的代码仓库,简介如下:
Run your application at full speed while syncing your code for development, finally empowering you to utilize docker for development under OSX/Windows/*Linux
参照 docker-sync 的 官方文档,开始配置,过程记录下来。
首先先安装 docker-sync 及其依赖的同步策略,各平台支持的同步策略如下:
- OSX:
native_osx
,unison
,rsync
- Windows:
unison
- Linux:
native_linux
,unison
结论如下,如果不想折腾直接用 unison
就行,不过 macOS 推荐的配置为 native_osx
。
安装 docker-sync 和 unison 策略支持:
$ gem install docker-sync
$ brew install unison
$ brew install eugenmayer/dockersync/unox
如果提示 brew command not found
,请自行安装 Homebrew,地址:Homebrew
编写配置文件 docker-sync.yml
:
version: '2'
options:
verbose: false
syncs:
unison-sync:
# 需要挂载的目录
src: '/path/to/app'
# 同步策略 macOS 推荐 native_osx,Windows 配置为 unison
sync_strategy: native_osx
# 这里的用户 ID 为 1000,请确认你的 php-fpm 为同一个用户
sync_userid: 1000
# 忽略的文件
sync_excludes: [
'.gitignore',
'.git/',
'.DS_Store',
]
关闭并销毁容器:
$ docker-compose down
修改 docker-compose.yml
:
version: "3"
# 新增挂载卷
volumes:
unison-sync:
external: true
services:
nginx:
image: nginx:${NGINX_VERSION}
ports:
- "${NGINX_HTTP_HOST_PORT}:80"
- "${NGINX_HTTPS_HOST_PORT}:443"
volumes:
# 此处使用挂载卷作为源
- unison-sync:/var/www/html/:nocopy
- ${NGINX_CONFD_DIR}:/etc/nginx/conf.d/:rw
- ${NGINX_CONF_FILE}:/etc/nginx/nginx.conf:ro
- ${NGINX_LOG_DIR}:/var/log/nginx/:rw
restart: always
networks:
default:
ipv4_address: 10.0.0.10
现在启动同步并尝试启动容器:
$ docker-sync start
$ docker-compose build #重新构建容器
$ docker-comopse up -d
现在 macOS 和容器为双向同步,但也存在不同步的情况,这个时候需要手动重新同步:
$ docker-sync clean
$ docker-sync start
总结
Docker 在 macOS 和 Windows 上文件效率要低 10 倍到 40 倍不等,主要原因是 macOS 和 Windows 均是以虚拟的方式运行,文件越多,转换越慢。
最理想的方式挂载 Vagrant 至 Virtual Box,然后在 Virtual Box 里运行 Linux,在 Linux 上跑 Docker,这样将性能损耗降到最低,有时间再折腾吧。