Разверните проект NodeJS + MongoDB с помощью Docker

внешний интерфейс

Недавнее изучение Docker и повторное развертывание с помощью Dockercdfang-spiderДля проектов использование докера действительно значительно снизило сложность развертывания. Если вы также хотите использовать Docker для развертывания собственных проектов, давайте рассмотрим ниже.

В этой статье о Docker рассказывается с точки зрения следующих трех аспектов:

  • История докера.
  • Основы докера.
  • Проект Docker в действии.

История докера

древние времена

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

  • Развертывание очень медленное.
    • От покупки физического сервера до его получения требуется время.
    • Установка операционной системы вручную требует времени.
    • Установка приложения и соответствующей среды требует времени.
  • Стоимость очень высока.
    • Физические серверы стоят дорого.
  • Пустая трата ресурсов.
    • Если проект небольшой, ресурсы этого сервера не могут быть использованы полностью.
  • Трудно мигрировать и расширяться.
    • Если ЦП, памяти и жесткого диска недостаточно, можно добавить только физические устройства, но это имеет верхний предел.
  • Может быть ограничен производителями оборудования.

Эпоха виртуализации

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

Виртуальная технология имеет следующие характеристики:

  • Ресурсы физической машины распределяются между разными виртуальными машинами.
  • Его легко расширить, добавить физическую машину/виртуальную машину.
  • Облако легко сделать, Alibaba Cloud, AWS и т. д.

Технология виртуализации реализуетИзоляция физического уровня, но остаются следующие проблемы:

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

Эпоха контейнеризации

Для более удобного развертывания проектов появилась технология контейнеризации, которая в основном имеет следующие характеристики:

  • Реализует упаковку приложения и его окружения.
  • Приложения изолированы друг от друга и используют одно и то же ядро ​​операционной системы.
  • Сам контейнер относительно легкий и занимает меньше системных ресурсов, чем виртуальные машины.

Docker — одна из технологий контейнеризации и одна из самых популярных. Docker предоставляет механизм изоляции, который упаковывает зависимости и библиотеки разных приложений вместе для запуска в разных контейнерах, что позволяетИзоляция прикладного уровня.

Технология контейнеризации в основном основана на двух механизмах, предоставляемых ядром Linux: Cgroups (для обеспечения выделения ресурсов по запросу) и Namespace (для достижения изоляции задач).

Виртуализация против контейнеризации

И виртуализация, и контейнеризация в настоящее время являются основными технологиями развертывания. Различия между ними заключаются в следующем:

  • Технология виртуальных машин разрабатывалась много лет, поддерживающие технологии и стандарты были стандартизированы, однако контейнеры появились только в последние годы, а поддерживающие технологии и стандарты все еще совершенствуются.
  • Из-за существования GuestOS (операционная система виртуальной машины) виртуальная машина может работать под управлением ОС, отличной от хоста, в то время как контейнер может поддерживать только ту же операционную систему, что и ядро ​​хоста, а изоляция относительно плохая.
  • Контейнеры значительно легче, чем виртуальные машины.Для основной операционной системы контейнер похож на процесс. Таким образом, контейнеры имеют преимущества более быстрой скорости запуска и более удобного управления кластером. При этом из-за отсутствия GuestOS потери производительности при запуске приложений в контейнерах и непосредственно на хосте почти нет, и производительность лучше, чем у виртуальных машин.

Основы докера

Суть Docker заключается в обеспечении изоляции прикладного уровня на уровне Docker Engine.

Многослойность докера
Приложение (прикладной уровень)
Контейнер (контейнерный слой)
Механизм Docker (уровень изоляции)
Операционная система хост-ОС
инфраструктура

Докер разделен на две части: Клиент и Сервер, Мы выполняем команды Докера в Клиенте, а Контейнер и Образ, созданные в конце, будут работать в Сервере. Архитектура Docker показана на следующем рисунке:

Docker 架构

Image

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

Изображение имеет следующие характеристики:

  • Коллекция файлов и метаданных (корневая файловая система).
  • Многоуровневый, и каждый слой может добавлять, изменять и удалять файлы, чтобы стать новым изображением.
  • Различные изображения могут использовать один и тот же базовый слой.
  • Само изображение доступно только для чтения.

Образ можно собрать через Dockerfile или загрузить через DockerHub.

Dockerfile — это текстовый файл, содержащий все команды для создания образа. Докер может бытьdocker buildПрочитайте команды из Dockerfile для автоматической сборки образа. Общая информация о конфигурации может относиться к комментариям в файле Dockerfile ниже, а также рекомендуется прочитать официальную документацию.Dockerfile reference.

Container

Контейнер — это экземпляр запуска образа черезdocker run imageКонтейнер запущен и работает.

Контейнер в основном имеет следующие характеристики:

  • Создано с изображением.
  • Создайте слой контейнера (чтение и запись) поверх изображения.
  • Аналогия объектно-ориентированного: класс (изображение) и экземпляр (контейнер).
  • Образ отвечает за хранение и распространение Приложения, а Контейнер отвечает за запуск Приложения.

Networks

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

В Docker встроено 5 типов сетей:

  • мост (контейнеры в одном мосту могут обращаться друг к другу).
  • host (подключает контейнер к сети хоста, хоть и очень прямо, но нарушает изоляцию контейнера).
  • none отключает все сети.
  • Используется оверлейными кластерами.
  • маквлан.

В дополнение к этим 5 сетям пользователи также могут настроить сетевой плагин.

Docker Compose

