WangMao's Blog
原 Secret Blog,坐标深圳,码农

Docker 优化之 Docker-sync 解决 Docker 挂载缓慢

TOC

  1. 前言
  2. 天下苦秦久矣
  3. 总结
  4. 参考

前言

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 策略支持:

1
2
3
$ gem install docker-sync
$ brew install unison
$ brew install eugenmayer/dockersync/unox

如果提示 brew command not found,请自行安装 Homebrew,地址:Homebrew

编写配置文件 docker-sync.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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',
]

关闭并销毁容器:

1
$ docker-compose down

修改 docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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

现在启动同步并尝试启动容器:

1
2
3
$ docker-sync start
$ docker-compose build #重新构建容器
$ docker-comopse up -d

现在 macOS 和容器为双向同步,但也存在不同步的情况,这个时候需要手动重新同步:

1
2
$ docker-sync clean
$ docker-sync start

总结

Docker 在 macOS 和 Windows 上文件效率要低 10 倍到 40 倍不等,主要原因是 macOS 和 Windows 均是以虚拟的方式运行,文件越多,转换越慢。

最理想的方式挂载 Vagrant 至 Virtual Box,然后在 Virtual Box 里运行 Linux,在 Linux 上跑 Docker,这样将性能损耗降到最低,有时间再折腾吧。

参考