WangMao's Blog

Create more bugs.

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

成长笔记 3 评

前言

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,这样将性能损耗降到最低,有时间再折腾吧。

参考

使用 Nginx 实现 CORS Anywhere
3 评论
    2022年07月19日回复

    [...]参考文章 WangMao's Blog《Dowcker 优化之 Docker-sync 解决 Docker 挂载缓慢》[...]

    rjomgChrome 114OSX
    2023年06月12日回复

    十分感谢你的文章对我帮助很大,不过最有效果的还是减少文件数量。我悟了

    如果可以的话,加你的好友或者有技术群可以拉我进去。

    再次感谢您的帮助

      SecretChrome 114OSX
      2023年06月12日回复

      @rjomg 很高兴能帮助到你,我的 WeChat(base64): aWlpU2VjcmV0 ∠( ᐛ 」∠)_