我想尝试使用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)
答案 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
。
尽管这是一个改进,但是对于日常开发而言,它仍然比本地运行要慢得多,因此,我欢迎其他回答。就目前而言,我认为这可能是最好的解决方案。