用Docker创build缓慢的Django模型实例

我有一些模型Django的应用程序。 我有manage.py命令创buildn模型并将其保存到数据库。 它在我的主机上以合适的速度运行。

但是,如果我在docker运行它运行速度非常慢,1个实例创build和保存在40-50秒。 我认为我错过了Docker的工作方式,有人可以指出为什么性能低下,我该怎么办呢?

docker-compose.yml

 version: '2' services: db: restart: always image: "postgres:9.6" ports: - "5432:5432" volumes: - /usr/local/var/postgres:/var/lib/postgresql environment: - POSTGRES_PASSWORD=postgres - POSTGRES_DB=my_db - POSTGRES_USER=postgres web: build: . command: bash -c "./wait-for-it.sh db:5432 --timeout=15; python manage.py migrate; python manage.py runserver 0.0.0.0:8000; python manage.py mock 5" ports: - "8000:8000" expose: - "8000" depends_on: - db 

用于Web服务的dockerfile

 FROM python:3.6 ENV PYTHONBUFFERED 1 ADD . . WORKDIR . RUN pip install -r requirements.txt RUN chmod +x wait-for-it.sh 

这里的问题很可能是你在Mac上使用它的卷/usr/local/var/postgres:/var/lib/postgresql 。 据我了解Docker for Mac解决scheme,它使用文件共享来实现主机卷,这是本机文件系统访问慢得多。

可能的解决方法是使用泊坞窗卷而不是主机卷。 这里是一个例子:

 version: '2' volumes: postgres_data: services: db: restart: always image: "postgres:9.6" ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql environment: - POSTGRES_PASSWORD=postgres - POSTGRES_DB=my_db - POSTGRES_USER=postgres web: build: . command: bash -c "./wait-for-it.sh db:5432 --timeout=15; python manage.py migrate; python manage.py runserver 0.0.0.0:8000; python manage.py mock 5" ports: - "8000:8000" expose: - "8000" depends_on: - db 

请注意,这可能会使postgres数据的pipe理复杂化,因为您无法简单地从Mac访问数据。 您只能使用docker CLI或容器来访问,修改和备份这些数据。 此外,我不知道如果从Mac卸载Docker会发生什么情况,可能是因为您丢失了这些数据。

有两件事情,可能是一个可能的原因:

  1. docker集装箱的开始需要一些时间,所以如果你为每个实例启动新的容器,这可以加起来。
  2. 你使用什么存储驱动程序? Docker(经常)默认为设备映射器环回存储驱动程序, 速度 。 这里是一些上下文 。 如果你经常启动这个容器,这将是痛苦的。

除此之外,你的configuration看起来很明智,并没有明显的原因问题。 所以,如果上述两点不适用于你,请添加一些额外的评论—比如你如何实际添加这些模型实例