Docker — это инструмент для создания, развертывания и управления контейнерами, которые представляют собой легковесные и изолированные среды для запуска приложений. Контейнеризация позволяет упаковать приложение и все его зависимости в единый объект, который можно запускать на любой системе, где установлен Docker.
Контейнеры — это не виртуальные машины. Они используют ядро операционной системы хоста, что позволяет им быть более легковесными и быстрыми в запуске, в отличие от виртуальных машин, которые требуют собственное ядро. Это делает контейнеры идеальными для разработки, тестирования и развертывания приложений.
Для начала работы с Docker необходимо установить сам инструмент. Он доступен для всех основных операционных систем: Windows, macOS и Linux. Процесс установки можно разделить на несколько шагов:
Скачивание Docker: Для Windows и macOS Docker предоставляет инсталлятор, который можно загрузить с официального сайта. Для Linux рекомендуется использовать пакетный менеджер соответствующей операционной системы.
Установка: После скачивания инсталлятора для Windows или macOS нужно просто следовать инструкциям на экране. Для Linux, в зависимости от дистрибутива, установка может варьироваться. Например, на Ubuntu установка может быть выполнена с помощью команды:
sudo apt-get install docker-ce docker-ce-cli containerd.ioПроверка установки: После завершения установки можно проверить, работает ли Docker, с помощью команды:
docker --version
Это покажет версию Docker, что подтвердит его успешную установку.
Контейнер — это изолированная среда, в которой запускается приложение. Контейнеры обеспечивают:
Контейнеры обычно создаются на основе образов. Образ представляет собой набор файлов, метаданных и инструкций, которые описывают, как создать контейнер. Например, образ может содержать все зависимости для запуска веб-приложения.
Образ Docker — это заготовка, на основе которой создаются контейнеры. Он включает все необходимые файлы и зависимости для приложения. Образы можно создавать вручную с помощью Dockerfile или использовать уже готовые образы из Docker Hub.
Пример Dockerfile для создания образа Node.js приложения:
FROM node:14
WORKDIR /app
COPY . .
RUN npm install
CMD ["npm", "start"]
Этот Dockerfile делает следующее:
node:14 в качестве
базового.npm install.npm start.Создать образ из этого Dockerfile можно с помощью команды:
docker build -t my-node-app .
Docker Hub — это публичный репозиторий образов, где можно найти готовые образы для большинства популярных технологий (Node.js, Python, MySQL и других). Для загрузки образа из Docker Hub используется команда:
docker pull node:14
Это загрузит образ Node.js версии 14 с Docker Hub.
Docker Compose — это инструмент для работы с многоконтейнерными приложениями. Он позволяет описать все контейнеры, их конфигурацию и связи между ними в одном YAML файле.
Пример docker-compose.yml файла для Node.js и базы
данных MongoDB:
version: '3'
services:
web:
build: .
ports:
- "3000:3000"
db:
image: mongo
volumes:
- ./data/db:/data/db
В этом примере:
web — это сервис, который строится на основе Dockerfile
в текущем каталоге.db — это сервис, использующий официальный образ MongoDB
с монтированием локальной папки для хранения данных.Запуск всех сервисов в проекте выполняется одной командой:
docker-compose up
Для того чтобы запустить контейнер из образа, используется команда:
docker run <опции> <образ>
Пример запуска контейнера с веб-приложением:
docker run -d -p 3000:3000 my-node-app
Этот пример запускает контейнер в фоновом режиме (-d), а
также пробрасывает порт 3000 контейнера на порт 3000 хоста
(-p 3000:3000).
Для просмотра всех запущенных контейнеров используется команда:
docker ps
Если нужно увидеть все контейнеры, включая остановленные, применяется
флаг -a:
docker ps -a
Остановить контейнер можно с помощью команды:
docker stop <идентификатор_контейнера>
Чтобы удалить остановленный контейнер, используется команда:
docker rm <идентификатор_контейнера>
Удалить контейнер можно и в процессе его работы, но для этого нужно сначала остановить его.
Docker позволяет создавать сети и тома для взаимодействия контейнеров между собой и для хранения данных.
Docker создает сети для контейнеров, позволяя им общаться друг с другом. Например, можно создать сеть и подключить несколько контейнеров к ней:
docker network create my-network
docker run --network my-network --name container1 my-image
docker run --network my-network --name container2 my-image
Тома используются для хранения данных, которые должны быть доступны даже после удаления контейнера. Пример создания и использования тома:
docker volume create my-volume
docker run -v my-volume:/data my-image
В этом примере данные из контейнера будут храниться в томе, и они останутся доступными, даже если контейнер будет удален.
Оптимизация Dockerfile: Чтобы сократить время
сборки и размер образов, следует минимизировать количество слоев и
избегать ненужных установок. Например, лучше объединять несколько команд
RUN в одну, используя &&:
RUN apt-get update && apt-get install -y package1 package2Использование .dockerignore:
Подобно .gitignore, файл .dockerignore
позволяет исключать из образа файлы, которые не нужны в контейнере
(например, node_modules, временные файлы).
Многоступенчатая сборка: Многоступенчатая сборка позволяет создавать образы с меньшим размером, разделяя этапы сборки и деплоя. Пример:
# Этап сборки
FROM node:14 AS build
WORKDIR /app
COPY . .
RUN npm install
RUN npm run build
# Этап продакшн
FROM node:14
WORKDIR /app
COPY --from=build /app/build /app
CMD ["npm", "start"]Этот подход помогает избежать включения в конечный образ лишних файлов, таких как исходный код и инструменты для сборки.
Использование переменных окружения: Для конфиденциальной информации или настроек, которые могут меняться в разных средах, полезно использовать переменные окружения. Пример:
ENV NODE_ENV=productionЧтобы работать с конкретными версиями образов, можно указывать их тег, например:
docker pull node:14
Здесь node:14 указывает на образ Node.js версии 14. Без
тега будет загружена последняя версия образа.
Для более сложных случаев можно использовать теги и репозитории для управления версиями и создания различных вариантов образов.