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

时间:2019-05-24 11:51:14

标签: docker docker-compose

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

一切正常,除了当我点击localhost:4000时页面加载非常缓慢-仅10-15秒即可获得登录页面,这是静态的。

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

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

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

配置

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
      - 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
      - elixir-deps:/app/deps
      - static:/app/priv/static
    command: iex -S mix phx.server

volumes:
  postgres:
  elixir-deps:
  node_modules:
  static:
    driver_opts:
      type: "tmpfs"
      device: "tmpfs"

Dockerfile.front-end

FROM node:8.10-alpine

WORKDIR /app

COPY package.json ./
COPY package-lock.json ./

RUN npm install

COPY . .

Dockerfile.backend

FROM elixir:1.8-alpine

RUN apk update && apk add build-base inotify-tools postgresql-dev

WORKDIR /app

COPY mix.exs ./
COPY mix.lock ./

RUN mix local.hex --force && mix local.rebar --force \
    && mix deps.get && mix deps.compile

COPY . .

EXPOSE 4000

版本和其他信息:

MacOS Mojave 10.14.3
Docker Desktop 2.0.0.3 (Engine 18.09.2, Compose: 1.23.2)

MacBook Pro 13" (Early 2015, 16GB RAM/3.1GHz Core i7)

1 个答案:

答案 0 :(得分:0)

正如一位评论者指出(@DavidMaze),目前有known performance issues的Docker for Mac。它们与我无法告知的用例有多少联系,但是在阅读了官方文档中的Performance tuning guide之后,我设法在性能上取得了一些进步:

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"

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

尽管这是一个改进,但是对于日常开发而言,它仍然比本地运行要慢得多,因此,我欢迎其他回答。就目前而言,我认为这可能是最好的解决方案。