Этот пост дополняет статью о том, как начать работу с docker. Мы немного углубимся и изучим то, что docker может предложить нам. Для последовательности я начну с самого начала. Вы можете перейти к основной части, если знаете, как настроить Docker с Nodejs.
Давайте погрузимся
Повестка дня
🎯 Настройка
🎯 Интерактивная оболочка
🎯 Сохранение данных (тома и горячая перезагрузка нодемона)
🎯 Совместное использование данных между контейнером и локальной машиной
Настройка
Давайте настроим наш NodeJs сервер и докеризируем его.
В вашем файле index.js
напишите следующие строки кода:
const express = require('express');
const app = express();
const port = process.env.PORT || 4545;
app.use(express.json());
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.listen(port, () => {
console.log(`Server is running on port ${port}`);
});
Затем добавьте Dockerfile
и добавьте следующую строку:
Activate your Docker Desktop
Зеленый цвет здесь 👆🏼 означает активный.
Теперь мы можем собрать наш образ.
docker build -t node-devto .
проверить собранный образ
docker image ls
Давайте запустим наш контейнер из собранного образа
Запускаем: docker run -v $(pwd):/app -p4000:4545 -d --name node-api-devto node-devto
.
Давайте протестируем наш запущенный контейнер
Интерактивная оболочка
Откроем наш запущенный контейнер в режиме интерактивной оболочки
Посмотрим папки и файлы в нашем контейнере
Выйдите из интерактивной оболочки, используя: exit
.
Создание файлов в контейнере
Мы можем создавать файлы в нашем контейнере, как мы обычно взаимодействуем с терминалом.
Сохранение данных
Если мы изменим что-либо в нашем экспресс-сервере, например, ответ, который мы отправляем нашему клиенту. давайте изменим ответ с Hello World!
на Hello Docker!
. Чтобы обновить наш код, мы удаляем запущенный контейнер, изменяем наш код и пересобираем образ.
Затем мы запускаем наш контейнер из собранного образа.
Если мы снова обновим браузер, то увидим изменения.
Приведенный выше процесс может быть громоздким. Чтобы не пересобирать образ при каждом изменении, мы используем тома, которые позволяют нам иметь персистентные данные, [bind/mount], что позволяет нам синхронизировать данные в нашей локальной файловой системе [папка] с файловой системой [папка] контейнера.
Во-первых, давайте установим nodemon
в качестве Development Dependencies, чтобы помочь перезапустить наш сервер автоматически при изменении.
🐋 Установите nodemon
🐋 Отредактируйте package.json для запуска скрипта dev
🐋 Переконфигурируйте наш Dockerfile
🐋 Пересобираем наш образ
🐋 Далее запускаем контейнер из собранного образа с помощью volume и bound/mount
Теперь позвольте мне изменить наш ответ сервера на Hey, we made it
. Сохраняем кодовую базу
Обновите наш браузер.
Ура, все работает! Нам больше не нужно перестраиваться каждый раз, когда мы хотим увидеть изменения.
Обмен данными между контейнером и локальной машиной
Давайте снова откроем нашу интерактивную оболочку
Мы можем создавать файлы из нашего контейнера, и они появятся в нашей локальной файловой системе.
Заключение
Надеюсь, этот пост был полезен. Оставайтесь с нами, чтобы узнать больше полезных команд docker, как использовать docker-compose
, запуск сервисов и обходные пути в моем следующем посте.
Ссылки
Самоучитель по Docker для начинающих
Docker
Изучайте Docker — DevOps с Node.js & Express