Вводное руководство по Docker, написанное для бэкэнда: подробное объяснение команды DockerFile

Docker

в предыдущей статьеУчебник Docker для начинающих по бэкенду: Actual CombatНаконец, мы упомянули об использовании DockerFile для создания и настройки собственных образов. Из-за проблем со временем и пространством в последней статье было дано только краткое введение и использование DockerFile, а не подробное введение в конкретные инструкции DockerFile. , эту статью, как дополнительное дополнение к предыдущей статье, мы начнем с основных команд DockerFile и шаг за шагом построим собственное зеркало.

Введение в DockerFile:

Dockerfile – это скрипт, состоящий из набора команд и параметров. Dockerfile содержит полную команду для создания всего образа. Docker автоматически создает образы, выполняя серию команд в файле Dockerfile через сборку docker.

Пример:

Здесь мы по-прежнему выбираем настройку нашего собственного образа на основе centos, который мы использовали в предыдущей статье в качестве примера кода для этой главы, код выглядит следующим образом:

FROM centos  //继承至centos
ENV mypath /tmp  //设置环境变量
WORKDIR $mypath //指定工作目录

RUN yum -y install vim //执行yum命令安装vim
RUN yum -y install net-tools //执行yum命令安装net-tools

EXPOSE 80 //对外默认暴露的端口是80
CMD /bin/bash //CMD 容器启动命令,在运行容器的时候会自动执行这行命令,比如当我们 docker run -it centos 的时候,就会直接进入bash

После этого скомпилируйте DockerFile с помощью команды сборки docker, чтобы получить собственный образ.

然后编译该镜像
docker build -f ./DockerFile -t mycentos:1.3.
-t 新镜像名字:版本
-f 文件 -d 文件夹

Запустив образ, вы обнаружите, что в нашем новом контейнере доступны vim и net-tools.

Далее мы начнем с команды FROM построчно и, наконец, завершим понимание и освоение общих команд DockerFile.

Общие команды:

ОТ команды:

Поскольку мы настраиваем на основе исходного образа centos, наш новый образ также должен быть основан на образе centos, и команда FROM это представляет.В DockerFile необходимо указать базовый образ., функция инструкции FROM такова чтобы указать базовый образ, поэтому в DockerFile FROM является необходимой инструкцией, и, как и ключевое слово import в java и python, в DockerFile,Инструкция FROM должна быть помещена в позицию первой инструкции

Конечно, некоторые друзья могут спросить в это время, что, если я не хочу настраивать образ на другие образы, нет проблем, Docker предоставляет виртуальный образ нуля, если вы выбираете ИЗ нуля, это означает, что вы не используете Scratch Основанный на любом образе, инструкции, написанные далее, будут существовать как первый слой образа.Конечно, в некоторых случаях, таких как статически скомпилированные программы под linux, операционная система не требует поддержки времени выполнения при работе.В настоящее время, нет проблем с FROM нуля, но это сильно уменьшит размер нашего образа.

Инструкция ENV

Функции:Установить переменные среды

Точно так же DockerFile также предоставляет два формата:

  • ENV key value
  • ENV key1=value1 key2=value2

Эта команда очень проста, она просто устанавливает переменную среды.Будь то другая команда позже, такая как RUN, или приложение во время выполнения, вы можете напрямую использовать переменную среды, определенную здесь.

Вы можете видеть, что после использования ENV для установки переменной mypath в нашем примере переменная mypath используется в следующей строке WORKDIR.

ENV mypath /tmp  //设置环境变量
WORKDIR $mypath //指定工作目录

Команда РАБОЧИЙКАТАЛОГ:

Функции,Укажите рабочий каталог

Формат: WORKDIR путь к рабочему каталогу, если этот каталог не существует, WORKDIR поможет нам создать этот каталог.

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

[root@8081304919c9 tmp]#

Команда Run:

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

