Комментарии 25
Docker — это инструмент, который позволяет создавать, разворачивать и запускать приложения с использованием контейнеров, независимых от операционной системы, на которой они выполняются. Контейнер включает в себя образ базовой ОС, необходимой для работы приложения, библиотеки, от которых зависит это приложение, и само это приложение. Если на одном компьютере запущено несколько контейнеров, то они пользуются ресурсами этого компьютера совместно.Первая нормальная статья, где понятно объясняется, что такое Docker и зачем он нужен! Аллилуйя! :) Благодарю!
+4
Docker — это инструмент, который позволяет создавать, разворачивать и запускать приложения с использованием контейнеров, независимых от операционной системы, на которой они выполняются. Контейнер включает в себя образ базовой ОС, необходимой для работы приложения, библиотеки, от которых зависит это приложение, и само это приложение.С созданием образа для Node.js приложения понятно, но непонятно, где и как создаются слои для первых 2-х пунктов: "образ базовой ОС и библиотеки, от которых зависит это приложение"? И нужно ли их создавать отдельно? Что значит фраза: «контейнеры, независимые от операционной системы»? Т.е. образ докера, например, с ОС Linux, можно запускать на машине с Windows или Mac? Или один дистрибутив Linux поверх другого, например, Ubuntu поверх SUSE?
0
С созданием образа для Node.js приложения понятно, но непонятно, где и как создаются слои для первых 2-х пунктов: «образ базовой ОС и библиотеки, от которых зависит это приложение»?
В данном случае это делается в баозовых образах. Например в построении образа для Node.js приложения используются два базовых образа:
FROM node:8 As build — для сборки приложения
…
FROM node:alpine — для запуска собранного приложения.
Чтобы понять какая ОС используется, можно посмотреть Dokerfile базового образа, документацию в Docker Hub.
Из Dokerfile node 8 alpine: FROM alpine:3.10
Т.е. образ докера, например, с ОС Linux, можно запускать на машине с Windows или Mac?
Можно. Один и тот же образ можно запускать на разных ОС. Я запускаю на вин10, на Ubuntu и на RHeL.
0
Я как-то объяснил человеку, что Docker, это такой FreeBSD Jail и он сразу всё понял.
-1
А что мешает один раз с помощью докера с нодой собрать node_modules, и потом пробрасывать волюмом в дефолтный нодовский контейнер, без строительства и кэшей?
Вот тут можно через директивы для docker-compose указать и порты на экспозицию, и модули доставить, и даже дефолтную команду на старт указать.
version: '3'
services:
apptestcontainer:
image: node:10
shm_size: '2gb'
environment:
MOCHA_FILE: /test-reports/junit-report.xml
volumes:
- ../app:/app
- ./config/config.yml:/app/config.yml
- ./test-reports:/test-reports
networks:
backend: {}
depends_on:
- another_app
working_dir: /app
command: ["npm", "test"]
Вот тут можно через директивы для docker-compose указать и порты на экспозицию, и модули доставить, и даже дефолтную команду на старт указать.
0
Обычно мешает то, что контейнеры выполняются в совершенно другом месте и тащить туда весь проект довольно проблематично.
Ну и контейнеры работают не только в docker-compose
+2
Dockerfile имеет смысл только в одном случае — при отправке на продакшен. И тогда да — я собираю контейнер, но всё ещё с использованием docker-compose. Просто потому что кучу всего можно и нужно указывать в виде кода, а не ключей для docker build. Но тогда теряется смысл в кэшировании сборки — у меня нет сильных ограничений на время сборки для продакшена — ± 5 минут на node_modules или там nuget — роли не сыграют.
В остальном — локальная разработка, юнит-тестирование, интеграционное тестирование, selenium-тесты — всё это у меня крутится через docker-compose как локально, так и на CI.
А ещё мне просто нравится yaml-разметка, и не нравятся длинные/сложные jenkins-пайплайны.
В остальном — локальная разработка, юнит-тестирование, интеграционное тестирование, selenium-тесты — всё это у меня крутится через docker-compose как локально, так и на CI.
А ещё мне просто нравится yaml-разметка, и не нравятся длинные/сложные jenkins-пайплайны.
0
Пример с docker-compose подходит для локальной разработки и всяких CI/CD из говна и палок самописного разлива, он несет с собой ряд ограничений для продакшина:
Поэтому, для разворачивания во всяких k8s и прочих свормах необходим самодостаточный образ без всяких волюмов.
UPD. Пока писал комментарий тут уже ответов понаписали
- Заметное снижение производительсности в определенных случаях (например, на MacOS) по причине не очень качественной реализации volumes
- Для работоспособности необходимо рядом держать код. Т.е. его надо дополниельно туда положить и обновлять. В ряде случаев доступа к файловой системе вообще нет.
- Непонятно, как ставить глобально пакеты, например curl
Поэтому, для разворачивания во всяких k8s и прочих свормах необходим самодостаточный образ без всяких волюмов.
UPD. Пока писал комментарий тут уже ответов понаписали
+1
Из нашего опыта: использовали yarn для установки зависимостей в Dockerfile, получался очень большой размер образа.
Оказалось что yarn даже с флагом --production устанавливает dev зависимости, в GitHub вроде даже есть соответствующий issue. Поменяли на npm, размер сократился в 3 раза.
Оказалось что yarn даже с флагом --production устанавливает dev зависимости, в GitHub вроде даже есть соответствующий issue. Поменяли на npm, размер сократился в 3 раза.
0
RUN mkdir -p ${APP_DIR}
WORKDIR ${APP_DIR}
Здесь mkdir -p лишний, директива WORKDIR сама создает каталог
В теме оптимизации хотелось видеть информацию про образы на основе alpine или debian:*-slim
0
Вроде такого — nastytester.com/posts/docker-part2.html?
0
Лучше бы про кеширование образов рассказали, как шарить те самые node_modules и прочее рассказали.
+1
Лишняя запятая в package.json, новичкам может помешать изучить материал
0
Собрал по данной инструкции image, запустил, контейнер стартует и сразу останавливается не давая возможности обратиться через curl. Что я делаю не так?
0
Разобрался, в последней команде CMD [«npm», «run»] вместо run нужно start
0
В коде package.json опечатка: запятая после ''node index.js'' не нужна.
"scripts": {
"start": "node index.js",
},
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Профессиональная контейнеризация Node.js-приложений с помощью Docker