Karabas интернет-магазин
сетевого оборудования
Sergey Latskin 04 сент. 2023 Sergey Latskin 200

docker build

docker build

Docker Build Памятка

docker build - это команда Docker, которая используется для создания образа Docker из Dockerfile и контекста сборки. Контекст сборки - это набор файлов, находящихся в указанном пути или URL. Dockerfile - это текстовый документ, который содержит все команды, которые пользователь может вызвать для создания образа.

Синтаксис

docker build [OPTIONS] PATH | URL | -

Опции

  • -t, --tag - Имя и опционально тег в формате 'name:tag'. Используйте это для тегирования образа для последующего использования.
  • --build-arg - Устанавливает переменные среды, которые доступны во время сборки.
  • --file, -f - Имя Dockerfile. По умолчанию Dockerfile.
  • --no-cache - Не использовать кэш при сборке образа.
  • --rm - Удалить промежуточные контейнеры после успешной сборки.
  • --pull - Всегда пытаться вытянуть новейшую версию образа.

Примеры

  1. Сборка образа Docker из Dockerfile в текущем каталоге:
docker build -t my-app .
  1. Сборка образа Docker из Dockerfile, расположенного по определенному пути:
docker build -t my-app -f /path/to/a/Dockerfile .
  1. Сборка образа Docker без использования кэша:
docker build --no-cache -t my-app .
  1. Сборка образа Docker с использованием переменных среды:
docker build --build-arg MY_VAR=value -t my-app .

Запуск образа Docker

После того, как вы собрали образ Docker, вы можете запустить его, используя команду docker run.

docker run -d -p 8080:80 my-app

В этом примере -d означает, что контейнер будет запущен в фоновом режиме, а -p используется для перенаправления порта (в данном случае порт 8080 на хосте будет перенаправлен на порт 80 в контейнере).

Docker build - это команда, которая создает образ Docker из Dockerfile и контекста сборки. Контекст сборки - это набор файлов, находящихся в указанном пути или URL. Dockerfile - это текстовый документ, который содержит все команды, которые пользователь может вызвать для создания образа.

Как использовать Docker Build

Вот базовый синтаксис команды Docker build:

docker build [OPTIONS] PATH | URL | -
  • OPTIONS - это необязательные флаги, которые вы можете использовать с командой docker build. Например, -t позволяет вам тегировать ваш образ.
  • PATH | URL | - - это путь к каталогу, содержащему Dockerfile и контекст сборки. Это может быть URL-адрес репозитория git или URL-адрес, который указывает на tar-архив.

Пример

Допустим, у вас есть репозиторий git, содержащий ваш Dockerfile и все необходимые файлы для вашего приложения. Вы можете собрать образ Docker прямо из этого репозитория следующим образом:

docker build -t my-app https://github.com/username/my-app.git

В этом примере:

  • -t my-app - это тег, который вы присваиваете вашему образу. Это полезно для управления и идентификации образов.
  • https://github.com/username/my-app.git - это URL-адрес вашего репозитория git. Docker будет клонировать этот репозиторий и использовать его как контекст сборки.

После выполнения этой команды Docker создаст образ my-app из вашего репозитория. Вы можете проверить, что образ был успешно создан, выполнив команду docker images.

Заключение

Команда docker build - это мощный инструмент для создания образов Docker прямо из вашего репозитория git. Это упрощает процесс развертывания и обновления вашего приложения.

Docker build - это команда, которая создает образ Docker из Dockerfile и контекста строителя. Контекст строителя - это набор файлов в указанном месте. По умолчанию путь к Dockerfile - это текущий каталог.

Для сборки образа Docker из репозитория, вам нужно выполнить следующие шаги:

  1. Клонировать репозиторий

    Сначала вы должны клонировать репозиторий, который содержит ваш Dockerfile. Вы можете сделать это с помощью команды git clone. Например:

    git clone https://github.com/your-repository.git
    
  2. Перейти в директорию репозитория

    Затем перейдите в директорию, которую вы только что клонировали:

    cd your-repository
    
  3. Собрать Docker образ

    Теперь вы можете собрать Docker образ с помощью команды docker build. Например:

    docker build -t your-image-name .
    

    В этой команде -t используется для того, чтобы задать имя и тег образа, а . указывает на текущую директорию (которая должна содержать Dockerfile).

