MacOs中的Docker非常慢

时间:2019-05-02 11:02:17

标签: php symfony docker docker-compose

我有这个docker-compose.yml:

version: "3.1"
services:

    memcached:
      image: memcached:alpine
      container_name: universal-memcached2

    redis:
      image: redis:alpine
      container_name: universal-redis2

    mariadb:
      image: mariadb:10.4
      container_name: universal-mariadb2
      working_dir: /application
      volumes:
        - .:/application
        - "../data/db:/var/lib/mysql" # skasowac
      environment:
        - MYSQL_ROOT_PASSWORD=Haslo
        - MYSQL_DATABASE=sample
        - MYSQL_USER=user
        - MYSQL_PASSWORD=Haslo
      ports:
        - "8083:3306"


    webserver:
      image: nginx:alpine
      container_name: universal-webserver2
      working_dir: /application
      volumes:
          - .:/application
          - ./phpdocker/nginx/nginx.conf:/etc/nginx/conf.d/default.conf
      ports:
       - "8080:80"

    php-fpm:
      build: phpdocker/php-fpm
      container_name: universal-php-fpm2
      working_dir: /application
      volumes:
        - .:/application
        - ./phpdocker/php-fpm/php-ini-overrides.ini:/etc/php/7.3/fpm/conf.d/99-overrides.ini

    volumes:
        generated:
        var:
        static:

    phpmyadmin:
      image: phpmyadmin/phpmyadmin
      links:
        - mariadb
      environment:
        PMA_HOST: mariadb
        PMA_PORT: 3306
      ports:
        - '8081:80'

当我在symfony 4中运行我的最新项目时,它的运行速度非常慢...:(

我有新的MacO和Docker桌面。 我目前正在学习Symfony和Laravel框架,但这对于Docker来说非常慢。它甚至都没有工作。

我该如何修理?

6 个答案:

答案 0 :(得分:9)

正如其他答案中提到的那样,问题归结为Docker与OSX上的文件系统交互的方式。

我找到了一篇很棒的文章,介绍如何在OSX上更快地完成工作:

https://vivait.co.uk/labs/docker-for-mac-performance-using-nfs

这篇文章中,真正的解决方案是更改文件系统以使用NFS,但是由于我对Docker一无所知(它是为我工作而设置的),我选择使用较新版本的Docker中可用的选项

我在example.xlsmfor year_url in years_url: # For every page in the interval 1-4 for page in pages: # Make a get request response = requests.get('http://www.imdb.com/search/title?release_date=' + year_url + '&sort=num_votes,desc&page=' + page) # Parse the content of the request with BeautifulSoup page_html = BeautifulSoup(response.text, 'lxml') # Select all the 50 movie containers from a single page mv_containers = page_html.find_all('div', class_ = 'lister-item mode-advanced') # For every movie of these 50 for container in mv_containers: # If the movie has a Metascore, then: if container.find('div', class_ = 'ratings-metascore') is not None: # Scrape the name name = container.h3.a.text names.append(name) # Scrape the genre genre = container.p.find('span', class_ = 'genre').text.rstrip().replace("\n","").split(",") genres.append(genre) # Scrape the runtime runtime = container.p.find('span', class_ = 'runtime').text runtimes.append(runtime) # Scrape the year year = container.h3.find('span', class_ = 'lister-item-year').text years.append(year) # Scrape the IMDB rating imdb = float(container.strong.text) imdb_ratings.append(imdb) # Scrape the Metascore m_score = container.find('span', class_ = 'metascore').text metascores.append(int(m_score)) # Scrape the number of votes vote = container.find('span', attrs = {'name':'nv'})['data-value'] votes.append(int(vote)) # Scrape the GrossMill gross = int(container.find('span', text='Gross:').find_next('span')['data-value'].replace(',', '')) print(gross) grossmill.append(gross) 下的所有选项中添加了{ <a class="btn btn-danger" onclick="del_data();" href="del_mydata.jsp? product_id=<%= getstate have("product_id")%>">Delete</a> } 。重新启动容器后,每个容器的速度几乎是以前的两倍。速度不如原生,但足够快。

文章示例:

:delegated

NFS示例很长,基本上需要复制文章的一半,因此我不会添加它,但是此volumes解决方案是一个很好的起点。

答案 1 :(得分:2)

事实上,Docker需要一个普通的Linux kernel才能运行。不幸的是,Mac OS和Windows无法提供此功能。因此,Mac OS上有一个客户端来运行Docker。除此之外,Mac OS内核和应用程序(Docker容器)之间还有一个抽象层,文件系统也不相同。因此,Docker在Mac OS上运行缓慢。您无法像在Linux上那样在Mac OS上运行Docker。

如果我需要提供一些有关实际用例的实例。我有同一台机器。因此,我在Mac OS Mojave的Docker v18上使用Symfony 4。这是我的Symfony在Docker上的总执行时间。 (很明显,这取决于您的前端和数据库查询,但我尝试向您介绍主要逻辑。

  • 第一次渲染12000毫秒
  • 使用Symfony缓存:344毫秒
  • 使用Docker缓存(:Docker的卷的cached属性):195毫秒

只要我使用不带Docker的Symfony,以下就是我的总执行时间。

  • 没有Docker,带有Symfony缓存:82毫秒

我们可以做一些改进,以获得更好的工作空间。例如,您可以使用这样的卷

volumes: - .:/application:cached

答案 2 :(得分:0)

一个选择是使用http://docker-sync.io/,但是您将无法获得与基于Linux的计算机相同的性能。

答案 3 :(得分:0)

使用诱变剂

通过使用Mutagen,可以在Mac上几乎与Linux上的本机共享卷上一样快地获得性能。有一个基准测试here

我创建了a full example for a Symfony project,它可以用于任何语言的任何类型的项目。

答案 4 :(得分:0)

我建议使用Parallels(适用于macOS的最佳虚拟化)。然后:

  1. 安装Linux
  2. 安装ssh服务器
  3. 安装docker

如果使用VSCode,则可以安装SSH扩展,并且它足够快来编辑文件。您还可以通过虚拟机的IP地址在macOS上访问您的网站。

答案 5 :(得分:0)

这是已知的。 docker和Mac出现问题...它们不是最好的伙伴,但它们可以彼此玩耍。

:cached添加到卷中,并且速度可以控制。