Докеризация вашего приложения: Знакомство с Docker

Докеризация вашего приложения: Знакомство с Docker

Представьте себе такой сценарий: вы закончили разработку приложения и готовы развернуть его на удаленной машине. Однако вы обнаруживаете, что дистрибутив сервера не является Ubuntu или CentOS, с которыми вы хорошо знакомы. Более того, чтобы запустить приложение, вы должны сначала вручную установить системные зависимости, такие как Node.js и MongoDB. Это может быть довольно хлопотно! Сейчас идеальный момент для использования Docker.

Docker поможет вам упаковать среду Ubuntu + Node14 + MongoDB с вашим JS-кодом в один образ. Таким образом, вы сможете легко запустить весь образ на удаленном сервере, не беспокоясь о проблемах с окружением.

Что такое Docker

Docker - это легкая технология виртуализации, которая позволяет легко упаковать ваше приложение и его окружение в образ, так что вам больше не придется беспокоиться о проблемах с окружением.

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

Пример использования Docker

Давайте попробуем использовать Docker

Установите Docker

Docker может быть запущен на Linux, macOS и Windows. Вы можете перейти на страницу “Get Docker” и получить версию, совместимую с вашей ОС. После установки Docker вы можете выполнить команду docker run hello-world, чтобы убедиться, что Docker установлен правильно.

Docker helloworld

Создание среды Ubuntu с помощью Docker

Docker позволяет легко получить нужное вам окружение. Например, если вам в данный момент нужна среда Ubuntu Bash, вы можете сначала получить образ Ubuntu из Docker Hub.

docker pull ubuntu
docker image ls
образ ubuntu

После подготовки образа ubuntu можно запустить процесс Bash в контейнере Ubuntu. Опция -it включает интерактивный режим в контейнере, что позволяет нам выполнять команды в Bash.

docker run -it ubuntu bash

После входа в контейнер можно выполнить команду cat /etc/*release, чтобы увидеть версию Ubuntu, которая на моей стороне составляет 22.04.2 LTS.

версия ubuntu

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

В общем, Docker позволяет вам получить желаемое окружение. Далее я расскажу вам, как упаковать ваше приложение с нужным вам окружением.

Как упаковать в Docker существующее приложение

Dockerize означает упаковать приложение и окружение в образ Docker. После установки Docker на целевой машине вы можете просто запустить образ для развертывания приложения.

В этом посте я покажу, как докеризировать приложение Node.js под названием simple-express-server. Приложение представляет собой HTTP-сервер, который прослушивает порт 8080 и при обращении к нему отвечает “Hello World!”.

Шаг 0 - Создание Docker-файла

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

simple-express-server
├── Dockerfile  <--  HERE
├── README.md
├── index.js
├── node_modules
└── package.json

Шаг 1 - Найти подходящий базовый образ

Образ Docker строится слой за слоем, поэтому нам нужно найти подходящий базовый образ на Docker Hub, а затем переработать его в нужный нам образ.

слои изображение

Поскольку проект написан на Node.js, нам нужно найти окружение Node.js на Docker Hub. Мы можем найти официальный образ Node на Docker Hub, выполнив поиск по запросу “Node.js”.

Если вы хотите докеризировать приложение, написанное на других языках, вы можете легко найти соответствующий образ для Python, Golang и т.д.

Определившись с базовым образом, мы должны выбрать для него версию. В данном случае мы используем node:18.15. Если вы предпочитаете использовать последнюю версию, вы можете указать node:latest.

# Dockerfile
FROM node:18.15

Шаг 2 - Скопируйте исходный код в изображение

После настройки среды Node.js следующим шагом будет копирование всего необходимого исходного кода в образ. Для этого мы воспользуемся командой COPY, чтобы скопировать index.js и package.json в каталог /app внутри контейнера.

FROM node:18.15
COPY index.js package.json /app/

Шаг 3 - Установка зависимостей

После того как мы получили окружение и исходный код в образе, нам нужно перейти в каталог /app и установить зависимости.

Сначала мы используем команду WORKDIR для перехода в каталог /app, а затем выполним команду npm install && npm cache clean —force. Цель очистки кэша - минимизировать размер результирующего образа.

Если вы пишете на других языках, вы можете заменить npm install соответствующей командой, например pip install, для установки зависимостей.

WORKDIR /app
RUN npm install && npm cache clean --force

Шаг 4 - Укажите начальную команду

После подготовки среды, исходного кода и зависимостей, последним шагом является выполнение программы. Для этого мы используем CMD, чтобы указать начальную команду. Поскольку это приложение Node.js требует запуска node index.js, мы запишем эту команду в Dockerfile.

FROM node:18.15
COPY index.js package.json /app/
WORKDIR /app
RUN npm install && npm cache clean --force
CMD node index.js

Шаг 5 - Сборка образа

После завершения создания Dockerfile мы можем использовать команду docker build -t simple-express-server . для сборки образа из Dockerfile.

создать образ

После завершения процесса сборки вы можете запустить команду docker image ls для просмотра образа с именем simple-express-server. Образ содержит среду Node.js, код приложения, зависимости и команду init.

Запуск образа на ноутбуке

После подготовки образа мы можем запустить контейнер, выполнив команду docker run -p 3000:8080 simple-express-server. Внутри контейнера будет выполнена команда node index.js. Опция -p 3000:8080 соединяет порт 3000 на ноутбуке с портом 8080 в контейнере, чтобы мы могли получить доступ к серверу API на 127.0.0.1:3000.

После докеризации приложения мы можем запустить API-сервер без необходимости установки Node.js. Docker - это все, что нам нужно!

Запуск в фоновом режиме

Поскольку команда previous будет блокировать терминал, вы можете добавить опцию -d для запуска контейнера в фоновом режиме. Выполнив команду docker run -d , вы получите идентификатор контейнера. Если вы хотите просмотреть журналы контейнера, просто выполните команду docker logs -f <container ID>.

Резюме

Эта заметка охватывает фундаментальные концепции Docker и предоставляет руководство по докеризации существующего приложения Node.js. Если вы хотите узнать больше о командах Docker, вы можете ознакомиться с базовой справкой по командам и Dockerfile.

Это первый пост из серии статей о Docker. В следующих постах я расскажу о таких темах, как docker-compose, docker swarm и Kubernetes. Пожалуйста, следите за мной, если вам интересно узнать о Docker. Спасибо!