Демистификация Docker (6 серии деталей)
Это пятый пост в моем Демистификация докера ряд. Я покажу вам, как вы можете использовать Docker при работе с Mern Stack . Вам нужно будет знать основы контейнеры , тома и Сеть с Docker Чтобы понять этот пост. Так что, если вы не знаете о них, я настоятельно рекомендую вам проверить другие сообщения. С этим давай начнем.
Я покажу вам Dockerfiles, которые вам нужно будет написать, и команды, которые вы будете использовать, чтобы раскрутить ваши контейнеры и объяснить их шаг за шагом в следующем порядке:
- База данных
- Бэкэнд
- Внешний интерфейс
Обратите внимание, что это будет настройка разработки с Docker, а не настройка производства, потому что мы будем настраивать вещи таким образом, чтобы предоставить нам столь необходимые функции разработки, такие как живое обновление нашего приложения, когда изменения будут внесены в код. Я расскажу, как настроить Docker для производства и развертывания в будущем посте.
Давай начнем!
Начальная настройка
Прежде чем мы начнем с чего -либо, позвольте нам создать сеть, которая поможет нашим контейнерам легко взаимодействовать друг с другом.
docker network create mern-net
База данных
Нам не понадобится Dockerfile для MongoDB, так как мы будем захватывать официальное изображение с Docker Hub . Это официальное изображение также дает нам две дополнительные переменные среды, которые мы можем передать, чтобы ограничить доступ к нашей базе данных. Это Mongo_initdb_root_username
и Mongo_initdb_root_password
.
Всякий раз, когда какой -то контейнер захочет подключиться к этому запущенному контейнеру MongoDB, ему придется использовать имя пользователя и пароль, которые мы указываем здесь. Кроме того, мы также настроим именованный объем, чтобы даже если вы удалите этот контейнер MongoDB и запустите новый, наши ранее хранимые данные не потеряны. Принять все это во внимание, наша последняя команда для запуска контейнера будет:
docker run --name mongodb -v data:/data/db --rm -d --network mern-net -e MONGO_INITDB_ROOT_USERNAME=arsh -e MONGO_INITDB_ROOT_PASSWORD=pass123 mongo
Здесь,
Mongo
Имя изображения, которое мы берем из Docker Hubmongodb
это имя, которое мы даем этому контейнеру/data/db
это Путь Где данные хранятся в этом контейнере.--rm
Флаг говорит Docker удалить контейнер, если мы остановим его.-Д
Флаг говорит Docker запустить контейнер в Отдельный режим Анкет
Бэкэнд
Для бэкэнда нам понадобится Dockerfile, который будет выглядеть так:
FROM node WORKDIR /app COPY package.json . RUN npm install COPY . . EXPOSE 80 ENV MONGODB_USERNAME=root ENV MONGODB_PASSWORD=pass CMD ["npm", "start"]
Чтобы наши изменения были автоматически отражаться в бэкэнд с контейнерами, нам также необходимо добавить Nodemon
как зависимость и создать старт
сценарий Итак, Package.json
будет выглядеть примерно так:
"scripts": { "test": "echo \"Error: no test specified\" && exit 1", "start": "nodemon app.js" }, "devDependencies": { "nodemon": "^2.0.4" }
Внутри нашего кода нам также пришлось бы изменить строку подключения Docker, чтобы указать имя пользователя и пароль из переменных среды. Строка подключения должна выглядеть примерно так:
mongodb://${process.env.MONGODB_USERNAME}:${process.env.MONGODB_PASSWORD}@mongodb:27017/mern-project?authSource=admin
Не забудьте добавить ? Authsource = Admin
В конце строки, если ее еще нет.
И наша последняя команда запуска контейнера была бы:
docker run --name mern-backend -v /home/arsh/docker-examples/mern-app/backend:/app -v /app/node_modules -e MONGODB_USERNAME=arsh -e MONGODB_PASSWORD=pass123 -d --rm -p 80:80 --network mern-net mern-node:latest
Объяснение:
Мы использовали крепление для привязки, чтобы создать ссылку с нашим кодом внутри контейнера, чтобы последние изменения в коде были автоматически выявлены. Мы также использовали анонимный том, чтобы при использовании привязки монтажа нашего
node_modules
Папка не теряется. (подробно объяснено в третьем посте ) Нам нужно передать переменные средыMongodb_username
и
Mongodb_password, значения по умолчанию, для которых мы указали в DockerFile как
кореньи
Пасссоответственно. Они будут подключены к строке соединения MongoDB, присутствующей в нашем коде.
Мы опубликовали Post 80 (на котором работает наше приложение), так как это будет использоваться Frontend для взаимодействия с бэкэнд. Мы не будем использовать нашу Docker Network для соединения между Frontend и поддержкой, поэтому нам нужно опубликовать порт.Нам нужно использовать имя нашего базы данных (
mongodb
) в строке подключения и указать
Mern-NetworkПри запуске этого контейнера, чтобы наш бэкэнд мог взаимодействовать с базой данных.
Mern-Node: последнийСледует заменить на то, что вы назвали своему изображению, создавая его из Dockerfile.
Внешний интерфейс
Для фронта, наш Dockerfile должен выглядеть так:
FROM node WORKDIR /app COPY package.json . RUN npm install COPY . . EXPOSE 3000 CMD [ "npm", "start" ]
И мы запустим следующую команду, чтобы начать это:
docker run -v /home/arsh/docker-examples/mern-app/frontend/src:/app/src --name mern-frontend --rm -p 3000:3000 -it mern-react
Объяснение:
Мы используем крепление привязки, чтобы изменения в нашем коде автоматически отражались в контейнере для работы с блюдом.
Мы публикуем порт 3000 и будем использовать его для взаимодействия с нашим приложением из браузера. Мы не добавляем фронт в нашем
Mern-Network
Так как код для него выполняется в браузере. Было бы невозможно взаимодействовать через Localhost, если бы мы добавим его в нашу сеть Docker. И поскольку он не является частью сети Docker, мы опубликовалиПорт 80
При запуске бэкэнд -контейнера.Требуется, чтобы контейнер для фронта был запущен в Интерактивный режим , поэтому мы также используем
-it
флаг. Это связано с тем, какCreate-React-App
работает.Mern-React
Может быть заменен на то, что вы назвали своему изображению, когда строили его из Dockerfile.
Вывод
При этом мы закончили, что приложение Mern. Посетите https://localhost: 3000
Чтобы взаимодействовать с вашим функционирующим кодом!
Спасибо за чтение: D
Если у вас есть какие -либо отзывы для меня или просто хотите поговорить, не стесняйтесь общаться со мной на Twitter Анкет Я буду более чем рад вам помочь!:)
Демистификация Docker (6 серии деталей)
Оригинал: «https://dev.to/rinkiyakedad/dockerizing-the-mern-stack-without-docker-compose-17m6»