Docker Compose — это инструмент, который может определять многоконтейнерные приложения Docker через файл yml. С помощью одной команды вы можете создавать несколько контейнеров или управлять ими в соответствии с определением файла yml. Затем используйте командную строку и Docker Compose, чтобы сравнить способ создания контейнеров.

Создайте контейнер без Docker Compose

docker pull lmjben/cdfang-spider
docker pull mongo
docker network create webapp-network
docker run -d --network webapp-network -v ~/data/db:/data/db mongo
docker run -p 8082:8082 --network webapp-network -d lmjben/cdfang-spider

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

Создайте контейнер с помощью Docker Compose.

1. Создайте новый файл docker-compose.yml.

version: '3.7'
services:
  database:
    image: mongo
    restart: always
    volumes:
      - ~/data/db:/data/db
    networks:
      - webapp-network
  web:
    image: yhlben/cdfang-spider
    depends_on:
      - database
    ports:
      - 8082:8082
    networks:
      - webapp-network
networks:
  webapp-network:
    driver: bridge

2. Запустите docker-compose

docker-compose up -d

Видно, что с помощью Docker Compose для создания контейнера нужно только заранее написать yml-файл, а затем выполнить команду, что удобнее, чем набирать команды вручную.

В дополнение к этому Docker Compose также может использоватьdocker-compose -scaleРасширьте несколько совместимых контейнеров для достижения балансировки нагрузки, которую можно увеличить или уменьшить. Например, чтобы реализовать проект бесшовного развертывания, сначала разверните новый Контейнер, при запуске Контейнера добавьте его в кластер, затем обновите старый контейнер, а затем присоединитесь к кластеру после завершения обновления.

Конфигурация Docker Compose

Файлы конфигурации Docker Compose обычно определяются вdocker-compose.ymlВ файле основные элементы конфигурации следующие:

  • services
    • Служба представляет собой контейнер. Этот контейнер можно создать из образа в dockerHub или с помощью образа, созданного локальным файлом docker.
    • Запуск службы аналогиченdocker run, вы можете указать сетевые и томные ссылки на службу.
  • networks
    • Define network , что эквивалентно выполнениюdocker network create xxxx.
  • volumes
    • Определите volume , что эквивалентно выполнениюdocker volume create xxx.

Дополнительные элементы конфигурации могут относиться кСоставной файл официальной документации

Докер-проект в действии

Далее сcdfang-spiderНапример, используйте Docker для развертывания проекта.

Полное ручное развертывание

1. Напишите Dockerfile.

# 加载基础镜像
FROM mhart/alpine-node

# 注释
LABEL maintainer = "lmjben <yinhengliben@gmail.com>"

# 创建工作目录
RUN rm -rf /app
RUN mkdir /app
WORKDIR /app

# 安装项目依赖
COPY . /app
RUN npm install
RUN npm run build
RUN mv ./dist/* ./

# 对外暴露端口
EXPOSE 8082

# 启动 Image 时执行命令
CMD BUILD_ENV=docker node app.js

2. Создайте образ с помощью файла Dockerfile.

docker build -t lmjben/cdfang-spider .

3. Загрузите официальный образ mongo.

docker pull mongo

4. Создайте сеть, чтобы два контейнера могли взаимодействовать друг с другом.

docker network create webapp-network

5. Запустите контейнер

docker run -d --network webapp-network -v ~/data/db:/data/db mongo
docker run -p 8082:8082 --network webapp-network -d lmjben/cdfang-spider

6. Получите доступ к проекту, посетив localhost:8082.

Автоматическое развертывание

1. Напишите Dockerfile.

# 加载基础镜像
FROM mhart/alpine-node

# 注释
LABEL maintainer = "lmjben <yinhengliben@gmail.com>"

# 创建工作目录
RUN rm -rf /app
RUN mkdir /app
WORKDIR /app

# 安装项目依赖
COPY . /app
RUN npm install
RUN npm run build
RUN mv ./dist/* ./

# 对外暴露端口
EXPOSE 8082

# 启动 Image 时执行命令
CMD BUILD_ENV=docker node app.js

2. Авторизуйте проект github на dockerHub, чтобы при обновлении проекта github Dockerfile автоматически выполнялся для сборки, а результат сборки сохранялся в репозиторий dockerHub.

3. Напишите файл docker-compose.yml.

version: '3.7'
services:
  database:
    image: mongo
    restart: always
    volumes:
      - ~/data/db:/data/db
    networks:
      - webapp-network
  web:
    image: yhlben/cdfang-spider
    depends_on:
      - database
    ports:
      - 8082:8082
    networks:
      - webapp-network
networks:
  webapp-network:
    driver: bridge

4. Запуск в один клик, чтобы убедиться, что docker-compose установлен.

docker-compose up -d

5. Получите доступ к проекту, посетив localhost:8082.

Суммировать

После развертывания проекта через Docker чувствую себя очень хорошо, в основном разделившись на следующие моменты:

  • Запустите свой проект одним щелчком мыши, используя Docker Compose.
  • Больше нет необходимости устанавливать на сервер разные разные окружения.Все они инкапсулированы в Образ, и Контейнер можно запускать.Просто удалите Контейнер, когда он не используется, и сервер не будет загрязнён.
  • Для трудоемкого процесса создания образа он напрямую передается в dockerHub для автоматического построения.

Наконец, прикрепите адрес исходного кода проекта:cdfang-spider

В этом проекте используется одномашинное развертывание, то есть все контейнеры находятся на одном сервере. Кроме того, docker также поддерживает распределенное развертывание контейнеров, которым можно управлять с помощью docker swarm или kubernetes. В настоящее время я все еще учусь. Я постараюсь организовать его и поделиться им с вами как можно скорее. Спасибо за вашу поддержку!