core code helper

Контейнери Docker: run, exec, logs, ресурси і життєвий цикл

Усі важливі прапорці docker run, життєвий цикл контейнера, логи, exec, inspect, сигнали й коди виходу, політики перезапуску, ліміти пам'яті й CPU та прибирання.

0 імпортували Імпортувати собі

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   # тести без встановленого Node
Postgres за одну команду
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=exited
NAMES   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 Інші способи входу