Облачная платформаAdvanced

Как создать образ контейнера?

Язык статьи: Русский
Показать оригинал
Страница переведена автоматически и может содержать неточности. Рекомендуем сверяться с английской версией.

Для рассмотрения предлагаются два подхода. Подход 1 предназначен для образов, которые будут обновляться лишь время от времени, тогда как подход 2 — для образов, которые будут часто обновляться.

  • Подход 1: создание снимка. Этот подход включает три ключевых шага: (1) Запустить базовый контейнер, запустив базовый образ (например, образ Ubuntu); (2) установить программное обеспечение контейнерного движка внутри базового контейнера; (3) создать снимок контейнера.
  • Подход 2: создание Dockerfile для сборки образа. Этот подход включает два ключевых шага: (1) Записать инструкции по установке программного обеспечения в Dockerfile; (2) выполнить команду docker build для сборки образа из Dockerfile.

Подход 1: создание снимка

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

Рисунок 1 Создание снимка


Процедура:

  1. Установите программное обеспечение контейнерного движка на хост.
  2. Start an empty base container in the interactive mode.

    For example, start a CentOS container in the interactive mode.

    docker run -it centos

  3. Выполните следующие команды для установки целевого программного обеспечения:

    yum install XXX

    git clone https://github.com/lh3/bwa.git

    cd bwa;make

    Note

    Установите Git заранее и проверьте, установлен ли SSH‑ключ на локальном хосте.

  4. Запустите команду exit, чтобы выйти из контейнера.
  1. Создайте Снапшот.

    docker commit -m "xx" -a "test" container-id test/image:tag

    • -a: указывает автора базового образа.
    • container-id: указывает ID контейнера, который вы запустили на шаге 2. Вы можете выполнить команду docker ps -a, чтобы запросить ID контейнера.
    • -m: указывает сообщение коммита.
    • test/image:tag: указывает имя репозитория/имя образа:тег.

  1. Запустите команду docker images, чтобы вывести список построенных образов контейнеров.

Подход 2: Создание Dockerfile для сборки образа

Этот подход подходит для образов, которые будут часто обновляться. В Approach 1 вы создаёте Снапшот всего контейнера. Это может быть трудоемко, если вам нужно часто обновлять образы. В этом случае предлагается Approach 2 для автоматизации процесса сборки образа.

Идея Approach 2 состоит в том, чтобы записать процесс Approach 1 в Dockerfile, а затем выполнить команду docker build -t test/image:tag., чтобы автоматически собрать образ из Dockerfile. В приведённой выше команде . указывает путь к Dockerfile.

Figure 2 Создание Dockerfile для сборки образа


Пример Dockerfile:

Note

Если требуется внешняя сеть, убедитесь, что сетевое подключение доступно.

#Version 1.0.1
FROM centos:latest
# Setting the root user as the executor of subsequent commands
USER root
# Performing operations
RUN yum update -y
RUN yum install -y java
# Using && to concatenate commands
RUN touch test.txt && echo "abc" >>abc.txt
# Setting an externally exposed port
EXPOSE 80 8080 1038
# Adding a network file
ADD https://www.baidu.com/img/bd_logo1.png /opt/
# Setting an environment variable
ENV WEBAPP_PORT=9090
# Setting a work directory
WORKDIR /opt/
# Setting a start command
ENTRYPOINT ["ls"]
# Setting start parameters
CMD ["-a", "-l"]
# Setting a volume
VOLUME ["/data", "/var/www"]
# Setting the trigger operation for a sub-image
ONBUILD ADD . /app/src
ONBUILD RUN echo "on build executed" >> onbuild.txt