После выполнения этих шагов, Docker образ будет собран из вашего репозитория. Вы можете проверить это, выполнив команду docker images, которая покажет вам список всех доступных образов Docker.

  • --add-host: Эта команда позволяет добавить пользовательское соответствие между хостом и IP (host:ip).

  • --build-arg: Эта команда устанавливает переменные во время сборки.

  • --cache-from: Эта команда указывает образы, которые следует рассматривать как источники кэша.

  • --cgroup-parent: Эта команда определяет родительскую контрольную группу для контейнера.

  • --compress: Эта команда сжимает контекст сборки с использованием gzip.

  • --cpu-period: Эта команда ограничивает период CPU CFS (Completely Fair Scheduler).

  • --cpu-quota: Эта команда ограничивает квоту CPU CFS (Completely Fair Scheduler).

  • --cpu-shares -c: Эта команда устанавливает долю CPU (относительный вес).

  • --cpuset-cpus: Эта команда определяет, в каких CPU разрешить выполнение (0-3, 0,1).

  • --cpuset-mems: Эта команда определяет, в каких MEM разрешить выполнение (0-3, 0,1).

  • --disable-content-trust true: Эта команда пропускает проверку изображения.

  • --file -f: Эта команда указывает имя Dockerfile (по умолчанию PATH/Dockerfile).

  • --force-rm: Эта команда всегда удаляет промежуточные контейнеры.

  • --iidfile: Эта команда записывает ID изображения в файл.

  • --isolation: Эта команда определяет технологию изоляции контейнера.

  • --label: Эта команда устанавливает метаданные для изображения.

  • --memory -m: Эта команда ограничивает объем памяти.

  • --memory-swap: Эта команда устанавливает лимит свопа, равный памяти плюс своп: -1 для включения неограниченного свопа.

  • --network: Эта команда устанавливает режим сети для инструкций RUN во время сборки.

  • --no-cache: Эта команда не использует кэш при сборке изображения.

  • --platform: Эта команда устанавливает платформу, если сервер способен работать с несколькими платформами.

  • --pull: Эта команда всегда пытается загрузить более новую версию изображения.

  • --quiet -q: Эта команда подавляет вывод сборки и печатает ID изображения при успешном завершении.

  • --rm true: Эта команда удаляет промежуточные контейнеры после успешной сборки.

  • --security-opt: Эта команда устанавливает параметры безопасности.

  • --shm-size: Эта команда устанавливает размер /dev/shm.

  • --squash: Эта команда объединяет вновь созданные слои в один новый слой.

  • --tag -t: Эта команда указывает имя и, возможно, тег в формате name:tag.

  • --target: Эта команда устанавливает целевую стадию сборки для сборки.

  • --ulimit: Эта команда устанавливает параметры ulimit.

Для сборки Docker образа из архива и файла вам понадобится Dockerfile. Dockerfile - это текстовый документ, который содержит все команды, которые пользователь может вызвать для создания образа.

Вот шаги, которые вы должны следовать:

  1. Создайте Dockerfile в своем проекте. Он должен выглядеть примерно так:
# Используйте официальный образ Python с вашей предпочитаемой версией Python
FROM python:3.8

# Установите рабочую директорию в контейнере
WORKDIR /app

# Скопируйте текущую директорию в рабочую директорию контейнера
ADD . /app

# Установите все необходимые пакеты
RUN pip install --no-cache-dir -r requirements.txt

# Запустите приложение, когда контейнер запускается
CMD ["python", "your-app.py"]
  1. Соберите Docker образ, используя команду docker build. Не забудьте указать точку в конце команды, это означает, что Docker должен искать Dockerfile в текущей директории.
docker build -t your-image-name .
  1. После успешной сборки вы можете запустить свой образ с помощью команды docker run.
docker run -p 4000:80 your-image-name

В этом примере, ваше приложение будет доступно по адресу localhost:4000 в вашем веб-браузере.

Примечание: Если вы хотите собрать Docker образ из архива, вам нужно сначала извлечь файлы из архива в вашу рабочую директорию.

Docker контейнеры используют теги для идентификации различных версий образов Docker. Это позволяет разработчикам и системным администраторам легко отслеживать, управлять и развертывать различные версии образов Docker.

Структура тега Docker

Структура тега Docker обычно выглядит следующим образом:

repository:tag

где:

  • repository - это имя репозитория Docker, в котором хранится образ.
  • tag - это уникальный идентификатор, который используется для идентификации конкретной версии образа Docker в репозитории.

