Примеры для урока по Docker
- Упаковка любого приложения в контейнер
- Возможность быстрого тестирования
- Возможность локальной разработки
- Повышение скорости применения изменений
- Что такое Dockerfile
- Основные инстуркции Dockerfile
- Общие рекомендации по Dockerfile
- Создадим первый Docker-образ
- Текстовый файл с последовательными инструкциями для сборки образа
- Каждая инстуркция создает промежуточный слой образа
- Инструкции кэшируются в образах
- Саму сборку выполняет демон Docker, а не Docker CLI
- Инструкция FROM указывает базовый образ, на основе которого мы строим свою сборку
FROM ubuntu:latest
FROM alpine:3.4 - Инструкция LABEL задает метаданные для нашего образа
LABEL maintainer="stravnik" version="0.0.1"
- Инструкция COPY копирует файлы из текущей директории в образ
COPY src dst
COPY httpd.conf /etc/httpd/conf/ - Инструкция ADD копирует любые файлы в образ. Не рекомендуется к использованию.
- Инструкция ENV задает переменные окружения при сборке
ENV LOG_LEVEL debug
- Инструкция WORKDIR задает рабочую директория при сборке
WORKDIR path
- Инструкция VOLUME позволяет указать точки для монтирования томов внутри образа
VOLUME dst
VOLUME /app /db /data
VOLUME ["/var/www", "/var/html"] - Инструкция EXPOSE позволяет указать порты, которые слушает сервис в запущенном контейнере
EXPOSE 5000
EXPOSE 8080/tcp - Инструкция RUN задает команды, которые выполняются при сборке контейнера
RUN apt-get update && apt-get install nano
RUN ["bash", "-c", "rm", "-rf", "/tmp"]
RUN ["script.sh", "arg1", "argN"] - Инструкция CMD задает команду, которая выполняется при старте контейнера (можно переназначить при старте контейнера)
CMD /script.sh
CMD ["echo", "CMD echo"] - Инструкция ENTRYPOINT задает команду, которая выполняется при старте контейнера (нельзя переназначить при старте контейнера)
ENTRYPOINT /script.sh
ENTRYPOINT ["echo", "CMD echo"]
- Избегайте установки лишних пакетов
- Избегайте упаковки в образ лишних/ненужных данных
- Используйте связанные команды для RUN-инструкций
- Следите за последовательностью описания Dockerfile, избегайте cache miss
- Уменьшайте количество слоев
- Один контейнер - одна задача
- Чистите за собой
FROM nginx:mainline-alpine3.18
COPY /src /usr/share/nginx/html
EXPOSE 80