Docker
Полезные источники#
Команды#
-
docker ps --format "{{.Names}}"- только имена контейнеров -
docker ps -s- показать размеры контейнеров (-l- последний запущенный контейнер) docker logs -f --tail 100 my_app- смотреть последние 100 строк и дальше в реальном времениdocker history <image_name>- история создания образа (--no-trunc- не обрезать вывод)docker volume ls- список всех Docker томов на хостеdocker volume inspect <volume_name>- информацию о конкретном docker томе, например, его местоположение, размер и настройки и тпdocker system df- посмотреть сколько места что занимаетdocker inspect <container_name> | grep -i volumes- ищет информацию о томах, которые примонтированы к контейнеруdocker port <container_name>- показывает маппинг портовdocker inspect <container_name> | grep -i port- подробности о проброшенных портахdocker inspect <container_name> | grep -i mount- показывает информацию о монтированиях (volumes, bind mounts, tmpfs)
Монтирования в Docker
-
Named Volume - создаётся и управляется Docker. Хранится в
/var/lib/docker/volumes/ -
Anonymous Volume - создаётся и управляется Docker. Хранится в
/var/lib/docker/volumes/, но вместо имени хэш, например,/var/lib/docker/volumes/2f4b7c3e8e1a7d9b8b12d34c7e4b1234/services: app: image: nginx volumes: - /usr/share/nginx/html 3. Bind Mount - привязка к директории или файлу на хосте. Если мы прокидываем файл и его не существует Docker создаст каталог. ```yaml services: web: image: nginx volumes: - ./html:/usr/share/nginx/html:ro:ro- контейнеру том доступен только для чтения, по умолчанию доступен и на запись (:rw) -
Tmpfs Mount - данные хранятся в оперативке (RAM), а не на диске, при перезапуске, удалении контейнера данные будут потеряны.
-
External Volume - внешний том, например, NFS.
-
docker stats- статистика по запущенным контейнерам- CONTAINER ID - Уникальный идентификатор контейнера.
- NAME - Имя контейнера.
- CPU % - Использование CPU в процентах.
- MEM USAGE / LIMIT - Использование памяти / установленный лимит.
- MEM % - Доля использования памяти от лимита.
- NET I/O - Сетевой ввод/вывод данных.
- BLOCK I/O - Объем операций ввода/вывода на диске.
- PIDS - Количество процессов внутри контейнера.
-
docker info- инфа о докер (docker info --format '{{json .}}' - в json) -
Параметры для
restartno(или не указывать restart вовсе) — контейнер не будет перезапускаться автоматически. Это значение по умолчаниюalways— контейнер будет автоматически перезапущен при любом завершении работы (даже при ручной остановке через docker stop). Он также перезапустится после перезагрузки Docker или хостаon-failure— контейнер будет перезапущен только в случае выхода с ненулевым статусом (ошибкой). Вы можете также указать максимальное количество перезапусков, например,on-failure:3unless-stopped— контейнер будет автоматически перезапущен при сбоях и после перезагрузки Docker или системы, но не перезапустится, если его остановили вручную.
Разное#
ARG#
Аргументы сборки (ARG) не сохраняются в конечном образе. ARG используется для передачи значений на этапе сборки. Эти значения доступны только во время сборки образа и не сохраняются в конечном образе. Также ARG не сохраняется в слоях образа, т.е. с помощью docker history <image_name>:<tag> значение переменной не посмотреть. Нельзя получить доступ к значению ARG из финального образа.
Как докер ищет образы?#
- Докер сначала проверяет есть ли образ с указанным именем и тегом локально на хосте (в кэше Docker)
- Если образ не найден локально, докер ищет его в registry по умолчанию, то есть в Dockerhub, Docker пытается спуллить образ с докер хаб, если тэг не указан, Docker использует тег
latestпо умолчанию - Дальше Docker идет в настроенный Docker registry и ищет образ там, например,
image: registry.example.com/myimage:tag -
Если образ не найден и в docker-compose.yml указана секция build, Docker создаст образ локально из Dockerfile, который находится в указанной директории. Пример в docker-compose.yml:
Последовательность -
Ищет локально на хосте.
- Ищет на Docker Hub.
- Ищет в частных реестрах (если указан).
- Сборка из Dockerfile (если указана опция build в docker-compose.yml).
В чём разница сежду ENTRYPOINT и CMD#
ENTRYPOINT и CMD [] (без квадратных скобок оболочка будет использована) не использует оболочку для выполнения команды, команда передаётся напрямую процессу, то есть пайпы и всякие приблуды оболочки не работают Docker не запускает оболочку, а передает команду напрямую в процесс.
CMD можно переопределить при запуске контейнера
ENTRYPOINT задает команду, которая всегда будет выполняться при запуске контейнера. ENTRYPOINT используется для установки основной команды, которая должна быть выполнена, и она не может быть переопределена при запуске контейнера.ENTRYPOINTзадаёт команду, которая всегда будет выполняться. Она не должна быть переопределена при запуске контейнера.CMDзадаёт аргументы по умолчанию дляENTRYPOINT. ЕслиENTRYPOINTне указан, используетсяCMD, иCMDможно легко переопределить при запуске контейнера
Хэлфчеки#
Когда мы пишем
Это значит что все хелфчеки к сервису (контейнеру) postgresql-db должны выполниться успешно, только после этого контейнер начнёт подниматься
&&#
Оператор && в командах оболочки используется для цепочки команд, где следующая команда выполняется только если предыдущая выполнилась успешно (с кодом возврата 0).
>- и |-#
Когда нужно указать много переменных окружения в compose можно использовать >-
# Ещё пример
environment:
CATALINA_OPTS: >-
-XX:+UseContainerSupport
-XX:MaxRAMPercentage=80.0
-server
-XX:+UseParallelGC
-Dfile.encoding=UTF-8
-Djava.security.egd=file:/dev/./urandom
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9000
-Dcom.sun.management.jmxremote.rmi.port=9000
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=
При использовании |- переносы строк сохраняются как есть