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 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) -
Параметры для
restart
no
(или не указывать restart вовсе) — контейнер не будет перезапускаться автоматически. Это значение по умолчаниюalways
— контейнер будет автоматически перезапущен при любом завершении работы (даже при ручной остановке через docker stop). Он также перезапустится после перезагрузки Docker или хостаon-failure
— контейнер будет перезапущен только в случае выхода с ненулевым статусом (ошибкой). Вы можете также указать максимальное количество перезапусков, например,on-failure:3
unless-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=
При использовании |-
переносы строк сохраняются как есть