Например, в ubuntu:18.04:

  • ubuntu - это имя репозитория.
  • 18.04 - это тег, который идентифицирует конкретную версию образа Ubuntu.

Использование тегов Docker

Теги Docker обычно используются при сборке и развертывании образов Docker. Например, вы можете использовать следующую команду для сборки образа Docker с определенным тегом:

docker build -t repository:tag .

Вы также можете использовать теги Docker при запуске контейнера Docker. Например, вы можете использовать следующую команду для запуска контейнера Docker с определенным образом и тегом:

docker run -d -p 80:80 repository:tag

Важность тегов Docker

Теги Docker важны по следующим причинам:

  • Версионирование: Теги Docker позволяют разработчикам и системным администраторам легко отслеживать и управлять различными версиями образов Docker.
  • Организация: Теги Docker помогают организовать образы Docker в репозитории.
  • Управление развертыванием: Теги Docker позволяют разработчикам и системным администраторам контролировать, какие версии образов Docker должны быть развернуты в определенное время. Dockerfile - это текстовый документ, который содержит все команды, которые пользователь может вызвать в командной строке для создания образа Docker. Используя docker build, пользователи могут создавать автоматизированные сборки, которые включают в себя все зависимости в одном образе. Это делает его более простым в использовании, поскольку пользователю не нужно устанавливать все зависимости вручную.

Структура Dockerfile

Dockerfile обычно начинается с указания базового образа. Затем он выполняет необходимые команды для добавления файлов, установки пакетов и других настроек, и в конце указывает, какой командой нужно запустить контейнер.

Пример Dockerfile:

# Use an official Python runtime as a parent image
FROM python:3.7-slim

# Set the working directory in the container to /app
WORKDIR /app

# Add the current directory contents into the container at /app
ADD . /app

# Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r requirements.txt

# Make port 80 available to the world outside this container
EXPOSE 80

# Define environment variable
ENV NAME World

# Run app.py when the container launches
CMD ["python", "app.py"]

Команды Dockerfile

  • FROM устанавливает базовый образ для последующих инструкций.
  • WORKDIR устанавливает рабочую директорию для последующих инструкций.
  • ADD копирует новые файлы, каталоги или удаленные файлы URL и добавляет их в файловую систему образа.
  • RUN выполняет любую команду в новом слое поверх текущего образа и коммитит результаты.
  • EXPOSE информирует Docker, что контейнер слушает указанные сетевые порты во время выполнения.
  • ENV устанавливает переменную окружения.
  • CMD предоставляет значения по умолчанию для исполняемого контейнера.

Использование Dockerfile

Чтобы собрать образ Docker из Dockerfile, вы можете использовать команду docker build. Например:

docker build -t your-image-name .

Эта команда считывает Dockerfile в текущем каталоге, собирает новый образ Docker и присваивает ему имя your-image-name.

FROM - это команда в Dockerfile, которая указывает базовый образ для последующих инструкций. Это первая инструкция, которую следует указать в Dockerfile.

Синтаксис команды FROM выглядит следующим образом:

FROM <имя образа>[:<тег>]
  • <имя образа>: это имя базового образа Docker, который вы хотите использовать. Например, ubuntu, alpine, nginx, node, python и т.д.
  • <тег>: это опциональный параметр, который позволяет указать конкретную версию образа. Например, ubuntu:18.04.

Пример использования команды FROM:

FROM ubuntu:18.04

Образы Docker можно искать в Docker Hub, который является облачным репозиторием, где хранятся и распространяются образы Docker. Docker Hub предлагает как публичные, так и приватные репозитории.

Вы можете посетить Docker Hub и использовать поисковую строку для поиска образов. Например, если вы ищете образ Ubuntu, просто введите "Ubuntu" в поисковую строку и нажмите Enter.

Кроме того, вы можете использовать команду docker search в командной строке для поиска образов. Например:

docker search ubuntu

Эта команда вернет список образов Ubuntu, доступных на Docker Hub.

ulimit - это команда Unix, которая предоставляет контроль над ресурсами системы. Docker может использовать ulimit для ограничения ресурсов контейнера.

Когда вы запускаете контейнер с помощью Docker, вы можете использовать флаг -ulimit для установки ограничений на ресурсы, которые контейнер может использовать.

Вот пример использования команды -ulimit в Docker:

docker run -it --ulimit nofile=1024:1024 ubuntu

В этом примере nofile=1024:1024 устанавливает мягкое и жесткое ограничения на количество открытых файлов для контейнера. Мягкое ограничение может быть увеличено пользователем до уровня жесткого ограничения. Жесткое ограничение может быть увеличено только суперпользователем.

