Quería probar Docker como una herramienta para el desarrollo local. docker-compose para activar 3 contenedores: uno para la base de datos (postgres), front-end (ejecutando webpack y node sass en modo reloj) y back-end (Elixir/Phoenix ).
Todo funciona muy bien, excepto que cuando presiono localhost:4000 , la carga de la página es realmente lenta: 10-15 segundos solo para obtener la página de inicio de sesión, que es estática.
Revisé los registros de docker-compose y los tiempos de respuesta del servidor son rápidos como de costumbre, lo que para mí significa que algo está ralentizando la conexión con el contenedor.
Cuando ejecuté el servidor directamente en la Terminal nuevamente, todo fue bastante rápido, por ejemplo, toma 1 segundo para cargar la misma página.
Soy nuevo en Docker, así que sospecho que me estoy perdiendo algo en cuanto a la configuración. Cualquier idea es apreciada. ¡Gracias!
Configuración
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 4000Versiones y otra información:
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)Actualización 5 de junio de 2020:
Es significativamente mejor usar docker-sync para el desarrollo local.
Primero asegúrese down los servicios existentes para eliminar los volúmenes antiguos.
Luego crea un docker-sync.yml así:
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'] Ahora puede usar el volumen del project en lugar de - .:/app para servicios front-end y back- backend , por ejemplo
volumes: - project:/app:nocopy - elixir-deps:/app/deps - elixir-build:/app/_build - static:/app/priv/static:ro Ejecute docker-sync start para iniciarlo en segundo plano, luego ejecute docker-compose up --build --detach como de costumbre.
Respuesta original:
Como señaló un comentarista ( @DavidMaze ), actualmente existen problemas de rendimiento conocidos con Docker para Mac. No puedo decir cuánto están vinculados a mi caso de uso, pero después de leer la guía de ajuste de rendimiento en los documentos oficiales, logré hacer algunos progresos en el rendimiento:
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" Tenga en cuenta el uso de :delegated al declarar los volúmenes . .:/app:delegated .
Aunque esto es una mejora, sigue siendo mucho más lento para el desarrollo diario que ejecutar las cosas de forma nativa, por lo que agradezco otras respuestas a mi pregunta. Por el momento, creo que esa es probablemente la mejor solución.