Введение
Это исчерпывающее руководство по 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 позволяет разработчикам оптимизировать рабочие процессы разработки и гарантировать надёжные и переносимые среды приложений на различных системах.



