如何找出导致Docker运行缓慢的原因?

8
我的问题如下 - 我在OSX上安装了Docker,其中包含Redis、NginX、PHP 7和Unison的容器。映射到php-container中的Symfony 3.1.7的卷一切正常,但在平均情况下,Symfony的“欢迎”页面需要大约1.5秒的加载时间。同时,同样的设置没有使用docker时,我得到了0.2秒的加载时间。Symfony的控制台命令也有相同的差异,因此,我猜测这不是NginX的问题,而且Unison应该消除了与Docker文件同步在OSX问题相关的所有问题。
现在我已经没有任何想法可以加快速度,并找出是什么导致了1.5秒的延迟。
我的第二个MBP也有同样的问题,但同事的笔记本电脑没有发生这种情况,虽然它与我的类似,但我们无法找到两个设置之间的任何区别。
一切都在我的MBP上运行,它配备了2.5 GHz i5、8 Gb RAM和SSD。
Docker 1.12.3,OSX 10.12.1(Sierra)
docker-compose.yml:
mydockerbox-redis:
  image: phpdockerio/redis:latest
  container_name: mydockerbox-redis

mydockerbox-webserver:
  image: phpdockerio/nginx:latest
  container_name: mydockerbox-webserver
  volumes:
      - ..:/var/www/mydockerbox
      - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf
  ports:
   - "80:80"
  links:
   - mydockerbox-php-fpm

unison:  
  image: leighmcculloch/unison:latest  
  environment:  
    - UNISON_WORKING_DIR=/unison  
  volumes:
    - ../mydockerbox:/var/www/mydockerbox
  ports:  
    - "5000:5000"

mydockerbox-php-fpm:
  build: .
  dockerfile: php-fpm/Dockerfile
  container_name: mydockerbox-php-fpm
  volumes_from:  
    - unison  
  volumes:
    - ./php-fpm/php-ini-overrides.ini:/etc/php/7.0/fpm/conf.d/99-overrides.ini
  links:
    - mydockerbox-redis

以下是 php-fpm 容器的 Dockerfile:

FROM phpdockerio/php7-fpm:latest

# Install selected extensions and other stuff
RUN apt-get update \
    && apt-get -y --no-install-recommends install  php7.0-mongodb php7.0-redis php7.0-igbinary \
    && apt-get clean; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/*


WORKDIR "/var/www/mydockerbox"

1
如果你运行 docker-machine ls 命令,你可以看到 DRIVER 这一列。 - Matteo
@EdRandall - 哦,伙计,那正是我提问的重点 - 如何使一切正常工作,而不必使用任何额外的虚拟化软件,如何仅使用本地OSX虚拟化而不是使用VirtualBox或其他东西。 - Sergii Nester
@SergeyNester 请看一下 https://dev59.com/SGMm5IYBdhLWcg3whfWe - Ed Randall
@EdRandall 嗯,那已经是将近5年前的事了,自那以后发生了很多变化,例如https://www.docker.com/docker-news-and-press/docker-released-native-mac-and-windows-apps-optimize-developer-experience - Sergii Nester
这里的最佳答案可能更清晰地解释了我的“Docker是Linux的事情”的评论:https://dev59.com/9mQo5IYBdhLWcg3wdPAa - 即使现在runc也仅支持Linux平台。 - Ed Randall
显示剩余4条评论
2个回答

1
我建议您使用docker-machine-driver-xhyve

这是一个适用于xhyve/hyperkit(native macOS hypervisor.framework)的docker-machine/libmachine驱动程序插件。

您可以通过brew轻松安装(我希望您已经使用brew安装了docker&Co,否则请使用brew取消链接并安装它们!):

brew install docker-machine-driver-xhyve
sudo chown root:wheel $(brew --prefix)/opt/docker-machine-driver-xhyve/bin/docker-machine-driver-xhyve
sudo chmod u+s $(brew --prefix)/opt/docker-machine-driver-xhyve/bin/docker-machine-driver-xhyve

然后,您可以创建一个 Docker Machine,如下所示:
docker-machine create --driver xhyve --xhyve-experimental-nfs-share my-xhyve-docker-machine

并使用它来运行您的容器


谢谢您的建议,但我现在仍然希望使Docker自己正常运行,而不需要VirtualBox或其他额外的虚拟机引擎。 - Sergii Nester
嗨@SergeyNester,抽象层访问文件系统非常缓慢。我发现使用这个驱动程序可以有很大的改善。 - Matteo

0

首先,在您的php-fpm容器中基准测试PHP性能(例如使用this),并将其与同事的容器进行比较。

如果发现性能相同/可比较,则使用PHP性能分析工具找出Symfony在生成“欢迎”页面的每个位上所做的操作。这可能会确定瓶颈(可能是文件系统、与Redis容器的网络通信、DNS查找等)。

如果基准测试显示您的容器中的PHP本身运行较慢(我认为这不太可能),则在主机上运行基准测试。如果主机机器和php-fpm容器的结果之间存在很大差异,那么意味着Docker引擎正在限制资源,并需要进行深度调整或重新安装。


有趣的是,该基准测试在容器中所需的时间更短)) 现在我已经删除了带有Redis的容器,并且不应该进行DNS查找。根据Symfony分析器,超过一秒钟用于“Symfony初始化”。我想这让我面临着一些未知的文件系统问题,Unison无法处理。 - Sergii Nester
关于Symfony... @SergeyNester - 你找到减少“Symfony初始化”时间的解决方案了吗? - cadavre
@cadavre 不,我放弃了。 - Sergii Nester

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