Пошаговое создание Docker образов

DockerBeginner
Практиковаться сейчас

Введение

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

Основы образов Docker

Что такое образы Docker?

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

Ключевые компоненты образов Docker

graph TD A[Образ Docker] --> B[Базовый слой] A --> C[Слой приложения] A --> D[Слой конфигурации]
Компонент Описание Пример
Базовый слой Основная операционная система Ubuntu 22.04
Слой приложения Программное обеспечение и зависимости Python 3.9, nginx
Слой конфигурации Параметры выполнения Переменные окружения

Создание базового образа Docker

Вот пример создания простого образа веб-приложения на Python:

## Создать директорию проекта
mkdir docker-demo
cd docker-demo

## Создать Dockerfile
touch Dockerfile

## Содержимое Dockerfile
cat > Dockerfile << EOL
FROM ubuntu:22.04
RUN apt-get update && apt-get install -y python3 python3-pip
WORKDIR /app
COPY app.py .
RUN pip3 install flask
EXPOSE 5000
CMD ["python3", "app.py"]
EOL

## Создать пример приложения Flask
cat > app.py << EOL
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    return "Пример образа Docker"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
EOL

## Собрать образ Docker
docker build -t python-web-app .

Слои образов и хранение

Образы Docker состоят из нескольких слоев только для чтения. Каждая команда в Dockerfile создает новый слой, что обеспечивает эффективное хранение и быстрое создание образов. При сборке образа Docker кеширует эти слои для оптимизации времени сборки и уменьшения использования дискового пространства.

Идентификация образов

Образы Docker уникально идентифицируются по:

  • Имени репозитория
  • Тегу
  • Идентификатору образа

Пример: ubuntu:22.04 или python-web-app:latest

Создание образов Docker

Dockerfile: Чертеж для создания образа

Dockerfile — это текстовый файл, содержащий инструкции для создания образа Docker. Каждая инструкция создаёт новый слой в образе, определяя среду, зависимости и конфигурацию приложения.

graph TD A[Dockerfile] --> B[Базовый образ] A --> C[Установка зависимостей] A --> D[Копирование кода приложения] A --> E[Настройка среды выполнения]

Типы инструкций Dockerfile

Инструкция Назначение Пример
FROM Указать базовый образ FROM ubuntu:22.04
RUN Выполнить команды RUN apt-get update
COPY Скопировать файлы в образ COPY app/ /application
WORKDIR Установить рабочую директорию WORKDIR /app
EXPOSE Определить сетевые порты EXPOSE 8080
CMD Команда по умолчанию для контейнера CMD ["python", "app.py"]

Практический пример создания образа Docker

## Создать структуру проекта
mkdir -p /tmp/docker-nodejs-app
cd /tmp/docker-nodejs-app

## Создать Dockerfile
cat > Dockerfile << EOL
FROM node:16-alpine
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
EOL

## Создать package.json
cat > package.json << EOL
{
  "name": "nodejs-docker-app",
  "version": "1.0.0",
  "dependencies": {
    "express": "^4.17.1"
  }
}
EOL

## Создать простое приложение Express
cat > server.js << EOL
const express = require('express');
const app = express();
const PORT = 3000;

app.get('/', (req, res) => {
  res.send('Пример создания образа Docker');
});

app.listen(PORT, () => {
  console.log($(Сервер запущен на порту ${PORT}));
});
EOL

## Собрать образ Docker
docker build -t nodejs-web-app .

## Проверить создание образа
docker images

Контекст сборки образа

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

Многоэтапная сборка

Многоэтапная сборка позволяет создавать более компактные и эффективные образы, используя несколько инструкций FROM в одном Dockerfile, разделяя зависимости времени сборки и среды выполнения.

Методы управления образами

Стратегии оптимизации образов Docker

Эффективное управление образами включает уменьшение размера образа, минимизацию количества слоёв и применение лучших практик для создания и хранения образов.

graph TD A[Управление образами] --> B[Сокращение размера] A --> C[Оптимизация слоёв] A --> D[Версионирование образов] A --> E[Управление реестром]

Методы сокращения размера образа

Метод Описание Пример
Образы Alpine Минимальное дистрибутив Linux FROM alpine:3.15
Многоэтапная сборка Разделение сред сборки и выполнения Несколько инструкций FROM
.dockerignore Исключение ненужных файлов Предотвращение передачи больших файлов

Управление жизненным циклом образа Docker

## Список локальных образов
docker images

## Удаление неиспользуемых образов
docker image prune

## Разметка и версия образов
docker tag original-image:latest myregistry/image:v1.0

## Загрузка в реестр Docker
docker push myregistry/image:v1.0

## Скачивание определённой версии образа
docker pull myregistry/image:v1.0

Пример продвинутой оптимизации образа

## Создание оптимизированного Dockerfile
cat > Dockerfile << EOL
## Многоэтапная сборка для приложения Python
FROM python:3.9-alpine AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

FROM python:3.9-alpine
WORKDIR /app
COPY --from=builder /usr/local/lib/python3.9/site-packages /usr/local/lib/python3.9/site-packages
COPY . .
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser
CMD ["python", "app.py"]
EOL

## Создание файла requirements
cat > requirements.txt << EOL
flask==2.1.0
gunicorn==20.1.0
EOL

## Сборка оптимизированного образа
docker build -t optimized-python-app:slim .

## Анализ размера образа
docker images | grep optimized-python-app

Управление реестром Docker

Реестры Docker предоставляют централизованное хранилище и распространение образов. Они поддерживают версионирование, контроль доступа и эффективное совместное использование образов между командами разработчиков и средами.

Кэширование слоёв образа

Docker кэширует слои образов для ускорения последующих сборок. Порядок инструкций Dockerfile от наименее до наиболее часто изменяемых минимизирует время пересборки и оптимизирует процесс создания образа.

Резюме

Образы Docker являются основополагающим элементом современной развертывания программного обеспечения, предлагая согласованный и эффективный способ упаковки приложений вместе с их зависимостями. Овладение техниками создания образов, понимание механики слоёв и использование инструкций Dockerfile позволяет разработчикам оптимизировать рабочие процессы разработки и гарантировать надёжные и переносимые среды приложений на различных системах.