Существует два формата команды RUN:

  • Формат оболочки

    Команда RUN аналогична вводу команды непосредственно в командной строке, например RUN yum -y install vim — это используемый формат.

  • формат исполняемого файла

    RUN["исполняемый файл", "параметр 1", "параметр 2"], похоже на вызов функции

Как мы говорили в предыдущей статье, каждая инструкция в DockerFile будет создавать слой, например, мы выполнили следующую команду выше

RUN yum -y install vim 

После того, как выполнение закончится, вызовите commit, чтобы отправить модификацию этого слоя для формирования нового изображения, как насчет этого, вдруг ясно?

нисколько

Ну что ж

Точно так же Dockerfile поддерживает метод переноса командной строки с добавлением \ в конце класса Shell и формат комментариев с # в начале строки. Хорошее форматирование, такое как разрывы строк, отступы, комментарии и т. д., облегчит обслуживание и устранение неполадок, что является хорошей привычкой.

намекать:

Если вы используете apt для установки, не забудьте в конце почистить лишние файлы кеша apt, иначе образ сильно раздуется. Потому что, когда DockerFile создает новый слой образа, он не удалит файлы, оставленные предыдущим слоем образа.

ЭКСПОЗИЦИОННАЯ команда:

Функции:объявить порт

Формат: EXPOSE порт 1 порт 2

Инструкция EXPOSE должна объявить, что контейнер среды выполнения предоставляет сервисный порт. Конечно, это всего лишь объявление. Приложение не будет открывать службу этого порта во время выполнения из-за этого объявления. Это объявление в основном предназначено для удобства последующей настройки сопоставления портов.

CMD-команда:

Когда я раньше представлял контейнеры, я сказал, что Docker — это не виртуальная машина, а контейнер — это процесс. Поскольку это процесс, при запуске контейнера необходимо указать программу и параметры для запуска. Команда CMD используется для указания команды запуска основного процесса контейнера по умолчанию.

Точно так же DockerFile также предоставляет нам два формата для использования команд CMD:

  • формат оболочки: команда CMD
  • формат exec: CMD ["исполняемый файл", "параметр 1", "параметр 2"...]

В примере мы используем первый:

CMD /bin/bash

Эффект этой команды,Когда мы запускаем команду через run -it, контейнер автоматически выполнит /bin/bash, а centos также является CMD /bin/bash по умолчанию, поэтому, когда мы запускаем образ centos, он автоматически войдет в среду bash.

Конечно, мы также можем изменить команду по умолчанию, указав команду во время выполнения, например:

docker run -it centos cat /etc/os-release

Таким образом, когда мы запускаем образ, cat /etc/os-release заменит информацию о версии системы вывода CMD /bin/bash по умолчанию.

Если используется формат оболочки, фактическая команда будет обернута как аргумент sh -c для выполнения.

Например:

CMD echo $HOME

В фактическом исполнении он будет изменен на

CMD [ "sh", "-c", "echo $HOME" ]

Конечно, есть много проблем, к которым особенно склонны новички, а именно запуск фоновых служб, таких как:

CMD service nginx start

Если вы используете его таким образом, вы обнаружите, что контейнер автоматически закрывается после некоторого времени работы.

так,? ? ? ? ?

Нам уже не раз напоминали,Контейнер — это не виртуальная машина, контейнер — это процесс, приложения в контейнере должны работать на переднем плане, а не запускать фоновые службы, такие как виртуальные машины и физические машины. Контейнер существует для основного процесса. Когда основной процесс завершается, контейнер теряет смысл существования, поэтому он завершается, другое Рабочий процесс — это не то, о чем ему нужно заботиться.

Как понять это? Подумайте о драмах с идолами, контейнер — это героиня, а главный процесс — это герой.

Тебя нет, а меня нет в живых (душераздирающе плачет), наверное, вот что это значит.

Как мы упоминали ранее, на практике запуск службы CMD nginx будет пониматься как:

