Docker容器在开发模式下运行Rails应用程序非常缓慢

10

我在Docker容器中遇到了问题。Rails应用程序运行非常缓慢(即页面在浏览器上加载时间太长)。

应用程序细节:

Rails版本:4.2.0 Ruby版本:2.2.0

当我通过docker stats命令检查内存状态时,它显示主容器(1)的CPU利用率非常高。有时它会达到50%的利用率。

我尝试了一些配置,即增加了Docker的CPU分配,性能稍微提高了一点。

version: '3.7'

services:
  selenium:
    image: selenium/standalone-chrome-debug:3.141.59-krypton
    ports: ['4444:4444', '5900:5900']
    logging:
      driver: none
  redis:
    image: redis:3.0.0
  elastic:
    image: elasticsearch:1.5.2
  db:
    image: postgres:9.3.10
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
      - .:/home
  XYZ:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    stdin_open: true
    tty: true
    volumes:
      - .:/home
    ports:
      - "3000:3000"
    depends_on:
      - db
      - redis
      - elastic
      - selenium
    environment:
      - REDIS_URL=redis://redis:6379/0
      - ELASTICSEARCH_URL=elastic://elastic:9200/0
      - SELENIUM_HOST=selenium
      - SELENIUM_PORT=4444
      - TEST_APP_HOST=XYZ
      - TEST_PORT=3000

我发现在浏览器上加载的JS文件需要太长时间,大约 1.3分钟,比如如果有4个JS文件,则每个文件需要超过1分钟的时间来加载。

我的感觉是Docker在Mac机器上运行得很慢,因为相同的应用在Linux机器上运行得非常好,也许我错了,但这是我看到的观察结果。

任何帮助将不胜感激。


你能否同时包含 top 命令的结果? - LinPy
Docker在Mac上并不是本地的,而是使用HyperKit,这是一个基于Hypervisor.framework构建的轻量级macOS虚拟化解决方案。这可能与性能差异有关。 - Stefano
你尝试过使用缓存和委托[1]吗?你尝试过像docker-sync这样的外部工具吗?你能否尝试一下不带卷的容器测试呢? [1]:https://docs.docker.com/docker-for-mac/osxfs-caching/ - jmny
这里有一个例子:https://medium.com/devcupboard/dockerizing-development-environment-in-mac-performance-debugging-dac16aa4524 - jmny
@jmny我尝试了同样的方法,但它没有同步最新的代码。 - Rohit Lingayat
显示剩余2条评论
1个回答

4

我通过设置docker-sync来解决我的问题。我按照这篇文章设置了docker-sync

解决问题的步骤:

第一步:sudo gem install docker-sync

第二步:创建一个docker-sync.yml文件

version: "2"
options:
  verbose: true
syncs:
  #IMPORTANT: ensure this name is unique and does not match your other application container name
  XYZ-sync: #tip: add -sync and you keep consistent names as a convention
    src: .
    sync_host_ip: 'localhost'
    sync_host_port: 10872
sync_strategy: 'rsync'

步骤3:使用以下细节更新docker-compose.yml文件

...
    volumes:
      - xyz-sync:/home:nocopy

volumes:
  XYZ-sync:
    external: true

步骤4:安装rsync brew install rsync 步骤5:启动docker-sync-stack docker-sync-stack start

我已经解释了设置docker-sync的整个过程。https://betterprogramming.pub/improve-performance-of-docker-on-macos-by-using-docker-sync-4f46edbde570 - Rohit Lingayat
这对我没有用,因为docker-sync似乎有问题 https://github.com/EugenMayer/docker-sync/issues/509那里的解决方案都对我没用。不确定是否有遗漏的步骤。 - Vishnu Narang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接