Пошук уроків, статей та іншого контенту
Зрозумійте призначення образів, їхню структуру, ідентифікатори та відмінності між образами й контейнерами.
Docker-образ — це незмінний шаблон, з якого Docker створює контейнери.
Образ містить усе необхідне для запуску застосунку:
файлову систему;
програму та її залежності;
базові системні файли;
метадані;
команду, яку потрібно виконати під час запуску контейнера.
Образ сам по собі не є запущеним процесом. Він лише описує початковий стан, на основі якого створюється контейнер.
Наприклад, образ alpine містить мінімальну файлову систему Linux. На його основі можна створити контейнер і виконати в ньому команду:
docker run --rm alpine:3.20 echo "Привіт із контейнера"У цьому прикладі Docker:
знаходить образ alpine:3.20 локально;
якщо образ відсутній — завантажує його з реєстру;
створює контейнер на основі образу;
запускає команду echo;
видаляє контейнер після завершення завдяки прапорцю --rm.
Образ і контейнер пов’язані, але це різні поняття.
Образ:
є шаблоном для створення контейнерів;
не змінюється під час запуску;
може використовуватися для створення багатьох контейнерів;
зберігається локально або в реєстрі;
має назву, тег та ідентифікатор.
Контейнер:
є запущеним або зупиненим екземпляром образу;
має власний стан;
може мати власний записуваний шар;
запускає процеси;
має власне ім’я та ідентифікатор.
Один образ можна використати для створення кількох незалежних контейнерів:
docker run -d --name web-1 nginx:alpine
docker run -d --name web-2 nginx:alpineОбидва контейнери створені з одного образу nginx:alpine, але це різні контейнери зі своїми ідентифікаторами та станом.
Для завантаження образу використовується команда docker pull:
docker pull alpine:3.20Загальний формат назви образу:
[registry/]repository[:tag]Наприклад:
docker.io/library/alpine:3.20У короткому записі можна вказати лише:
alpine:3.20У такому разі Docker використовує стандартний реєстр Docker Hub і стандартний простір імен library.
У назві:
alpine:3.20alpine — назва репозиторію;
3.20 — тег.
Тег зазвичай позначає версію або варіант образу:
node:22
node:22-alpine
python:3.12
nginx:1.27-alpineЯкщо тег не вказати, Docker використовує тег latest:
docker pull alpineЦе еквівалентно:
docker pull alpine:latestТег latest не обов’язково означає найновішу версію програми. Це лише звичайна назва тегу, яку автор образу може оновлювати в будь-який момент.
Для відтворюваних запусків краще вказувати конкретну версію:
docker pull alpine:3.20Команда docker image ls показує образи, збережені локально:
docker image lsПриклад результату:
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine 3.20 8a1f59ffb5c0 2 weeks ago 7.8MBОсновні стовпці:
REPOSITORY — репозиторій образу;
TAG — тег;
IMAGE ID — ідентифікатор образу;
CREATED — час створення образу;
SIZE — розмір образу.
Щоб переглянути лише образи певного репозиторію:
docker image ls alpineЩоб побачити всі образи, зокрема проміжні та образи без тегів:
docker image ls --allDocker використовує ідентифікатори для точного визначення образів.
IMAGE ID — ідентифікатор локального образу. У виведенні Docker зазвичай показується його скорочена форма:
8a1f59ffb5c0Повний ідентифікатор довший. Скороченого значення зазвичай достатньо для команд Docker, якщо воно однозначно визначає один образ.
Образ може мати кілька тегів, але при цьому залишатися тим самим образом:
docker tag alpine:3.20 my-alpine:stable
docker image lsТепер один і той самий образ може відображатися під двома назвами:
REPOSITORY TAG IMAGE ID
alpine 3.20 8a1f59ffb5c0
my-alpine stable 8a1f59ffb5c0Команда docker tag не копіює всі файли образу. Вона створює ще одне ім’я, яке посилається на цей образ.
Образ із реєстру також може мати дайджест — криптографічний ідентифікатор вмісту, наприклад:
sha256:0123456789abcdef...Тег може бути переміщений на інший образ. Дайджест прив’язаний до конкретного вмісту образу та дає змогу точніше зафіксувати версію.
Для перегляду детальної інформації про образ можна виконати:
docker image inspect alpine:3.20У результаті буде інформація про конфігурацію, архітектуру, шари, команду запуску та інші властивості образу.
Docker-образ складається з шарів. Кожен шар містить зміни файлової системи.
Наприклад, під час створення образу можуть послідовно додаватися:
базова операційна система;
системні пакети;
залежності застосунку;
файли самого застосунку.
Шари є незмінними та можуть спільно використовуватися різними образами.
Подивитися шари образу можна за допомогою команди:
docker image history alpine:3.20Приклад виведення:
IMAGE CREATED CREATED BY SIZE COMMENT
8a1f59ffb5c0 2 weeks ago 7.8MBДля складніших образів список міститиме більше рядків.
Шари дають Docker кілька переваг:
не потрібно повторно завантажувати однакові частини образів;
повторне створення образу може використовувати кеш;
кілька образів можуть спільно використовувати базові шари;
оновлення може передавати лише змінені шари.
Наприклад, два образи можуть використовувати одну й ту саму базову систему. Docker збереже цю базову частину лише один раз.
Шари образу призначені лише для читання. Коли Docker створює контейнер, він додає поверх образу окремий записуваний шар контейнера.
Спрощено структура виглядає так:
Записуваний шар контейнера
--------------------------
Шар застосунку
--------------------------
Шар залежностей
--------------------------
Базовий шар образуЯкщо процес у контейнері створює або змінює файл, зміна потрапляє до записуваного шару контейнера, а не змінює початковий образ.
Наприклад:
docker run --name files-demo alpine:3.20 sh -c \
'echo "дані контейнера" > /tmp/message.txt && cat /tmp/message.txt'Файл створено всередині контейнера. Він не додається до образу alpine:3.20.
Якщо видалити контейнер, зміни його записуваного шару також буде видалено:
docker rm files-demoСам образ при цьому залишиться без змін.
Для постійного збереження даних використовують окремі механізми збереження, а не записуваний шар контейнера. У цьому уроці важливо запам’ятати головне: зміни контейнера не змінюють образ.
Образ можна завантажити з реєстру або створити самостійно. Один зі способів створення — Dockerfile.
Приклад простого Dockerfile:
FROM alpine:3.20
RUN echo "Файл створено під час збирання образу" > /message.txt
CMD ["cat", "/message.txt"]Зберемо образ із цього файлу:
docker build -t message-image .Пояснення:
FROM alpine:3.20 задає базовий образ;
RUN виконує команду під час збирання образу;
CMD задає стандартну команду контейнера;
-t message-image додає образу ім’я та тег;
. означає поточний каталог як контекст збирання.
Після цього можна запустити контейнер:
docker run --rm message-imageРезультат:
Файл створено під час збирання образуІнструкції Dockerfile зазвичай створюють шари або змінюють конфігурацію образу. Образ, створений у такий спосіб, можна переглянути звичайною командою:
docker image ls message-imageТипова послідовність роботи з образом має такий вигляд:
# Завантажити образ
docker pull alpine:3.20
# Переглянути локальні образи
docker image ls
# Переглянути детальну інформацію
docker image inspect alpine:3.20
# Переглянути шари
docker image history alpine:3.20
# Створити контейнер і запустити його
docker run --rm alpine:3.20 echo "Готово"Образ після завантаження залишається локально та може використовуватися повторно. Якщо потрібного образу або його версії немає локально, Docker намагається завантажити його з реєстру під час docker run.
Для видалення образу використовується команда:
docker image rm alpine:3.20Або скорочений варіант:
docker rmi alpine:3.20Docker не видалить образ, якщо від нього залежить наявний контейнер. Спочатку потрібно видалити такий контейнер або припинити його використання.
Видалення тегу не завжди означає негайне видалення всіх даних образу. Якщо той самий образ має інші теги або спільні шари використовуються іншими образами, Docker збереже необхідні дані.
Образ не запускається самостійно. Він є шаблоном.
Для запуску образу потрібна команда docker run:
docker run --rm alpine:3.20 echo "Запущено контейнер"Файл, створений у контейнері, не з’явиться в образі автоматично. Образ залишається незмінним.
Якщо потрібно створити нову версію образу, зазвичай змінюють Dockerfile і виконують нове збирання.
latestТег latest може вказувати на різний вміст у різний час. Для навчальних прикладів і розгортання краще використовувати конкретні теги версій або зафіксований digest.
Тег — це зручне ім’я, наприклад:
alpine:3.20Ідентифікатор або digest визначає конкретний образ точніше. Тег може бути змінений або переназначений.
Якщо образ використовується контейнером, Docker може відмовитися його видаляти. Спочатку перевірте контейнери та видаліть непотрібні:
docker ps --all
docker rm container-nameDocker-образ — це незмінний шаблон для створення контейнерів.
Контейнер — це екземпляр образу із запущеним процесом і власним станом.
Образи мають репозиторій, тег, ідентифікатор і можуть мати digest.
Якщо тег не вказано, Docker використовує latest.
Образ складається з незмінних шарів.
Різні образи можуть спільно використовувати однакові шари.
Контейнер має власний записуваний шар поверх шарів образу.
Зміни всередині контейнера не змінюють початковий образ.
Образи можна завантажувати з реєстру або створювати за допомогою Dockerfile.
Основні команди для роботи з образами: docker pull, docker image ls, docker image inspect, docker image history, docker build і docker image rm.