【问题标题】:Docker Container running very slow for Rails Application on development mode在开发模式下,Rails 应用程序的 Docker 容器运行速度非常慢
【发布时间】:2020-01-02 15:53:55
【问题描述】:

我在 docker 容器上遇到问题。 Rails 应用程序运行速度非常慢(意味着页面在浏览器上加载时间过长)。

申请详情:

Rails 版本:4.2.0 Ruby 版本:2.2.0

当我通过命令docker stats检查内存状态时,显示主容器的CPU利用率非常高(1)。有时它会用到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 min,例如,如果有 4 个 js 文件,每个文件需要更多的时间来加载 1 min

我觉得docker在mac机器上运行很慢,因为同样的应用程序在Linux机器上运行得很好,可能是我错了,但这是我看到的观察结果。

任何帮助将不胜感激。

【问题讨论】:

  • 能否也包含top命令的结果
  • Mac 上的 docker 不是原生的,而是 HyperKit,一个建立在 Hypervisor.framework 之上的轻量级 macOS 虚拟化解决方案。这可能与性能差异有关
  • 您是否尝试过使用缓存和委托 [1] ?你试过像 docker-sync 这样的外部工具吗?你能用没有体积的容器做测试吗? [1]:docs.docker.com/docker-for-mac/osxfs-caching
  • @jmny 我还没试过 docker-sync 让我试试这个会让你知道的
  • 你好@jmny,谢谢你的建议,docker-sync 实际上在我的场景中工作,现在好多了。但是现在我面临一个问题,即刷新页面时它不会同步最新代码。你能告诉我我错过了什么吗?

标签: ruby docker docker-compose ruby-on-rails-4.2


【解决方案1】:

我通过设置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

第四步:brew install rsync

第五步: docker-sync-stack start

【讨论】:

猜你喜欢
  • 2017-05-27
  • 1970-01-01
  • 1970-01-01
  • 2012-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-03
相关资源
最近更新 更多