CMD [ "sh", "-c", "service nginx start"]

Здесь наш основной процесс на самом деле sh.Когда наш сервис nginx start выполняется, sh естественным образом завершится, основной процесс завершится, и контейнер, соответственно, остановится. Способ стремиться — напрямую запустить исполняемый файл nginx и объявить его для запуска на переднем плане:

CMD ["nginx", "-g", "daemon off;"]

К этому моменту были описаны команды, задействованные в нашем примере. Конечно, этого недостаточно. В Docker есть еще много команд, которые мы используем чаще. В качестве дополнения мы расскажем о других часто используемых командах DockerFile.

COPYЗаказ:

Функции:копировать файл

Docker по-прежнему предоставляет нам два формата на выбор:

  • COPY [--chown=:] ...
  • COPY [--chown=:] ["",... ""]

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

Первый пример (скопируйте package.json в каталог /usr/src/app/):

COPY package.json /usr/src/app/

Во-вторых, целевой путь может быть абсолютным путем в контейнере или относительным путем относительно рабочего каталога.Рабочий каталог можно указать с помощью команды WORKDIR.Если вам нужно изменить пользователя или группу пользователей, к которой принадлежит файл , вы можете добавить параметр --chown .

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

ДОБАВИТЬ команду:

Команду ADD можно понимать как расширенную версию команды COPY. Формат и использование почти такие же, как у COPY. ADD добавляет некоторые функции на основе COPY. Например, исходный путь может быть URL-ссылкой. используйте его так, Docker попытается сначала загрузить файл, представленный URL-адресом, а затем скопировать его в целевой каталог.Другие - добавить операции, такие как распаковка на основе COPY.Рука от кодового слова болит.Друзья кому нужно знать, может перейти на официальный сайт, чтобы проверить соответствующий документ, я не буду распространяться здесь.

VOLUME определяет анонимные тома:

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

Например:

VOLUME /data

Параметр анонимного тома по умолчанию может быть переопределен параметром -v во время выполнения.

ПОЛЬЗОВАТЕЛЬСКАЯ команда:

Функции:Укажите текущего пользователя

Формат:USER имя пользователя: группа пользователей

Команда USER аналогична команде WORKDIR тем, что она изменяет состояние среды и влияет на последующие слои. WORKDIR предназначен для изменения рабочего каталога, а USER — идентификатор уровня, который выполняет такие команды, как RUN, CMD и ENTRYPOINT после изменения. Конечно, как и WORKDIR, USER просто помогает вам переключиться на указанного пользователя.

Конечно, предполагается, что ваш пользователь User существует заранее.

Закончить цветочную композицию?

Прежде чем я узнал об этом, четвертое вводное руководство из серии Docker было опубликовано, и его длина достигла более 10 000 слов. Первые три статьи в сумме составили около 1500 прочтений о Nuggets. Я знаю это. Для многих Nuggets это это всего лишь тривиальный момент, но на данном этапе я очень доволен. Я никогда не думал, что однажды смогу помочь другим, поделившись, так же, как раньше я использовал технические блоги других людей. узнайте об этом.

Эта серия закончилась? Я думаю, что основная глава должна быть закончена, но здесь нет основного вводного руководства по Nginx, грядущему Mysql, Netty и т. д. Поскольку я еще не закончил учебу, я еще не получил избиение своей работы (забавно) , так что я могу только сделать все, что в моих силах. Собираюсь написать несколько основных вводных руководств, так что все кончено? Нет, дорога к технологиям бесконечна, пока мы продолжаем учиться, я думаю, мы можем продолжать идти.

Спасибо, Наггетс, всем привет, я Хань Шу, увидимся в следующей статье!

Наконец, соответствующие заметки были одновременно открыты для Github (приветственная звезда):GitHub.com/Хан Шуайкан…

Обязательно поставьте звезду.

Заранее поздравляю всех с 1024 Днем программиста!