Найти в Дзене
QA & DevOps Infinity

Полное руководство по Docker: Dockerfile и Docker Compose

Docker — это инструмент для контейнеризации, который позволяет создавать, развертывать и управлять приложениями в изолированных средах. Это руководство подробно объясняет создание и настройку Dockerfile и Docker Compose, описывает их структуру и ключевые аспекты настройки. Dockerfile — это текстовый файл, содержащий последовательность инструкций для сборки Docker-образа. Каждая строка в Dockerfile — это команда для Docker. Стандартная структура Dockerfile включает: 1. FROM
Указывает базовый образ, с которого начинается сборка. FROM ubuntu:20.04 2. LABEL
Добавляет метаданные к образу. LABEL maintainer="dev@example.com" LABEL version="1.0" LABEL description="Этот образ для тестирования Docker." 3. RUN
Выполняет команды в контейнере на этапе сборки. RUN apt update && apt install -y nginx 4. COPY
Копирует файлы или папки из хоста в контейнер. COPY index.html /usr/share/nginx/html/ 5. ADD
Копирует файлы или папки, а также поддерживает распаковку архивов. ADD app.tar.gz /app 6. WORKDIR
Уста
Оглавление

Docker — это инструмент для контейнеризации, который позволяет создавать, развертывать и управлять приложениями в изолированных средах. Это руководство подробно объясняет создание и настройку Dockerfile и Docker Compose, описывает их структуру и ключевые аспекты настройки.

1. Dockerfile

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

1.1 Структура Dockerfile

Стандартная структура Dockerfile включает:

  1. Базовый образ (FROM).
  2. Выполнение команд в контейнере (RUN).
  3. Копирование файлов из хоста в контейнер (COPY, ADD).
  4. Настройка окружения (ENV, ARG).
  5. Установка рабочей директории (WORKDIR).
  6. Указание команды запуска контейнера (CMD, ENTRYPOINT).
  7. Открытие портов (EXPOSE).
  8. Опциональные метаданные (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

Файл состоит из следующих разделов:

  1. version — версия Docker Compose.
  2. services — описание сервисов (контейнеров).
  3. volumes — описание томов для хранения данных.
  4. 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 Тонкости настройки

  1. Секреты и конфигурации:
    Используйте файлы .env для хранения переменных окружения.
    environment:
    - POSTGRES_PASSWORD=${DB_PASSWORD}

    Создайте файл
    .env:
    DB_PASSWORD=mysecurepassword
  2. Многосервисные приложения:
    Разделяйте логику на разные сервисы (например, веб-сервер, база данных, кэш).
  3. Сети:
    Контейнеры в одной сети могут обращаться друг к другу по имени сервиса (например, db).