Использование связанного монтирования

В предыдущей главе мы говорили о именованном томе и использовали его для сохранения данных в нашей базе данных. Именованные тома отлично подходят для простого хранения данных, поскольку нам не нужно беспокоиться о том, где хранятся данные.

С помощью связывающего монтирования мы контролируем точную точку монтирования на хосте. Мы можем использовать это для сохранения данных, но часто это используется для предоставления дополнительных данных в контейнеры. При работе над приложением мы можем использовать связывающее монтирование для монтирования нашего исходного кода в контейнер, чтобы он видел изменения кода, реагировал на них и позволял нам сразу же увидеть изменения.

Для приложений, основанных на Node, nodemon является отличным инструментом для наблюдения за изменениями файлов и последующего перезапуска приложения. Существуют эквивалентные инструменты в большинстве других языков и фреймворков.

Быстрое сравнение типов томов

Bind mounts и именованные тома - это два основных типа томов, которые поставляются с движком Docker. Однако для поддержки других вариантов использования доступны дополнительные драйверы томов (SFTP, Ceph, NetApp, S3 и другие).

Именованные тома

Связанное монтирование

Место проведения

Docker выбирает

Вы контролируете

Пример монтирования (с использованием -v)

my-volume:/usr/local/data

/path/to/data:/usr/local/data

Заполняет новый том содержимым контейнера

Да

Нет

Поддерживает драйверы томов

Да

Нет

Запуск контейнера в режиме dev

Чтобы запустить наш контейнер для поддержки рабочего процесса разработки, мы сделаем следующее:

  • Установите наш исходный код в контейнер

  • Установите все зависимости, включая зависимости «dev»

  • Запустите nodemon для наблюдения за изменениями в файловой системе

Итак, давайте сделаем это!

  1. Убедитесь, что у вас не запущены предыдущие контейнеры getting-started.

  2. Выполните следующую команду из каталога app. После этого мы объясним, что происходит.

    Если вы используете устройство x86-64 Mac или Linux, то используйте следующую команду.

    $ docker run -dp 3000:3000 \
        -w /app -v "$(pwd):/app" \
        node:18-alpine \
        sh -c "yarn install && yarn run dev"
    

    Если вы используете Windows, то используйте следующую команду в PowerShell.

    $ docker run -dp 3000:3000 `
        -w /app -v "$(pwd):/app" `
        node:18-alpine `
        sh -c "yarn install && yarn run dev"
    
    • -dp 3000:3000 - то же самое, что и раньше. Запустите в отделенном (фоновом) режиме и создайте сопоставление портов

    • -w /app - устанавливает «рабочий каталог» или текущий каталог, из которого будет выполняться команда

    • -v "$(pwd):/app" - связывающее монтирование текущего каталога с хоста в каталог /app в контейнере

    • node:18-alpine - образ для использования. Обратите внимание, что это базовый образ для нашего приложения из Dockerfile

    • sh -c "yarn install && yarn run dev" - команда. Мы запускаем оболочку с помощью sh (в alpine нет bash) и запускаем yarn install для установки всех зависимостей, а затем запускаем yarn run dev. Если мы посмотрим в package.json, то увидим, что скрипт dev запускает nodemon.

  3. Вы можете посмотреть журналы с помощью docker logs. Вы будете знать, что готовы к работе, когда увидите это:

    $ docker logs -f <container-id>
    nodemon src/index.js
    [nodemon] 2.0.20
    [nodemon] to restart at any time, enter `rs`
    [nodemon] watching dir(s): *.*
    [nodemon] starting `node src/index.js`
    Using sqlite database at /etc/todos/todo.db
    Listening on port 3000
    

    Когда вы закончите просматривать журналы, выйдите, нажав Ctrl+C.

  4. Теперь давайте внесем изменения в приложение. В файле src/static/js/app.js изменим кнопку «Добавить элемент» на просто «Добавить». Это изменение будет в строке 109:

    -                         {submitting ? 'Adding...' : 'Add Item'}
    +                         {submitting ? 'Adding...' : 'Add'}
    
  5. Просто обновите страницу (или откройте ее), и вы увидите, что изменения отразились в браузере почти сразу. Перезапуск сервера Node может занять несколько секунд, поэтому если вы получите ошибку, просто попробуйте обновить страницу через несколько секунд.

    Screenshot of updated label for Add button
  6. Не стесняйтесь вносить любые другие изменения, которые вам хотелось бы сделать. Когда вы закончите, остановите контейнер и создайте новый образ с помощью:

    $ docker build -t getting-started .
    

Использование связывающего монтирования очень распространено в локальных установках разработки. Преимущество в том, что на машине разработчика не нужно устанавливать все инструменты сборки и окружения. С помощью одной команды docker run окружение разработчика подтягивается и готово к работе. Мы поговорим о Docker Compose в одном из следующих шагов, поскольку это поможет упростить наши команды (у нас и так много флагов).

Следующие шаги

На этом этапе вы можете поддерживать свою базу данных и быстро реагировать на потребности и запросы ваших инвесторов и учредителей. Ура! Но, знаете что? Вы получили отличные новости! Ваш проект был выбран для дальнейшего развития!

Чтобы подготовиться к производству, вам нужно перевести свою базу данных с работы в SQLite на что-то, что может масштабироваться немного лучше. Для простоты вы останетесь с реляционной базой данных и переключите свое приложение на использование MySQL. Но как запустить MySQL? Как позволить контейнерам общаться друг с другом? Об этом вы узнаете далее!

Мультиконтейнерные приложения