Docker — это инструмент для контейнеризации, который позволяет создавать, развертывать и управлять приложениями в изолированных средах. Это руководство подробно объясняет создание и настройку Dockerfile и Docker Compose, описывает их структуру и ключевые аспекты настройки.
1. Dockerfile
Dockerfile — это текстовый файл, содержащий последовательность инструкций для сборки Docker-образа. Каждая строка в Dockerfile — это команда для Docker.
1.1 Структура Dockerfile
Стандартная структура Dockerfile включает:
- Базовый образ (FROM).
- Выполнение команд в контейнере (RUN).
- Копирование файлов из хоста в контейнер (COPY, ADD).
- Настройка окружения (ENV, ARG).
- Установка рабочей директории (WORKDIR).
- Указание команды запуска контейнера (CMD, ENTRYPOINT).
- Открытие портов (EXPOSE).
- Опциональные метаданные (LABEL).
1.2 Подробное описание инструкций Dockerfile
1. FROM
Указывает базовый образ, с которого начинается сборка.
FROM ubuntu:20.04
- ubuntu:20.04 — базовый образ с ОС Ubuntu версии 20.04.
- Первый FROM в Dockerfile всегда обязателен.
2. LABEL
Добавляет метаданные к образу.
LABEL maintainer="dev@example.com"
LABEL version="1.0"
LABEL description="Этот образ для тестирования Docker."
- Используется для указания автора, версии образа и его описания.
3. RUN
Выполняет команды в контейнере на этапе сборки.
RUN apt update && apt install -y nginx
- apt update — обновляет индексы пакетов.
- apt install -y nginx — устанавливает веб-сервер nginx.
- Флаг -y подтверждает установку пакетов без вопросов.
4. COPY
Копирует файлы или папки из хоста в контейнер.
COPY index.html /usr/share/nginx/html/
- index.html — файл на хосте.
- /usr/share/nginx/html/ — путь внутри контейнера, куда будет скопирован файл.
5. ADD
Копирует файлы или папки, а также поддерживает распаковку архивов.
ADD app.tar.gz /app
- app.tar.gz автоматически распаковывается в директорию /app.
6. WORKDIR
Устанавливает рабочую директорию для последующих команд.
WORKDIR /app
- Все команды после этой строки будут выполняться в директории /app.
7. ENV
Устанавливает переменные окружения.
ENV APP_ENV=production
ENV APP_PORT=8080
- APP_ENV и APP_PORT доступны внутри контейнера.
8. CMD
Определяет команду, которая выполняется при запуске контейнера.
CMD ["nginx", "-g", "daemon off;"]
- Выполняет запуск веб-сервера nginx.
- Только одна инструкция CMD может быть в Dockerfile.
9. ENTRYPOINT
Задает неизменяемую команду, которая будет выполняться при запуске контейнера.
ENTRYPOINT ["/usr/sbin/nginx"]
CMD ["-g", "daemon off;"]
- ENTRYPOINT задает основную программу.
- CMD передает аргументы для ENTRYPOINT.
10. EXPOSE
Открывает порты для связи контейнера с внешним миром.
EXPOSE 80
- Контейнер будет слушать запросы на порту 80.
11. VOLUME
Создает точку монтирования для внешнего тома.
VOLUME ["/data"]
- Данные в /data сохраняются при удалении контейнера.
1.3 Полный пример Dockerfile
# Базовый образ
FROM ubuntu:20.04
# Установка метаданных
LABEL maintainer="dev@example.com"
LABEL version="1.0"
# Установка приложений
RUN apt update && apt install -y nginx
# Копирование файлов
COPY index.html /usr/share/nginx/html/
# Установка рабочей директории
WORKDIR /usr/share/nginx/html
# Установка переменных окружения
ENV APP_ENV=production
# Открытие порта
EXPOSE 80
# Команда для запуска
CMD ["nginx", "-g", "daemon off;"]
2. Docker Compose
Docker Compose — инструмент для управления многоконтейнерными приложениями.
2.1 Структура файла docker-compose.yml
Файл состоит из следующих разделов:
- version — версия Docker Compose.
- services — описание сервисов (контейнеров).
- volumes — описание томов для хранения данных.
- networks — настройка сетей для контейнеров.
2.2 Подробное описание инструкций Docker Compose
1. version
Задает версию файла.
version: '3.8'
2. services
Описывает контейнеры, которые нужно запустить.
services:
web:
image: nginx
ports:
- "8080:80"
- web — имя сервиса.
- image — образ Docker.
- ports — связывает порты хоста и контейнера.
3. volumes
Создает тома для хранения данных.
volumes:
db-data:
- Том db-data можно использовать для баз данных.
4. networks
Создает виртуальные сети для контейнеров.
networks:
my_network:
2.3 Полный пример docker-compose.yml
version: '3.8'
services:
web:
image: nginx
ports:
- "8080:80"
volumes:
- ./nginx:/etc/nginx/conf.d
networks:
- app-network
app:
build:
context: ./app
networks:
- app-network
db:
image: postgres
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: example
volumes:
- db-data:/var/lib/postgresql/data
networks:
- app-network
volumes:
db-data:
networks:
2.4 Как запустить Docker Compose
1. Создайте файл docker-compose.yml.
2. Выполните команду:
docker-compose up -d
- Флаг -d запускает контейнеры в фоновом режиме.
3. Остановите контейнеры:
docker-compose down
2.5 Тонкости настройки
- Секреты и конфигурации:
Используйте файлы .env для хранения переменных окружения.
environment:
- POSTGRES_PASSWORD=${DB_PASSWORD}
Создайте файл .env:
DB_PASSWORD=mysecurepassword - Многосервисные приложения:
Разделяйте логику на разные сервисы (например, веб-сервер, база данных, кэш). - Сети:
Контейнеры в одной сети могут обращаться друг к другу по имени сервиса (например, db).