Docker Images
Робота з Docker Images
Docker надає безліч команд для роботи з образами. Ось основні з них:
- Створення образу: docker build
- Запуск контейнера з образу: docker run
- Список образів: docker images
- Видалення образу: docker rmi
- Пошук образів в Docker Hub: docker search
- Завантаження образу з Docker Hub: docker pull
- Відправка образу в Docker Hub: docker push
Приклад створення та використання Docker Image:
1. Створення Dockerfile:
dockerfile
# Використовуємо базовий образ Ubuntu
FROM ubuntu:20.04
# Встановлюємо Python
RUN apt-get update && apt-get install -y --no-install-recommends python3 \
curl \
git \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
# Копіюємо файли додатку в контейнер
COPY . /app
# Встановлюємо робочу директорію
WORKDIR /app
# Вказуємо порт для роботи
EXPOSE 8080
# Встановлення змінних середовища
ENV NODE_ENV=production
# Вказуємо команду для запуску додатку
CMD ["python3", "app.py"]2. Збірка образу:
Наступна команда створить образ з ім'ям my_python_app, використовуючи Dockerfile з поточного каталогу:
docker build -t my_python_app .
docker build -t myapp:1.0 .3. Запуск контейнера з образу:
Використовуйте наступну команду, щоб запустити контейнер із створеного образу my_python_app у фоновому режимі:
docker run -d my_python_app
Структура Dockerfile:
Dockerfile складається з інструкцій, кожна з яких виконує певну функцію. Ось основні з них:
- FROM: задає базовий образ, який буде використаний для створення нового образу.
- MAINTAINER: визначає автора Dockerfile (застаріла, але корисна для інформації).
- RUN: виконує команди в контейнері та створює новий шар.
- COPY: копіює файли і директорії з контексту зборки у файлову систему контейнера.
- ADD: копіює файли і директорії, підтримує витяг архівів і завантаження файлів по URL.
- WORKDIR: задає робочу директорію для наступних команд.
- ENV: встановлює змінні оточення.
- CMD: визначає команду за замовчуванням, яка виконується при запуску контейнера.
- ENTRYPOINT: задає команду, виконувану при запуску контейнера, з можливістю передачі аргументів.
- EXPOSE: вказує порти, які використовує контейнер.
- VOLUME: створює точку монтування для зовнішніх томів.
Інструкція FROM
Інструкція FROM задає базовий образ, з якого буде створено новий образ. Це перша інструкція в будь-якому Dockerfile, і вона визначає початкову точку для складання образу.
FROM <image>[:<tag>] [AS <name>]
FROM node:14
FROM node:14 AS builderДе:
- <image>: назва базового образу.
- <tag>: (необов'язково) версія базового образу. За замовчуванням використовується latest.
- AS <name>: (необов'язково) призначення імені для цього етапу збірки (використовується в багатоетапній збірці).
Інструкція RUN
Інструкція RUN виконує команди всередині контейнера та створює новий шар у образі. Ця інструкція використовується для установки пакетів, налаштування середовища і виконання інших команд, необхідних для підготовки образу.
RUN <command>
RUN apt-get update \
&& apt-get install -y --no-install-recommends curl git \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*Де:
- <command>: команда, яка буде виконана всередині контейнера.
Інструкція COPY
Інструкція COPY копіює файли та директорії з контексту збірки на файлову систему контейнера. Це корисно для перенесення вихідного коду, конфігураційних файлів та інших ресурсів у контейнер.
COPY <src> <dest>
COPY . /appДе:
- <src>: шлях до файлів або директорій у контексті збірки.
- <dest>: шлях призначення в контейнері.
Використання .dockerignore
Щоб виключити непотрібні файли з процесу копіювання, можна використовувати файл .dockerignore, який працює аналогічно .gitignore.
node_modules
dist
*.logІнструкція CMD
Інструкція CMD задає команду, яка буде виконана при запуску контейнера. На відміну від RUN, яка виконується на етапі збірки, CMD виконується при запуску контейнера з створеного образу.
CMD ["executable","param1","param2"]
або
CMD command param1 param2
CMD ["node", "app.js"]
або
CMD /usr/bin/myscript.shДе:
- ["executable","param1","param2"]: форма exec, яка є більш переважною для забезпечення правильної обробки сигналів.
- command param1 param2: форма shell, яка виконує команду в оболонці.
Різниця між CMD та ENTRYPOINT
CMD задає команду за замовчуванням, яку можна перевизначити при запуску контейнера. ENTRYPOINT задає незмінну команду, яка завжди буде виконуватися при запуску контейнера.
Приклад використання ENTRYPOINT:
ENTRYPOINT ["python", "script.py"]
CMD ["arg1"]
Збірка образу
Команда docker build збирає образ із Dockerfile і так званого контексту збірки. Контекст збірки — це файли, які Docker використовує для створення образу.
docker build [OPTIONS] PATH | URL | -
docker build -t myimage:latest .Де:
- PATH: шлях до директорії, яка містить Dockerfile і контекст збірки.
- URL: URL-адреса віддаленого репозиторію.
- -: читання Dockerfile зі стандартного вводу (stdin).
Кастомізація команди build
Основні параметри команди docker build
Команда docker build підтримує багато опцій, які дозволяють налаштувати процес побудови.
1. Параметри -t, --tag
Параметр -t або --tag використовується для присвоєння імені та тегу створюваному образу.
docker build -t myimage:latest .2. Параметри -f, --file
Параметр -f або --file дозволяє вказати альтернативний Dockerfile, якщо він відрізняється від стандартного Dockerfile.
docker build -f Dockerfile.dev -t myimage:dev .3. Параметр --build-arg
Параметр --build-arg використовується для передачі аргументів збірки, визначених за допомогою інструкції ARG у Dockerfile.
docker build --build-arg APP_VERSION=1.0 -t myimage:1.0 .4. Параметр --no-cache
Параметр --no-cache дозволяє виконати побудову без використання кешу. Це корисно, якщо потрібно переконатися, що всі команди виконуються заново.
docker build --no-cache -t myimage:latest .5. Параметр --target
Параметр --target використовується для вказання цільового етапу у багатостадійній збірці.
docker build --target builder -t myimage:builder .6. Параметр --rm
Параметр --rm вказує Docker видалити проміжні контейнери після успішної побудови образу (за замовчуванням увімкнено).
docker build --rm -t myimage:latest .
Управління образами
Команда docker images
Команда docker images відображає список образів, збережених локально на твоїй системі. Вона показує такі дані, як ім'я репозиторія, тег, ідентифікатор образу, дату його створення та розмір. Ця інформація дозволяє швидко оцінити, які образи доступні і скільки місця вони займають.
docker images [OPTIONS] [REPOSITORY[:TAG]]Де:
- OPTIONS: додаткові параметри для фільтрації і форматування виводу.
- [REPOSITORY[:TAG]]: (необов'язково) фільтр за назвою репозиторія і/або тегом.
docker images
Результат
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 5a7e5b1a3b8c 2 days ago 133MB
ubuntu 20.04 ba6acccedd29 3 weeks ago 72.9MB
myapp 1.0 d1e5e2ff5ff2 1 month ago 89.5MBОпис колонок:
- REPOSITORY: назва репозиторія, до якого належить образ.
- TAG: тег, що позначає версію образу.
- IMAGE ID: унікальний ідентифікатор образу.
- CREATED: час, що пройшов з моменту створення образу.
- SIZE: розмір образу в пам'яті.
Фільтрація образів
Фільтр за репозиторієм
docker images nginxЦей приклад виведе лише образи з репозиторію nginx.
Фільтр за тегом
docker images ubuntu:20.04Цей приклад виведе образ ubuntu з тегом 20.04.
Використання параметру -a (all)
За замовчуванням команда docker images показує лише останні версії образів. Щоб відобразити всі образи, включаючи проміжні шари, використовуй опцію -a.
docker images -aФорматування виводу
Для спрощення читання або інтеграції з іншими інструментами ти можеш налаштувати формат виводу за допомогою опції --format. Це особливо корисно у скриптах і при автоматизації завдань.
docker images --format "{{.Repository}}:{{.Tag}} {{.ID}}"Команда docker rmi
Команда docker rmi використовується для видалення одного або декількох Docker-образів. Це корисно для звільнення місця на диску і підтримання системи в порядку, особливо якщо образи більше не використовуються.
docker rmi [OPTIONS] IMAGE [IMAGE...]
docker rmi nginxДе:
- OPTIONS: додаткові параметри для керування процесом видалення.
- IMAGE: ім'я, тег або ідентифікатор образу, який потрібно видалити.
Видалення dangling images
Dangling images — це образи без тегів, які залишаються після оновлень образів або невдалих збірок. Для їх видалення використовуйте команду:
docker rmi $(docker images -f "dangling=true" -q)Тут -f "dangling=true" фільтрує образи без тегів, а -q виводить тільки їх ідентифікатори, які передаються в команду видалення.
Приклади оптимізованих Dockerfile
Приклад 1: Оптимізований Dockerfile для Node.js
FROM node:14-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/htmlЦей приклад використовує багатоступеневу збірку. Спочатку додаток збирається на проміжному етапі, а потім тільки результати збірки копіюються у фінальний образ на базі Nginx.
Приклад 2: Оптимізований Dockerfile для Python
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "app.py"]У цьому прикладі використовується легковаговий базовий образ python:3.9-slim. Встановлення залежностей винесено в окремий крок, що дозволяє використовувати кеш Docker, якщо файл requirements.txt не змінений.
Налаштування базового образу
Налаштування базового образу на основі Alpine Linux
# Використовуємо базовий образ Alpine Linux
FROM alpine:3.12
# Встановлюємо необхідні пакети
RUN apk add --no-cache python3 py3-pip
# Встановлюємо робочу директорію
WORKDIR /app
# Копіюємо файли застосунку
COPY . .
# Встановлюємо залежності
RUN pip3 install -r requirements.txt
# Вказуємо команду для запуску застосунку
CMD ["python3", "app.py"]Налаштування базового образу на основі Ubuntu
# Використовуємо базовий образ Ubuntu
FROM ubuntu:20.04
# Оновлюємо і встановлюємо необхідні пакети
RUN apt-get update && apt-get install -y \
python3 \
python3-pip \
&& rm -rf /var/lib/apt/lists/*
# Встановлюємо робочу директорію
WORKDIR /app
# Копіюємо файли застосунку
COPY . .
# Встановлюємо залежності
RUN pip3 install -r requirements.txt
# Вказуємо команду для запуску застосунку
CMD ["python3", "app.py"]
Теги та версії образів
Тег (tag) в Docker — мітка, яка дозволяє ідентифікувати конкретну версію образу. Теги спрощують відстеження змін і допомагають обирати потрібні версії для різних середовищ, таких як розробка, тестування і продакшн.
Використання семантичного версіонування
Семантичне версіонування (Semantic Versioning) — це стандартна практика присвоєння версій, яка допомагає зрозуміти рівень змін в образі.
Формат семантичного версіонування:
<major>.<minor>.<patch>Де:
- major: Основні зміни, несумісні з попередніми версіями.
- minor: Нові функції, сумісні з попередніми версіями.
- patch: Виправлення помилок та інші незначні зміни.
docker build -t myapp:2.1.3 .Використання додаткових міток
Додаткові мітки допомагають позначити стан образу, наприклад, beta, alpha, stable або prod.
docker build -t myapp:1.0-beta .
docker build -t myapp:1.0-stable .Призначення тегів під час зборки образу
Ви можете присвоїти тег образу під час його зборки за допомогою параметру -t команди docker build.
docker build -t myapp:1.0 .Призначення додаткових тегів існуючому образу
Ви можете додати теги вже існуючому образу за допомогою команди docker tag.
docker tag myapp:1.0 myapp:latestВикористання тегів під час запуску контейнерів
Коли ви запускаєте контейнер, ви можете вказати конкретний тег образу, який хочете використовувати.
docker run -d myapp:1.0Оновлення тегів
При оновленні образу рекомендується змінювати теги для зручності відстеження змін. Тег latest часто використовується для позначення останньої версії образу.
docker build -t myapp:2.0 .
docker tag myapp:2.0 myapp:latest
Публікація образів у Docker Hub
Крок 1. Збірка Docker-образу:
Якщо у тебе ще нема зібраного образу, створи його за допомогою команди docker build.
docker build -t myapp:latest .Крок 2. Тегування образу:
Щоб опублікувати образ у Docker Hub, його потрібно тегувати з вказанням твого імені користувача на Docker Hub.
docker tag myapp:latest yourusername/myapp:latestКрок 3. Публікація образу:
Використовуй команду docker push для відправлення образу у Docker Hub.
docker push yourusername/myapp:latestЗавантаження образів: команда docker pull
Команда docker pull використовується для завантаження образів із Docker Hub на вашу локальну машину. Це дозволяє отримати доступ до образів, опублікованих іншими користувачами або вашою командою.
Крок 1. Пошук образу:
Використовуйте команду docker search, щоб знайти потрібний образ у Docker Hub.
docker search nginxКрок 2. Завантаження образу:
Використовуйте команду docker pull, щоб завантажити образ на вашу локальну машину.
docker pull yourusername/myapp:latest