Вы можете установить различные ограничения, такие как core (ограничение на размер дампа памяти), cpu (ограничение на использование процессора), data (ограничение на размер данных), fsize (ограничение на размер файла) и многие другие.

Однако следует отметить, что не все ограничения ulimit могут быть установлены в Docker. Например, ограничения nice и priority не поддерживаются.

Важно понимать, что установка ограничений ulimit может повлиять на работу контейнера. Например, если вы установите ограничение на количество открытых файлов слишком низко, это может привести к ошибкам в работе контейнера.

Команда --build-arg в Docker используется для передачи аргументов сборки во время процесса сборки образа Docker. Это может быть полезно, когда вам нужно передать определенные значения во время сборки, которые используются в Dockerfile.

Синтаксис команды выглядит следующим образом:

docker build --build-arg <varname>=<value>

Где <varname> - это имя аргумента, которое вы хотите передать, а <value> - это соответствующее значение этого аргумента.

Например, если у вас есть Dockerfile, который использует аргумент сборки VERSION, вы можете передать значение этого аргумента следующим образом:

docker build --build-arg VERSION=1.0.0 .

В этом случае, VERSION будет иметь значение 1.0.0 во время процесса сборки.

В Dockerfile, вы можете использовать аргументы сборки с помощью инструкции ARG. Например:

FROM node:14

ARG VERSION

RUN echo "Version: $VERSION"

В этом примере, VERSION будет заменено на значение, которое вы передали с помощью --build-arg во время сборки.

Обратите внимание, что аргументы сборки не сохраняются в собранном образе. Если вы хотите, чтобы переменные были доступны во время выполнения контейнера, вы должны использовать инструкцию ENV в Dockerfile.

--security-opt

Команда --security-opt в Docker используется для настройки параметров безопасности контейнера. Она позволяет управлять такими функциями, как профили безопасности и метки.

Синтаксис команды выглядит следующим образом:

docker run --security-opt [option]=[value]

Примеры использования

  1. AppArmor

    AppArmor - это система безопасности на уровне ядра Linux, которая помогает ограничивать действия процессов на основе определенных правил. Вы можете использовать --security-opt для указания профиля AppArmor для вашего контейнера.

    docker run --security-opt apparmor=your_apparmor_profile
    
  2. Seccomp

    Seccomp (безопасная вычислительная модель) - это другая функция безопасности Linux, которая позволяет ограничивать системные вызовы, которые может выполнять процесс. Вы можете использовать --security-opt для указания профиля Seccomp для вашего контейнера.

    docker run --security-opt seccomp=your_seccomp_profile.json
    
  3. SELinux

    SELinux (Security-Enhanced Linux) - это модуль безопасности ядра Linux, который предоставляет механизм для поддержки политики безопасности доступа. Вы можете использовать --security-opt для управления метками SELinux.

    docker run --security-opt label=user:USER
    docker run --security-opt label=role:ROLE
    docker run --security-opt label=type:TYPE
    docker run --security-opt label=level:LEVEL
    

Предупреждения

  • Не все опции безопасности доступны на всех платформах и во всех конфигурациях.
  • Некоторые опции безопасности могут существенно влиять на поведение и функциональность вашего контейнера.
  • Всегда тестируйте свои контейнеры и их безопасность перед развертыванием в производственной среде.

Команда --isolation в Docker используется для указания уровня изоляции контейнера. Это особенно полезно в средах Windows, где доступны различные уровни изоляции.

Синтаксис команды выглядит следующим образом:

docker run --isolation=<type> <image>

Здесь <type> - это тип изоляции, который вы хотите использовать, а <image> - это образ Docker, который вы хотите запустить.

Возможные значения для <type> включают:

  • default: использует уровень изоляции по умолчанию, который определен в конфигурации Docker.
  • process: каждый контейнер запускается в своем собственном пространстве имен, но он разделяет ядро с хостом. Это обеспечивает высокий уровень изоляции с минимальными накладными расходами.
  • hyperv: каждый контейнер запускается в своей собственной виртуальной машине, обеспечивая максимальный уровень изоляции за счет некоторых дополнительных накладных расходов.

Пример использования:

docker run --isolation=hyperv ubuntu

В этом примере мы запускаем образ Ubuntu с уровнем изоляции hyperv. Это означает, что контейнер будет работать в своей собственной виртуальной машине, обеспечивая максимальный уровень изоляции.

