linux-labs

Вики / Службы и systemd

Docker (контейнеры)

Базовая работа с контейнерами — запуск, логи, exec, образы, compose, чистка.

Docker запускает приложения в изолированных контейнерах из образов. Демон docker под systemd; управление — docker CLI.

systemctl status docker
docker ps                         # запущенные контейнеры
docker ps -a                      # включая остановленные
docker images                     # локальные образы

Без sudo — добавь пользователя в группу docker (usermod -aG docker $USER, релогин). Группа docker = фактически root, давай осознанно.

docker run -d --name web -p 8080:80 nginx      # фон + проброс порта (хост:контейнер)
docker run -d --name web --restart unless-stopped -p 8080:80 nginx   # авто-рестарт
docker run --rm -it ubuntu bash                 # разово, удалить после выхода
docker run -e KEY=val -v /srv/data:/data img    # переменная + том (bind)
docker logs -f --tail 100 web                   # логи (хвост, follow)
docker logs --since 10m web                      # за последние 10 минут
docker exec -it web bash                         # шелл внутри
docker stop web ; docker start web ; docker restart web
docker rm -f web                                 # удалить (даже запущенный)
docker stats                                     # CPU/память контейнеров
docker inspect web                               # вся метаинформация (JSON)
docker inspect -f '{{.State.Health.Status}}' web # одно поле через формат
docker pull nginx:1.27            # скачать образ (фиксируй тег, не :latest)
docker build -t myapp:1 .         # собрать из Dockerfile
docker tag myapp:1 reg/myapp:1 ; docker push reg/myapp:1

docker volume create data ; docker volume ls       # именованные тома (данные)
docker network create appnet ; docker network ls   # своя сеть (контейнеры по имени)
docker run --network appnet --name db postgres     # db резолвится по имени внутри appnet

# docker compose (несколько сервисов из compose.yaml)
docker compose up -d
docker compose ps ; docker compose logs -f
docker compose pull && docker compose up -d        # обновить
docker compose down                                # остановить и удалить

Cannot connect to the Docker daemon

Демон не запущен (systemctl status docker) или нет прав (не в группе docker, нужен релогин). В CI — нет docker-in-docker.

port is already allocated

Порт хоста занят: ss -tlnp | grep :8080 — поменяй левую часть -p 8081:80.

Контейнер сразу падает (Exited)

docker logs <name> — причина. Контейнер живёт, пока жив главный процесс; если команда отработала/упала — контейнер завершается. Для отладки docker run -it img sh.

Контейнеры не видят друг друга по имени

Имя-резолвинг работает только в своей сети (docker network create + --network), не в дефолтной bridge. В compose это включено автоматически.

Закончилось место

Образы/тома/логи копятся: docker system df, чистка docker system prune -af + docker volume prune (осторожно — удалит неиспользуемое). Логи — драйвер json-file без лимита; задай max-size в /etc/docker/daemon.json.

Данные пропали после пересоздания

Данные в контейнере эфемерны. Храни в томах (-v name:/path) или bind-mount.

docker ps -a ; docker images
docker run -d --name N --restart unless-stopped -p H:C img
docker logs -f --tail 100 N ; docker exec -it N bash
docker stats ; docker inspect N
docker compose up -d ; docker compose logs -f
docker system df ; docker system prune -af        # чистка

См. также