Ответы на квизы и отметки пройденных уроков будут удалены на этом устройстве.
Это действие нельзя отменить.
Шпаргалка: Docker
В курсе Docker используется прежде всего как модель слоёв образа, на которой построен werf/Stapel-билдер (см. шпаргалку werf) — реальная сборка Application-пакетов почти всегда идёт через werf build/d8 package build, а не напрямую docker build. Подробный разбор — M3 урок 1, distroless-паттерны — M8 урок 6.
Самые используемые команды
1
2
3
4
5
6
7
docker build -t <name>:<tag> . # собрать образ из Dockerfile в текущей директорииdocker run --rm -it <image> sh # запустить контейнер с интерактивным shelldocker ps # список работающих контейнеровdocker logs -f <container>
docker exec -it <container> sh
docker images # список локальных образовdocker system prune # очистка неиспользуемых данных
1
2
3
4
5
6
7
8
9
10
FROMgolang:1.26ASbuilderWORKDIR/appCOPY go.mod go.sum ./RUN go mod downloadCOPY . .RUNCGO_ENABLED=0 go build -o /app/bin/server ./cmd/serverFROMgcr.io/distroless/static-debian13COPY --from=builder /app/bin/server /serverENTRYPOINT["/server"]
CLI: сборка
1
2
3
4
5
docker build -t <name>:<tag> <context>
docker build -t <name>:<tag> . # context = текущая директорияdocker build -f <dockerfile> -t <name>:<tag> <context> # явный путь к Dockerfiledocker build --target <stage> # выбор конкретной стадии multi-stagedocker build --build-arg <ARG>=<value> # передать build-аргумент (в werf — через dependencies/imports)
CLI: запуск и инспекция
1
2
3
4
5
6
7
8
9
10
11
12
13
14
docker run -d -p <host-port>:<container-port> <image> # фоновый запуск с пробросом портаdocker run [-d][-p <host>:<container>] <image>
docker run <image> <command> # переопределить CMD (ENTRYPOINT сохраняется)docker run --rm -it <image> sh
docker ps # работающие контейнерыdocker logs [-f] <container>
docker exec -it <container> sh
docker images # список локальных образовdocker images | grep <pattern>
docker history <image> # слои образа и размер каждогоdocker inspect <image> # метаданные образаdocker inspect <image> --format='{{json .RootFS.Layers}}'# список слоёв RootFS в JSONdocker pull <image>
docker system prune # очистка неиспользуемых образов/контейнеров/сетей
Dockerfile: базовые инструкции
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
FROM<image> # базовый образ (начальный слой)FROM<image> AS <name> # именованная стадия multi-stage buildWORKDIR<path> # рабочая директория для последующих инструкцийCOPY <src> <dest> # копирование файлов из build context в образCOPY package*.json <dest> # копировать только манифесты зависимостей — для кэширования слояCOPY . . # копировать весь context после установки зависимостейCOPY --from=<stage> <src> <dest> # копирование артефакта из другой стадии multi-stageRUN <command> # выполнение команды при сборке (создаёт новый слой)CMD["<executable>","<arg>"]# команда по умолчанию при запуске контейнераENTRYPOINT["<executable>"]# неизменяемая часть команды запускаEXPOSE<port> # документирует порт (не публикует автоматически)ARG <name> # build-аргумент (доступен только на этапе сборки)ENV <name> <value> # переменная окружения (доступна и во время выполнения)USER<user-or-uid> # пользователь по умолчанию для последующих инструкцийLABEL <key>=<value> # метаданные образа (не создаёт новый слой с точки зрения ФС)HEALTHCHECK CMD <command> # команда проверки здоровья контейнера
docker build -t hello . # собрать образ из multi-stage Dockerfile
Стадии, объявленные до финального FROM, не попадают в итоговый образ — в нём остаются только слои последней стадии плюс то, что явно скопировано через COPY --from=<stage>. Это ключевой механизм уменьшения размера итогового образа: инструменты сборки (компиляторы, npm, go) остаются в промежуточной стадии builder, а в финальный образ копируется только готовый артефакт.
Build secrets (BuildKit)
1
RUN --mount=type=secret,id=<id> <command> # секрет доступен только на время выполнения RUN, не попадает в слой
1
export <VAR>="$(cat /run/secrets/<id>)"# чтение секрета внутри RUN с mount
Антипаттерн — передача секрета через ARG/ENV: значение остаётся в истории слоёв образа (docker history) даже после unset:
1
2
3
# ПЛОХО: секрет попадает в историю образаARG NPM_TOKENRUN npm config set //registry.npmjs.org/:_authToken=${NPM_TOKEN}
Distroless / минимальные образы
1
2
3
4
5
6
7
8
FROMgolang:1.26-alpineASbuilderWORKDIR/appCOPY . .RUNCGO_ENABLED=0 go build -o /app-binary .FROMgcr.io/distroless/static-debian13# без shell, без пакетного менеджераCOPY --from=builder /app-binary /app-binaryENTRYPOINT["/app-binary"]
1
2
3
4
gcr.io/distroless/static-debian13 # минимальный образ, статические бинарники (без libc)
gcr.io/distroless/static # + CA-сертификаты (нужен для HTTPS-запросов из приложения)
gcr.io/distroless/* # семейство distroless base images (python, nodejs, java, cc, base)
scratch # полностью пустой образ — даже без CA-сертификатов
Так как в distroless нет /bin/sh, обычные способы отладки не работают:
1
2
3
kubectl exec -it <pod> -- sh # НЕ сработает: no such file or directorykubectl debug -it <pod> --image=busybox --target=<container> # эфемерный debug-контейнер — рабочая альтернативаdocker images | grep <name> # сравнить размер distroless- и alpine-образов
Дополнительно: наиболее частые инструкции из официальной документации Docker
1
2
3
4
5
FROM<image> # база для образаRUN <command> # выполняет команду в новом слое поверх текущего образаWORKDIR<directory> # рабочая директория для RUN/CMD/ENTRYPOINT/COPY/ADDCOPY <src> <dest> # копирует файлы из контекста сборки в образCMD <command> # программа по умолчанию при запуске контейнера (только последний CMD учитывается)
Docker Hardened Images (DHI) — минимальные, регулярно патчащиеся образы от Docker с near-zero CVE; Community-уровень бесплатен, но требует явной аутентификации в реестр dhi.io (docker login dhi.io через Docker ID/PAT) перед docker pull/docker build — без логина FROM dhi.io/... не сработает даже для публичных образов:
--mount=type=cache кэширует директорию (например, pip/npm-кэш) между сборками без записи в итоговый образ; --mount=type=bind временно монтирует файл из контекста без его копирования — оба типа mount ускоряют повторные сборки в CI.