Контейнери Docker: run, exec, logs, ресурси і життєвий цикл
Усі важливі прапорці docker run, життєвий цикл контейнера, логи, exec, inspect, сигнали й коди виходу, політики перезапуску, ліміти пам'яті й CPU та прибирання.
docker run — головна команда
docker run = завантажити образ (якщо його немає) + створити контейнер + запустити його.
docker run -d --name web -p 8080:80 nginx:stable-alpineВідкрийте http://localhost:8080 — це nginx у контейнері.
Прапорці, які треба знати
| Прапорець | Що робить | Приклад |
|---|---|---|
-d |
у фоні (detached) | docker run -d nginx |
-it |
інтерактивно з терміналом | docker run -it ubuntu bash |
--rm |
видалити контейнер після зупинки | одноразові задачі |
--name |
ім'я замість випадкового quirky_turing |
--name web |
-p хост:контейнер |
опублікувати порт | -p 8080:80, -p 127.0.0.1:5432:5432 |
-e |
змінна середовища | -e TZ=Europe/Kyiv |
--env-file |
змінні з файлу | --env-file .env |
-v |
том або папка хоста | -v pgdata:/var/lib/postgresql/data |
--network |
мережа | --network app-net |
--restart |
політика перезапуску | --restart unless-stopped |
-w |
робоча папка | -w /app |
-u |
від якого користувача | -u 1000:1000 |
--entrypoint |
замінити ENTRYPOINT образу | --entrypoint sh |
-m, --cpus |
ліміти ресурсів | -m 512m --cpus 1.5 |
--init |
маленький init як PID 1 (сигнали, зомбі-процеси) | для скриптів і Node.js |
--platform |
архітектура образу | --platform linux/amd64 |
--pull always |
завжди перевіряти свіжу версію тегу |
Усе, що після імені образу, — це команда й аргументи для контейнера (замінюють CMD):
docker run --rm alpine echo "привіт" # одноразова команда
docker run --rm -it python:3.13-slim python # інтерактивний Python
docker run --rm -v "$PWD":/work -w /work node:24-alpine npm test # тести без встановленого NodePostgres за одну командуdocker run -d --name pg \ -e POSTGRES_PASSWORD=secret \ -p 127.0.0.1:5432:5432 \ -v pgdata:/var/lib/postgresql/data \ --restart unless-stopped \ postgres:17-alpineБаза доступна лише з цього комп'ютера (
127.0.0.1), дані в томіpgdataпереживуть видалення контейнера.
Життєвий цикл
| Команда | Що робить |
|---|---|
docker create |
створити, не запускаючи |
docker start web |
запустити створений чи зупинений |
docker stop web |
SIGTERM → чекати 10 с → SIGKILL |
docker stop -t 30 web |
чекати 30 с замість 10 |
docker kill web |
одразу SIGKILL (або -s SIGHUP — інший сигнал) |
docker restart web |
stop + start |
docker pause / unpause web |
заморозити процеси (cgroups freezer) |
docker rm web |
видалити зупинений |
docker rm -f web |
зупинити й видалити |
Контейнер живе, поки живе PID 1Контейнер працює, доки працює його головний процес. Скрипт закінчився — контейнер зупинився (
Exited (0)). Тому сервіси в контейнерах запускають на передньому плані:nginx -g 'daemon off;', а неservice nginx start.
Що зараз запущено
docker ps # працюючі
docker ps -a # усі, включно із зупиненими
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
docker ps -q # лише ID — для скриптів
docker ps --filter status=exitedNAMES STATUS PORTS
web Up 2 hours 0.0.0.0:8080->80/tcp
pg Up 2 hours (healthy) 127.0.0.1:5432->5432/tcp
job Exited (1) 5 minutes agoЛоги
Docker збирає все, що процес пише в stdout і stderr. Тому застосунок у контейнері має логувати в консоль, а не у файли.
docker logs web # усе
docker logs -f web # стежити в реальному часі (як tail -f)
docker logs --tail 100 web # останні 100 рядків
docker logs --since 10m web # за останні 10 хвилин
docker logs -t web # з часовими мітками
docker logs web 2>&1 | grep -i errorЗайти всередину: exec
docker exec -it web sh # оболонка в працюючому контейнері (alpine — sh, debian — bash)
docker exec web nginx -t # одна команда
docker exec -u root -it web sh # від root, навіть якщо контейнер працює від іншого користувача
docker exec -e DEBUG=1 web env # з додатковою змінноюЗміни через exec — тимчасовіВстановили пакет чи поправили конфіг через
exec— після перестворення контейнера все зникне. Постійні зміни — лише в Dockerfile чи в змонтованих файлах.
Контейнер падає одразу після старту і exec неможливий? Запустіть образ з іншою командою:
docker run --rm -it --entrypoint sh myapp:1.0Інформація і діагностика
docker inspect web # усе про контейнер (JSON)
docker inspect -f '{{.State.Status}} {{.State.ExitCode}}' web
docker inspect -f '{{.State.OOMKilled}}' web # чи вбито через нестачу пам'яті
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' web
docker inspect -f '{{json .Config.Env}}' web # змінні середовища
docker port web # опубліковані порти
docker top web # процеси в контейнері
docker stats # CPU, RAM, мережа — наживо
docker stats --no-stream # один знімок
docker diff web # які файли змінено в шарі контейнера (A/C/D)
docker events --since 30m # події: старти, падіння, OOMКопіювання файлів
docker cp web:/etc/nginx/nginx.conf ./nginx.conf # з контейнера
docker cp ./index.html web:/usr/share/nginx/html/ # у контейнерКоди виходу
docker ps -a показує Exited (N). Код підказує причину:
| Код | Що означає | Що робити |
|---|---|---|
0 |
процес завершився успішно | для сервісу — він не мав завершуватися: процес пішов у фон? |
1 |
помилка застосунку | docker logs |
125 |
помилка самого docker run (поганий прапорець) |
читати повідомлення docker |
126 |
команду неможливо виконати (немає прав +x) |
chmod +x у Dockerfile |
127 |
команду не знайдено | помилка в CMD/ENTRYPOINT, немає bash в alpine |
137 |
вбито SIGKILL (128+9): OOM або docker kill |
docker inspect -f '{{.State.OOMKilled}}', збільшити -m |
139 |
segfault (128+11) | баг у бінарнику, несумісна архітектура чи бібліотеки |
143 |
SIGTERM (128+15): штатна зупинка | нормально після docker stop |
Політики перезапуску
| Політика | Поведінка |
|---|---|
no (типово) |
ніколи не перезапускати |
on-failure[:5] |
лише при ненульовому коді, максимум 5 спроб |
always |
завжди; навіть зупинений вручну контейнер підніметься після перезапуску демона чи сервера |
unless-stopped |
як always, але не піднімає те, що ви зупинили вручну |
docker run -d --restart unless-stopped --name web nginx:stable-alpine
docker update --restart unless-stopped web # змінити для існуючогоДля сервісів на сервері зазвичай обирають unless-stopped: контейнер підніметься після перезавантаження сервера, але не «воскресне», якщо ви зупинили його навмисно.
Unhealthy ≠ перезапускDocker без оркестратора не перезапускає контейнер зі статусом
unhealthy— healthcheck лише змінює статус. Перезапуск відбувається, коли процес завершився. Автоматичну реакцію на unhealthy дають Swarm, Kubernetes або зовнішній моніторинг.
Ліміти ресурсів
Без лімітів один контейнер з витоком пам'яті може покласти весь сервер.
# --memory: жорсткий ліміт RAM, перевищення → OOM kill (код 137)
# --cpus: не більше 1.5 ядра; --pids-limit: захист від fork-бомби
docker run -d --name api \
--memory 512m \
--memory-reservation 256m \
--cpus 1.5 \
--pids-limit 200 \
myapp:1.0
docker update --memory 1g --memory-swap 1g api # змінити на льоту
docker stats apiКоментар після\ламає командуПісля зворотного слеша в кінці рядка не може бути нічого, навіть пробілу чи
# коментаря, — інакше перенесення не спрацює, і решта рядків виконається як окремі команди.
Java, Node.js і лімітиСучасні JVM і Node бачать ліміт cgroups, але Node за замовчуванням не використовує всю виділену пам'ять для heap. Для великого heap задайте
NODE_OPTIONS=--max-old-space-size=384(трохи менше за--memory).
Прибирання
docker container prune # видалити всі зупинені контейнери
docker rm $(docker ps -aq --filter status=exited)
docker rm -f $(docker ps -aq) # УСІ контейнери, навіть працюючі — обережно
docker system df # скільки місця займають образи, контейнери, томи, кешПро очищення образів, кешу збірки й томів — у нотатках «Образи» і «Дані».
Шпаргалка
| Команда | Що робить |
|---|---|
docker run -d --name X -p 8080:80 IMG |
запустити сервіс |
docker run --rm -it IMG sh |
тимчасовий контейнер з оболонкою |
docker ps -a |
усі контейнери |
docker logs -f --tail 100 X |
логи наживо |
docker exec -it X sh |
зайти всередину |
docker stop / start / restart X |
керування |
docker rm -f X |
видалити |
docker inspect X |
усе про контейнер |
docker stats |
споживання ресурсів |
docker cp X:/шлях ./ |
скопіювати файл |
docker update --restart unless-stopped X |
змінити політику |
Збережіть статтю собі
Увійдіть, щоб імпортувати її у власні нотатки, відмічати вивчене, ставити лайки й питати спільноту. Реєстрація безкоштовна: вхід через Google займає кілька секунд.
Увійти через Google Інші способи входу