Команда --add-host

в Docker используется для добавления записи в файл /etc/hosts контейнера. Это может быть полезно, если вы хотите перенаправить трафик с одного домена на другой или на определенный IP-адрес, или если вам нужно протестировать связь с определенным хостом без изменения DNS.

Синтаксис

Синтаксис команды следующий:

docker run --add-host=host:ip ...

где host - это имя хоста, которое вы хотите добавить, а ip - это IP-адрес, на который вы хотите перенаправить трафик.

Пример

Допустим, вы хотите перенаправить все запросы к my.test.com на IP-адрес 127.0.0.1. Вы можете сделать это, запустив контейнер с флагом --add-host:

docker run --add-host=my.test.com:127.0.0.1 ...

Теперь, когда ваше приложение внутри контейнера пытается подключиться к my.test.com, оно будет перенаправлено на 127.0.0.1.

Ограничения

Обратите внимание, что вы не можете использовать --add-host для переопределения встроенных DNS Docker, таких как localhost. Если вы попытаетесь это сделать, Docker вернет ошибку.

Также стоит отметить, что изменения, внесенные с помощью --add-host, применяются только к конкретному контейнеру, в котором они были выполнены. Если вы хотите, чтобы эти изменения применялись ко всем вашим контейнерам, вам нужно будет добавить --add-host к каждому из них отдельно.

Команда --target

в Docker используется вместе с командой docker build для указания конкретной стадии сборки, которую следует собрать. Это полезно, если у вас есть многоэтапный Dockerfile и вы хотите собрать только определенную стадию.

Синтаксис команды выглядит следующим образом:

docker build --target <target_stage> -t <tag> .

где <target_stage> - это имя стадии, которую вы хотите собрать, а <tag> - это тег, который вы хотите присвоить этому изображению.

Например, если у вас есть Dockerfile, который выглядит так:

# syntax=docker/dockerfile:1
FROM alpine AS base
WORKDIR /app
COPY . .

FROM base AS dev
RUN apk add --no-cache python3
CMD ["python3", "-m", "http.server"]

FROM base AS prod
RUN apk add --no-cache nginx
CMD ["nginx", "-g", "daemon off;"]

Вы можете собрать только стадию dev следующим образом:

docker build --target dev -t myapp:dev .

Это создаст образ Docker с тегом myapp:dev, который будет содержать все слои до и включая стадию dev.

Команда --output

в Docker используется для указания формата вывода информации. Это может быть полезно, когда вы хотите просмотреть определенные детали о ваших контейнерах или образах.

Синтаксис команды выглядит следующим образом:

docker <command> --output="{{.Field}}"

Здесь <command> - это команда Docker, которую вы хотите выполнить, а Field - это поле, информацию о котором вы хотите получить.

Например, если вы хотите просмотреть идентификаторы всех ваших образов Docker, вы можете использовать следующую команду:

docker images --output="{{.ID}}"

Эта команда вернет список идентификаторов всех ваших образов Docker.

Обратите внимание, что команда --output доступна только в Docker 1.13 и более поздних версиях. Если вы используете более старую версию Docker, вы можете использовать команду --format для достижения того же результата.

Docker образы состоят из слоев (layers)

которые представляют собой набор изменений в файловой системе. Каждый слоев создается во время выполнения инструкции Dockerfile. При создании образа Docker, каждая инструкция Dockerfile создает новый слой в образе.

Слои Docker образа являются read-only, то есть они не могут быть изменены после создания. Однако, когда контейнер запускается из образа, Docker добавляет верхний слой, который является доступным для записи. Этот слой называется "слоем контейнера".

Опция --squash (экспериментальная) позволяет объединить все слои образа Docker в один. Это может быть полезно для уменьшения размера образа и упрощения его структуры.

Пример использования команды --squash:

docker build --squash -t my_image .

В этом примере, Docker сначала создаст образ как обычно, со всеми слоями, которые определены в Dockerfile. Затем, он объединит все эти слои в один, используя опцию --squash.

Обратите внимание, что опция --squash является экспериментальной и может не быть доступна в вашей версии Docker. Для включения экспериментальных функций в Docker, вам нужно установить переменную окружения DOCKER_CLI_EXPERIMENTAL в enabled.

export DOCKER_CLI_EXPERIMENTAL=enabled

После этого вы сможете использовать опцию --squash при сборке образов Docker.