Базовый синтаксис Dockerfile

  • FROM:

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

  • MAINTAINER:

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

  • RUN:

    Он используется для изменения образа. Обычно команды RUN выполняются для установки библиотек, а также установки и настройки программ. После выполнения команды RUN будет создан слой образа поверх текущего образа. Следующая команда будет выполнена на новом образе. Инструкция RUN может быть в одном из следующих форматов:

    • RUN yum update: Команда, которая выполняется в каталоге /bin/sh.
    • RUN ["yum", "update"]: Непосредственно вызвать exec.
    • RUN yum update && yum install nginx: Используйте && для соединения нескольких команд в инструкции RUN.
  • EXPOSE:

    It is used to specify one or more network ports that will be exposed on a container. If there are multiple ports, separate them by spaces.

    -P (uppercase) для сопоставления портов, указанных в EXPOSE, со случайными портами на хосте. Другие контейнеры или хосты могут взаимодействовать с контейнером через порты хоста.

    Вы также можете использовать -p (lowercase) для экспонирования портов, которые не указаны в EXPOSE.

  • ADD:

    Он используется для добавления файла в новый образ. Файл может быть файлом хоста, сетевым файлом или папкой.

    • Первый параметр: исходный файл (папка)
      • Если используется относительный путь, этот путь должен соответствовать каталогу, в котором находится Dockerfile.
      • Если используется URL, файл необходимо сначала загрузить, а затем добавить в образ.
    • Второй параметр: целевой путь
      • Если исходный файл находится в файле .zip или .tar, контейнерный движок распаковывает файл и затем добавляет его в указанное место образа.
      • Если исходный файл является сжатым сетевым файлом, указанным через URL, файл не будет распакован.
  • VOLUME:

    Он используется для создания точки монтирования для указанного пути (файл или папка) в образе. Несколько контейнеров могут совместно использовать данные через одну и ту же точку монтирования. Даже если один из контейнеров остановлен, точка монтирования всё ещё доступна.

  • WORKDIR:

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

  • ENV:

    Он используется для установки переменной окружения при запуске контейнера. При запуске контейнера вы можете задать -e для изменения переменной окружения или добавить другие переменные окружения.

    Пример:

    docker run -e WEBAPP_PORT=8000 -e WEBAPP_HOST=www.example.com ...

  • CMD:

    Он используется для указания команды по умолчанию для запуска контейнера.

  • ENTRYPOINT:

    Он используется для указания команды по умолчанию для запуска контейнера. Различие: Для ENTRYPOINT параметры, добавленные к образу во время запуска контейнера, будут объединяться. Для CMD эти параметры будут перезаписаны.

    • Если Dockerfile указывает, что командой по умолчанию для запуска контейнера является ls -l, команда по умолчанию ls -l будет выполнена соответственно. Например:
      • ENTRYPOINT [ "ls", "-l"]: Программа и параметр для запуска контейнера задаются как ls и -l соответственно.
      • docker run centos: Команда docker run centos ls -l выполняется по умолчанию для запуска контейнера CentOS.
      • docker run centos -a: Когда параметр -a добавляется для запуска контейнера CentOS, команда docker run centos ls -l -a выполняется по умолчанию.
    • Если Dockerfile указывает, что командой по умолчанию для запуска контейнера является --entrypoint, но необходимо заменить эту команду, можно добавить параметры --entrypoint для замены конфигурации, указанной в Dockerfile. Пример:

      docker run gutianlangyu/test --entrypoint echo "hello world"

  • USER:

    Он используется для указания пользователя или UID при запуске контейнера, а также при выполнении команд RUN, CMD или ENTRYPOINT.

  • ONBUILD:

    Команда‑триггер. Во время сборки образа движок контейнера сохраняет все команды, указанные в команде ONBUILD, в метаданные образа. Эти команды не будут выполнены при построении текущего образа. Они будут выполнены только когда новый образ использует инструкцию FROM, указывая текущий образ в качестве родительского.

    Использование инструкции FROM для создания дочернего образа на основе родительского образа, созданного Dockerfile:

    ONBUILD ADD. /app/src: Команда ADD. /app/src автоматически выполняется.