Docker справочник
Полезные ссылки
- Docker документация
- Docker cheat sheet
- Курс для Начинающих - трёх часовое видео, от базы, до составления
Dockerfileи использованиеdocker-compose.yml - Лучшие практики
- ENTRYPOINT vs CMD
- Multi-stage билды
- Use bind mounts
- Дополнительные материалы для изучения с МК
Компоненты
Client(клиент) -Daemon(служба) -Host(хост) -Image(образ) - readonly образ приложенияContainer(контейнер) - работающее приложение на основе образаVolume(том) - файл или каталог, который хранится вне контейнера и подключается к немуDockerfile- файл описания образа- Cлой - выполнение каждой команды в Dockerfile
docker-compose.yml- файл декларативного описания compose, в отличие от императивного подхода, когда выполняешь действия команда за командойRepository(репозиторий) - хранилище образов, например HubRegistry(реестр)
Программное обеспечение
Образы
Версии образов
latest- тег по-умолчанию, чаще всего туда публикуют последнюю стабильную версиюalpine- легковесный образ, без лишнего
Команды docker <command>
docker save -o <path for generated tar file> <image name>- сохранить образ в файл без использования репозитория, пример:docker save -o c:/myfile.tar centos:16docker load -i <path to image tar file>- загрузить образ
Общие команды
Установка Docker на Linux curl -sSL https://get.docker.com/ | sh, sudo apt install docker
docker <command>
save <image-name> > <file-name.tar>- сохранение контейнера в файлstats- статистика в реальном времени по использованию ресурсов контейнерами
Основные команды
Билды
Формат вызова команды docker <command>
build- сборка образа по файлуDockerfile
Пример:docker build . -t some-appbuildx install- установкаbuildxbuildx ls- для каких платформ можно делать билд
Формат вызова команды docker <command>
image- работа с образамиimages- список доступных образов в репозитории
-q - вывести список идентификаторов образов
Пример:docker rmi $(docker images -q)- удаление всех образовsearch <query>- поиск в Docker Hubpull <image name>- загрузить образ из репозиторияtag some-local-app:tag login/some-app:tag- пометить тегом для пушаpush <tag name>- загрузить образ в репозиторий с указанием тегаcreate- создаёт контейнер, но не запускает егоrun- запуск контейнера, с параметром
–rm - удаляет контейнер после завершения работы
–restart - поведение контейнера после крэша или перезагрузки, например,unless-stopped
-it - интерактивно можно видеть весь вывод на консоль
-p - переадресация портов в порядке на какой-откуда, пример8080:80, где80порт является внутренним портом контейнера
-d - запускает в фоновом режиме контейнер с возвращением в командную строку
–entrypoint bash - при запуске попадаем в командную строку контейнера
-u root - указать имя пользователя, в данном случае зайти под рутом и можно будет устанавливать приложения
-v - подключение тома в порядке на какой-откуда, пример-v "/home/foo/app:/data"или-v ${PWD}:/data, где${PWD}- это переменная, указывающая на текущую директорию, а папкаdataявляется папкой внутри контейнера
–network host - запуск контейнера локально на машине, не изолированно
–name - имя образа, указывается самым последним, если не указать, то генерируется автоматически
–network-alias - задать алиас контейнеру для обращения из других контейнеровps- список запущенных контейнеров
-a - список с уже запускавшимися контейнерами-e- указание переменной окружения
Пример:-e TZ=Europe/Moscowexec- выполнение команды внутри контейнера
-it - переход на командную строку внутри контейнера, например,exec -it <id> /bin/bash(или/bin/sh), а для выхода из bash используетсяexitstart/stop <container name>- выполнение/остановка ранее запущенного контейнераrmi <image id>- удаление образаrm <container id or name>- удаление контейнера по идентификатору или имениhistory- история образаlogs <name>- логи контейнера, то что пишется в консольcontainer logs -f <container id>- в динамике следить за консолью контейнераinspect <container name>- получение информации по контейнеру: ip, портыattach <container name>- подключение к контейнеруupdate --restart unless-stopped qshZone- обновляет параметры уже созданного контейнера
Полезные команды
docker run --rm telegraf telegraf config > telegraf.conf- извлечение файла конфигурации из контейнера, так как он будет перетерт, если будут использоваться volumesdocker run --rm -it -p 8080:80 lps-app- запуск контейнера с приложением, которое будет доступно на порту 8080 и контейнер будет удалён после остановки приложения поCtrl+Cdocker run -v ${PWD}:/usr/share/nginx/html nginx- запуск контейнера с nginx и указание внешней папки с index.htmldocker build . -t some-app --build-arg <varname>=<value>- построить образ с указанием тега и переменныхdocker exec -it <id/name> /bin/bashилиexec -it <id> sh- запуск интерактивно в оболочке, чтобы работать внутри контейнера-
docker run -it --rm --entrypoint <shell> dotnet/sdk:6.0- запуск контейнера по определённому образу и сразу перейти к командной строке,shellможет бытьbashилиsh docker container prune- очищает список контейнеров, которые не запущеныdocker rm $(docker ps -f status=exited -q)- удаляет всё завершившие работу контейнерыdocker image prune- очищает список образов, которые не используются-
docker rm $(docker ps -qa)- передача id всех контейнеров для удаления docker build -t vicerust/core:$(git rev-parse --verify HEAD)- билд с указанием в теге хэша последнего коммита
Тома Volumes
Команда docker <command>
volume ls- список томовvolume create web- создание тома, неважно где будет располагаться папкаrun ... -v web:/usr/src/app web-hello- указание тома при запуске контейнераrun --mount source=my-volume,target=/app- второй вариант черезmount
Сети Networks
По-умолчанию Docker создаёт несколько сетей
none- только локальная сеть в контейнереhost- без виртуализации, сеть локальной машины, как если бы приложение было запущено вне контейнераbridge- режим моста- допольнительно
macvlan - допольнительно
ipvlan
Команда docker network <command>
ls- вывести список сетейinspect <network name>- получить информацию о сети и какие контейнеры в неё входят
Dockerfile - сборка образа
Файл Dockerfile служит для описания шагов для формирования образа, который получается после билда файла.
https://docs.docker.com/engine/reference/builder/
При выполнении каждой команды создаётся новый слой, все эти слои могут выполняться параллельно.
Команды Dockerfile
EXPOSE- порт, который будет открыт в контейнереLABEL- добавляет метаданные для образа, например, информацию об автореENV- указание переменной окружения
Пример:ENV TZ Europe/MoscowFROM- используемый образ,latest- последняя версия,alpine- минимальная по объёму версия
Пример:FROM python:alpineRUN- запуск по командной строке
Примеры:mkdir -p /usr/src/app/,dotnet build "App.csproj" -c Release -o /app/build,RUN pip install mongoWORKDIR- устанавливает рабочий каталог, в котором будут выполняться команды для инструкцийRUN,CMD,ENTRYPOINT,COPYиADD, при необходимости создаётся.WORKDIR /dir- относительно корня, аWORKDIR folder- относительно рабочего каталогаCOPY- копирование файлов Пример:COPY . .- из текущей папки выполнения DOckerfile в рабочую папку контейнераCMD- что нужно сделать, когда контейнер будет запущен, запускается через оболочку shell
Пример:CMD ["python, "app.py"]ENTRYPOINT- выполняется без shell оболочки
Пример:ENTRYPOINT ["python, "app.py"]ARG- указывает переменную, который пользователь может указывать во времяdocker build --build-arg user=newuser, таких инструкций может быть любое количество. Не рекомендуется передавать секреты, так как выполняемые команды сохраняются вdocker history. Для указания значения по-умолчанию, вместоARG user, можно указатьARG user=someuser. Использовать переменные можно через$user.USER- устанавливает пользователя или группу для инструкцийRUN,ENTRYPOINTиCMD.
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build-content
ARG DOCKER_SERVICE_NAME
COPY Source/$DOCKER_SERVICE_NAME /app-src
WORKDIR /app-src
RUN dotnet restore --source "https://some-custom-source/repository/nuget/index.json"
RUN dotnet publish -c Release -o /app-publish
FROM ubuntu:18.04
ARG DOCKER_VAULT_TOKEN
ARG DOCKER_SERVICE_PORT
EXPOSE $DOCKER_SERVICE_PORT
WORKDIR /app
COPY --chmod=777 --from=build-content /app-publish .
COPY Docker/temp_appsettings.json appsettings.json
RUN echo "$DOCKER_VAULT_TOKEN" > ~/.vault-token
Compose
Docker Compose это аналог Docker Stack, только compose частично не соответствует спецификации и игнорирует часть команд, stack же обрабатывает всё.
- Все необходимые контейнеры запускаются одной командой
- Автоматическое создание контейнеров
- Создание изолированной сети для взаимодействия контейнеров
- Взаимодействие между контейнерами может быть через имена сервисов
Команды
docker-compose up- запустить контейнеры
-d - выполнение в фоновом режиме, по-умолчанию выполняется в интерактивном режиме –build - заново создать образы, в случае изменения исходников приложения нужно исапользовать каждый разdocker-compose down- остановить контейнеры и удалить
version: '3.8'
volumes:
mongodb_volume:
services:
app:
build: ./app
context: ../
working_dir: /app
dockerfile: ./Docker/dockerfile
args:
DOCKER_VAULT_TOKEN: ${DOCKER_VAULT_TOKEN}
DOCKER_SERVICE_NAME: ${DOCKER_SERVICE_NAME}
ports:
- "8090:7073"
hostname: ${DOCKER_SERVICE_NAME}Docker-${USERNAME}
command: app.dll
restart: always
depends_on:
- mongo
mongo:
image: mongo
volumes:
- mongodb_volume:/data/db
restart: always
Здесь
app,mongo- имена сервисов, по ним можно обращаться, например, указывать вместо ip в строке подключения- Сначала будет создан образ для
appи потом будет запущен контейнер для него, а потом будет запущен контейнер дляmongo - Оба контейнера будут находиться в единой сети и к ним можно обращаться по именам сервисов
appиmongo, например, в строке подключения - В некоторых случаях важен порядок выполнения сервисов, нужно учитывать создающийся кэш
build- путь пишется относительноymlфайла, либо указывается абсолютный, доDockerfilecontext-working_dir- рабочая директория для сервисаvolumes- подключение внешних папокrestart-command- выполнение команды в дополнение кENTRYPOINTdepends_on-
Команды docker-compose
exec <service name> <command>- выполнение команды, например,docker-compose exec bash
Разное
Сброс пароля под wsl для Windows
- Необходимо запустить PowerShell из под администратора
- Выполнить
wsl -u rootдля входа под рутом - Выполнить
passwd <user login>- для ввода нового пароля
Перезапуск WSL
Чтобы перезапустить WSL, необходимо выполнить команду PowerShell, запущенной под администратором Restart-Service LxssManager.