Пошук уроків, статей та іншого контенту
З’ясуємо різницю між образами та контейнерами, а також навчимося працювати з Docker Registry.
Docker використовує два основні поняття:
образ (image) — підготовлений шаблон для запуску застосунку;
контейнер (container) — запущений екземпляр образу.
Образ містить:
код застосунку;
необхідні залежності;
базову файлову систему;
налаштування запуску.
Образ не запускається самостійно. Щоб виконати код з образу, Docker створює на його основі контейнер.
Один образ можна використовувати для запуску багатьох контейнерів:
nginx:alpine
├── container-1
├── container-2
└── container-3Контейнери можуть мати різні імена, порти та налаштування, але використовувати один і той самий образ.
Для отримання образу з реєстру використовується команда docker pull:
docker pull nginx:alpineУ цьому прикладі:
nginx — назва образу;
alpine — тег образу.
Тег зазвичай використовують для позначення версії або варіанта образу:
nginx:alpine
node:22
python:3.12Якщо тег не вказати, Docker зазвичай використовує тег latest:
docker pull nginxОднак latest не обов’язково означає найновішу версію програми. Це лише назва тегу, яку може призначити автор образу. Для передбачуваної роботи краще вказувати конкретний тег.
Переглянути образи, які вже є на комп’ютері, можна командою:
docker imagesАбо її сучасним еквівалентом:
docker image lsКоманда docker run створює контейнер на основі образу та запускає його:
docker run nginx:alpineУ такому разі контейнер працюватиме у foreground-режимі, а термінал буде зайнятий його виводом. Щоб запустити контейнер у background-режимі, використовуйте прапорець -d:
docker run -d nginx:alpineDocker виведе ідентифікатор створеного контейнера.
Щоб зручно керувати контейнером, можна одразу задати йому ім’я:
docker run --name web-server -d nginx:alpineТепер замість довгого ідентифікатора можна використовувати ім’я web-server.
Контейнер має власне мережеве оточення. Порт усередині контейнера не стає автоматично доступним на комп’ютері.
Прапорець -p з’єднує порт комп’ютера з портом контейнера:
docker run --name web-server -d -p 8080:80 nginx:alpineФормат запису:
порт_комп’ютера:порт_контейнераУ прикладі:
8080 — порт на вашому комп’ютері;
80 — порт усередині контейнера, на якому працює Nginx.
Після запуску вебсервер буде доступний за адресою:
http://localhost:8080Якщо порт 8080 вже зайнятий, можна вибрати інший порт:
docker run --name web-server-2 -d -p 8081:80 nginx:alpineТоді контейнер буде доступний через порт 8081.
Команда docker ps показує запущені контейнери:
docker psУ результаті можна побачити:
ідентифікатор контейнера;
використаний образ;
команду запуску;
стан контейнера;
опубліковані порти;
ім’я контейнера.
Щоб побачити всі контейнери, зокрема зупинені, використовуйте прапорець -a:
docker ps -aКонтейнер після зупинки не зникає автоматично. Він залишається у списку, доки його не видалити.
Зупинити контейнер можна за іменем або ідентифікатором:
docker stop web-serverЗупинений контейнер можна запустити знову:
docker start web-serverЦе запускає вже створений контейнер. Налаштування контейнера, зокрема його ім’я та підключення портів, зберігаються.
Щоб видалити зупинений контейнер:
docker rm web-serverЯкщо потрібно зупинити й одразу видалити контейнер, можна використати:
docker rm -f web-serverПрапорець -f примусово зупиняє контейнер перед видаленням.
Видалення контейнера не видаляє образ, на основі якого його було створено. Образ можна використати для запуску нового контейнера.
Нижче наведена послідовність команд, яка запускає Nginx, перевіряє контейнер і видаляє його після завершення роботи:
# Отримуємо образ Nginx
docker pull nginx:alpine
# Запускаємо контейнер у фоновому режимі та відкриваємо порт 8080
docker run --name demo-web -d -p 8080:80 nginx:alpine
# Перевіряємо список запущених контейнерів
docker ps
# Переглядаємо журнали контейнера
docker logs demo-web
# Зупиняємо контейнер
docker stop demo-web
# Видаляємо зупинений контейнер
docker rm demo-webПісля команди docker run можна відкрити http://localhost:8080 у браузері. Після docker stop сторінка перестане відкриватися, оскільки контейнер більше не працює.
Коли виконується команда:
docker run --name demo-web -d -p 8080:80 nginx:alpineDocker послідовно:
перевіряє, чи є образ nginx:alpine локально;
якщо образу немає, завантажує його з Registry;
створює новий контейнер на основі образу;
налаштовує порт 8080;
запускає процес Nginx у контейнері;
повертає контейнеру ім’я demo-web.
Якщо виконати цю команду двічі з тим самим іменем, друга команда завершиться помилкою, бо контейнер з таким іменем уже існує.
Docker Registry — це сховище, у якому зберігаються Docker-образи.
Registry дозволяє:
завантажувати готові образи;
публікувати власні образи;
ділитися образами з іншими розробниками;
використовувати ті самі образи на різних комп’ютерах і серверах.
Публічним реєстром за замовчуванням для Docker є Docker Hub.
Коли команда містить образ без адреси Registry:
docker pull nginx:alpineDocker шукає його у Docker Hub.
Образ може мати повне ім’я з назвою користувача або організації:
username/project:tagНаприклад:
team-a/web-app:1.0У цьому імені:
team-a — користувач або організація;
web-app — назва репозиторію;
1.0 — тег образу.
Щоб опублікувати образ у Registry, потрібно:
увійти до Registry;
надати образу ім’я потрібного репозиторію;
завантажити образ командою push.
Для входу до Docker Hub використовується:
docker loginDocker попросить облікові дані. Не передавайте пароль безпосередньо в командному рядку та не зберігайте його у файлах проєкту.
Припустімо, локально є образ:
nginx:alpineЩоб підготувати його до публікації в репозиторії користувача myuser, створимо новий тег:
docker tag nginx:alpine myuser/demo-web:1.0Команда docker tag не копіює весь образ і не створює новий незалежний образ. Вона додає образу ще одне ім’я.
Перевірити локальні образи:
docker image lsТепер у списку може бути приблизно така пара:
nginx alpine ...
myuser/demo-web 1.0 ...Після входу та створення тегу образ можна завантажити:
docker push myuser/demo-web:1.0Після цього інші користувачі зможуть отримати образ командою:
docker pull myuser/demo-web:1.0Для приватного репозиторію користувачі повинні мати відповідні права доступу.
Docker-образ можна описати такою структурою:
[registry/]власник/репозиторій:тегПриклади:
nginx:alpine
myuser/demo-web:1.0
registry.example.com/team/web-app:2.3Якщо адреса Registry не вказана, Docker використовує Docker Hub.
Для приватного Registry ім’я може містити його адресу:
docker pull registry.example.com/team/web-app:2.3Команди pull, push і login працюють із Registry, зазначеним у назві образу.
Під час роботи контейнер може створювати або змінювати файли. Ці зміни належать конкретному контейнеру, а не базовому образу.
Якщо видалити контейнер, зміни, які зберігалися лише всередині нього, можуть бути втрачені.
Важливо розрізняти:
образ — шаблон, з якого створюють контейнери;
контейнер — конкретний екземпляр цього образу;
Registry — місце, де образи зберігаються та передаються між середовищами.
Зміни у файловій системі контейнера не створюють автоматично нову версію образу. Щоб отримати новий образ, його потрібно зібрати окремо або створити на основі контейнера спеціальною командою. У типовому робочому процесі образи створюють із Dockerfile, а не зберігають зміни вручну в запущеному контейнері.
Переглянути локальні образи:
docker image lsВидалити образ:
docker image rm myuser/demo-web:1.0Docker не видалить образ, якщо від нього залежать існуючі контейнери. Спочатку потрібно видалити такі контейнери або припинити їх використання.
Невикористані образи можна видалити командою:
docker image pruneDocker попросить підтвердити операцію. Будьте уважні: видалений локальний образ за потреби доведеться завантажувати з Registry повторно.
Під час роботи з готовим образом послідовність часто виглядає так:
# Завантажити образ
docker pull nginx:alpine
# Створити та запустити контейнер
docker run --name web-server -d -p 8080:80 nginx:alpine
# Перевірити запущені контейнери
docker ps
# Зупинити контейнер
docker stop web-server
# Запустити його знову
docker start web-server
# Видалити контейнер після завершення роботи
docker rm -f web-serverПід час публікації власного образу до цього процесу додаються docker login, docker tag і docker push.
Образ — це шаблон, а контейнер — його запущений екземпляр. Команда docker run створює контейнер з образу, а не запускає сам образ як окремий процес.
docker stop видаляє контейнерdocker stop лише зупиняє контейнер. Щоб видалити його, потрібно виконати:
docker rm container-nameЯкщо порт комп’ютера вже використовується, запуск із таким портом завершиться помилкою. Виберіть інший зовнішній порт:
docker run -d -p 8081:80 nginx:alpineДля docker push важливе повне ім’я образу:
docker push myuser/demo-web:1.0Публікація локального образу під простим ім’ям nginx:alpine не завантажить його у ваш репозиторій.
Якщо образ належить іншому користувачу або організації, ім’я має відповідати назві репозиторію в Registry:
myuser/demo-web:1.0Навіть якщо локальний образ працює, неправильний префікс може спричинити помилку під час docker push.
Образ — шаблон із кодом, залежностями та налаштуваннями застосунку.
Контейнер — створений і запущений екземпляр образу.
Один образ можна використовувати для запуску багатьох контейнерів.
docker pull завантажує образ із Registry.
docker run створює та запускає контейнер.
docker ps показує контейнери.
docker stop, docker start і docker rm керують життєвим циклом контейнера.
Docker Registry зберігає та поширює образи.
docker tag додає образу ім’я репозиторію.
docker push завантажує образ до Registry.
docker pull дає змогу отримати опублікований образ на іншому комп’ютері.