Svi*_*len 5 docker docker-compose
我想尝试使用 Docker 作为本地开发工具 \xe2\x80\x94 我曾经docker-compose启动 3 个容器:一个用于数据库(postgres)、前端(在监视模式下运行 webpack 和 Node sass)和后端(Elixir /凤凰)。
一切都很好,除了当我点击localhost:4000页面加载速度非常慢 \xe2\x80\x94 10-15 秒只是为了获取静态的登录页面。
我检查了日志docker-compose,服务器响应时间像平常一样快,这对我来说意味着某些东西正在减慢与容器的连接。
当我再次直接在终端中运行服务器时,一切都非常快,例如加载同一页面需要 1 秒。
\n\n我是 Docker 新手,所以我怀疑我可能缺少一些配置方面的东西。任何想法表示赞赏。谢谢你!
\n\n配置
\n\ndocker-compose.yml
\n\nversion: "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"\nRun Code Online (Sandbox Code Playgroud)\n\nDockerfile.front-end
\n\nFROM node:8.10-alpine\n\nWORKDIR /app\n\nCOPY package.json ./\nCOPY package-lock.json ./\n\nRUN npm install\n\nCOPY . .\nRun Code Online (Sandbox Code Playgroud)\n\nDockerfile.backend
\n\nFROM 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\nRun Code Online (Sandbox Code Playgroud)\n\n版本及其他信息:
\n\nMacOS 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)\nRun Code Online (Sandbox Code Playgroud)\n
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-end和backendservices,例如
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。
虽然这是一个改进,但对于日常开发来说,它仍然比本地运行慢得多,所以我欢迎对我的问题有其他答案。就目前而言,我认为这可能是最好的解决方案。
| 归档时间: |
|
| 查看次数: |
9873 次 |
| 最近记录: |