连接到本地主机上 Docker 容器中的服务器非常慢

Svi*_*len 5 docker docker-compose

我想尝试使用 Docker 作为本地开发工具 \xe2\x80\x94 我曾经docker-compose启动 3 个容器:一个用于数据库(postgres)、前端(在监视模式下运行 webpack 和 Node sass)和后端(Elixir /凤凰)。

\n\n

一切都很好,除了当我点击localhost:4000页面加载速度非常慢 \xe2\x80\x94 10-15 秒只是为了获取静态的登录页面。

\n\n

我检查了日志docker-compose,服务器响应时间像平常一样快,这对我来说意味着某些东西正在减慢与容器的连接。

\n\n

当我再次直接在终端中运行服务器时,一切都非常快,例如加载同一页面需要 1 秒。

\n\n

我是 Docker 新手,所以我怀疑我可能缺少一些配置方面的东西。任何想法表示赞赏。谢谢你!

\n\n

配置

\n\n

docker-compose.yml

\n\n
version: "3.6"\n\nservices:\n  postgres:\n    container_name: postgres\n    image: postgres:11.0-alpine\n    ports:\n      - 5432:5432\n    volumes:\n      - postgres:/var/lib/postgresql/data\n\n  front-end:\n    container_name: front-end\n    env_file:\n      - "docker/dev/.env"\n    build:\n      context: "."\n      dockerfile: "docker/dev/Dockerfile.front-end"\n    volumes:\n      - .:/app\n      - node_modules:/app/node_modules\n      - static:/app/priv/static\n    command: npm run dev\n\n  backend:\n    container_name: backend\n    build:\n      context: "."\n      dockerfile: "docker/dev/Dockerfile.backend"\n    env_file:\n      - "docker/dev/.env"\n    depends_on:\n      - postgres\n      - front-end\n    ports:\n      - 4000:4000\n    stdin_open: true\n    tty: true\n    volumes:\n      - .:/app\n      - elixir-deps:/app/deps\n      - static:/app/priv/static\n    command: iex -S mix phx.server\n\nvolumes:\n  postgres:\n  elixir-deps:\n  node_modules:\n  static:\n    driver_opts:\n      type: "tmpfs"\n      device: "tmpfs"\n
Run Code Online (Sandbox Code Playgroud)\n\n

Dockerfile.front-end

\n\n
FROM node:8.10-alpine\n\nWORKDIR /app\n\nCOPY package.json ./\nCOPY package-lock.json ./\n\nRUN npm install\n\nCOPY . .\n
Run Code Online (Sandbox Code Playgroud)\n\n

Dockerfile.backend

\n\n
FROM elixir:1.8-alpine\n\nRUN apk update && apk add build-base inotify-tools postgresql-dev\n\nWORKDIR /app\n\nCOPY mix.exs ./\nCOPY mix.lock ./\n\nRUN mix local.hex --force && mix local.rebar --force \\\n    && mix deps.get && mix deps.compile\n\nCOPY . .\n\nEXPOSE 4000\n
Run Code Online (Sandbox Code Playgroud)\n\n

版本及其他信息:

\n\n
MacOS Mojave 10.14.3\nDocker Desktop 2.0.0.3 (Engine 18.09.2, Compose: 1.23.2)\n\nMacBook Pro 13" (Early 2015, 16GB RAM/3.1GHz Core i7)\n
Run Code Online (Sandbox Code Playgroud)\n

Svi*_*len 5

2020 年 6 月 5 日更新:

docker-sync用于本地开发要好得多。

首先确保您down现有的服务可以删除旧卷。

然后创建一个docker-sync.yml像这样的:

version: "2"
options:
  # Renamed compose file to `docker-compose.dev.yml`
  compose-dev-file-path: 'docker-compose.dev.yml'

syncs:
  # This name should be unique and should not clash with
  # an existing container or service name. You can use it
  # as a volume in docker compose yml.
  project:
    src: '.'
    sync_excludes: ['node_modules', 'deps', '_build']
Run Code Online (Sandbox Code Playgroud)

现在您可以使用project卷代替- .:/appforfront-endbackendservices,例如

    volumes:
      - project:/app:nocopy
      - elixir-deps:/app/deps
      - elixir-build:/app/_build
      - static:/app/priv/static:ro
Run Code Online (Sandbox Code Playgroud)

运行docker-sync start以在后台启动它,然后docker-compose up --build --detach照常运行。

原答案:

正如一位评论者指出的那样 ( @DavidMaze ),目前Docker for Mac存在已知的性能问题。我无法判断它们与我的用例有多少联系,但在阅读了官方文档中的性能调优指南后,我设法在性能方面取得了一些进展:

docker-compose.yml

version: "3.6"

services:
  postgres:
    container_name: postgres
    image: postgres:11.0-alpine
    ports:
      - 5432:5432
    volumes:
      - postgres:/var/lib/postgresql/data

  front-end:
    container_name: front-end
    env_file:
      - "docker/dev/.env"
    build:
      context: "."
      dockerfile: "docker/dev/Dockerfile.front-end"
    volumes:
      - .:/app:delegated
      - node_modules:/app/node_modules
      - static:/app/priv/static
    command: npm run dev

  backend:
    container_name: backend
    build:
      context: "."
      dockerfile: "docker/dev/Dockerfile.backend"
    env_file:
      - "docker/dev/.env"
    depends_on:
      - postgres
      - front-end
    ports:
      - 4000:4000
    stdin_open: true
    tty: true
    volumes:
      - .:/app:delegated
      - elixir-deps:/app/deps
      - elixir-build:/app/_build
      - static:/app/priv/static:ro
    command: iex -S mix phx.server

volumes:
  postgres:
  elixir-deps:
  elixir-build:
  node_modules:
  static:
    driver_opts:
      type: "tmpfs"
      device: "tmpfs"
Run Code Online (Sandbox Code Playgroud)

:delegated请注意声明卷时的使用.:/app:delegated

虽然这是一个改进,但对于日常开发来说,它仍然比本地运行慢得多,所以我欢迎对我的问题有其他答案。就目前而言,我认为这可能是最好的解决方案。