运维 使用 docker-sync 让 mac 和 docker 之间的文件同步变快

heroyct · 2018年08月06日 · 最后由 heroyct 回复于 2018年08月07日 · 1193 次阅读

最近,在mac上面安装了docker,然后让开发环境运行在docker上面

总的来说感觉不错
但是同一个页面,在linux上面的时候需要4秒,在mac for docker上面需要25秒

调查了一下原因

osxfs的介绍,有兴趣的可以研究下
https://docs.docker.com/docker-for-mac/osxfs/#performance-issues-solutions-and-roadmap

搜索了一下解决办法

1. vagrant -> virtualbox -> linux -> docker

试了下用vagrant安装linux,然后docker跑在linux上面,用nfs来同步
速度确实变快了,但是多安装了一层总感觉有点麻烦
所以调查了一下其他的解决办法

2. docker-sync

在docker-for-mac的网站和github的issue里面有介绍

试了下感觉不错,总结下如何使用的

1. 在mac上面安装docker-sync

$ gem install docker-sync
$ brew install fswatch
$ brew install unison
$ brew install eugenmayer/dockersync/unox
$ docker-sync start

2. 添加docker-sync.yml文件

version: '2'

syncs:
  sync-folder:
    src: '.'
    sync_strategy: 'unison'
    # 同步时的用户ID,不指定的话为root
    sync_userid: '1000'
    sync_excludes: ['vendor/bundle/', 'node_modules', 'tmp']

具体设置可以看这里

3. 添加docker-compose-dev.yml文件

version: '3'

volumes:
  sync-folder:
    external: true

services:
  app:
    volumes:
      - sync-folder:/www/sample_project

把mac的当前文件夹和docker服务器里面的/www/sample_project进行同步

4. docker-compose up

$ docker-compose -f docker-compose.yml -f docker-compose-dev.yml up -d

然后无论在mac还是在docker里面进行文件修改,都会自动进行同步
有时候不知道什么原因无法同步的时候可以重启docker-sync

$ docker-sync clean
$ docker-sync start

总结

mac for docker的文件同步很慢,目前发现两种解决方法

  1. vagrant -> virtualbox -> linux -> docker
  2. docker-sync

个人比较喜欢第二种,有更好的解决办法请回复我

共收到 5 条回复

我用 docker-sync 时,同步会有延迟,改代码之后要把页面刷两三遍,才有反应,而且container里rails g出来的东西,不会在local出现,需要重启docker才行,推荐用官方的 cached
https://docs.docker.com/docker-for-mac/osxfs-caching/

services:
  app:
    volumes:
      - .:/www/sample_project:cached

最标准的解决方案应该是在Linux系统上使用docker。😂 😅
买台电脑装linux系统做开发

@ fan124

我用 docker-sync 时,同步会有延迟

目前还没发现延迟,我在mac改完保存以后刷新页面就更新了,IDE的话可能是还未自动保存

用watch命令来观察延迟,基本未发现延迟

watch -n 1 cat test.rb

container里rails g出来的东西,不会在local出现

还没试过,等会试下,重启docker是一种方法 也可以试试这个

$ docker-sync clean
$ docker-sync start

推荐用官方的 cached

services:
  app:
    volumes:
      - .:/www/sample_project:cached

这个在mac for docker下太慢,没具体测试,感觉慢了十倍,基本没法用,所以才有这篇文章
很多在mac下用docker,不想再搞个虚拟机的可以参考下

速度慢是因为Asset Pipeline编译时会在 tmp 下产生很多临时文件,而mac和container的文件系统不一样,同步时需要做大量的格式转换。 (docker好像没有配置可以让部分文件或文件夹不做同步)

我这里用的UI是在网上购买的,所以带了很多js和css文件,8000多个吧(docker-compose up之后第一次载入需要2分钟),我把大部分暂时没有用到的assets删除之后就变快了(第一次载入不到20秒)。

@fan124 如果使用自带的已经可以满足你现在的项目的话,没必要在使用其它的

我使用docker自带的看一个页面大概需要25秒,实在太慢

慢的原因帖子里面已经介绍(osxfs的原因)

以前用vagrant大概是4秒,现在用docker-sync大概也是4秒

heroyct 用现代 Rails 逃离单页面应用 “兔子洞” 中提及了此贴 10月01日 18:26
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册