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:16
docker 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-app
buildx install
- установкаbuildx
buildx 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/Moscow
exec
- выполнение команды внутри контейнера
-it - переход на командную строку внутри контейнера, например,exec -it <id> /bin/bash
(или/bin/sh
), а для выхода из bash используетсяexit
start/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+C
docker 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/Moscow
FROM
- используемый образ,latest
- последняя версия,alpine
- минимальная по объёму версия
Пример:FROM python:alpine
RUN
- запуск по командной строке
Примеры:mkdir -p /usr/src/app/
,dotnet build "App.csproj" -c Release -o /app/build
,RUN pip install mongo
WORKDIR
- устанавливает рабочий каталог, в котором будут выполняться команды для инструкций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
файла, либо указывается абсолютный, доDockerfile
context
-working_dir
- рабочая директория для сервисаvolumes
- подключение внешних папокrestart
-command
- выполнение команды в дополнение кENTRYPOINT
depends_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
.