Специальная тема Dockerfile Как создать собственный образ Docker
Специальная тема Dockerfile Как создать собственный образ Docker

Предисловие

Говоря о докере, все знают, что это контейнер. Мы загружаем образ из хранилища в локальное хранилище, а затем запускаем указанный образ для запуска контейнера. Затем этот контейнер начинает защищать внутренние программы.

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

Dockerfile

Прежде чем изучать Dockerfile, сначала разберитесь с образом. Контейнер похож на «виртуальную машину», а для виртуальной машины требуется операционная система, и эта операционная система является образом.

image

проходитьdocker imagesВы можете просмотреть все существующие изображения на хост-компьютере.。

На изображении выше используется Centos, но в Centos предустановлено много программного обеспечения, поэтому размер составляет 231 МБ. Такие образы, как alpine и busybox, относительно небольшие, и многие команды необходимо устанавливать самостоятельно. Однако на практике вам не нужно слишком много выполнять много команд в контейнере.

инструкция

Сначала имя файла должно быть Dockerfile.,В первой строке необходимо использоватьFROMинструкцияимпортировать изображение,Последняя строка предназначена для указания команды, которая будет запущена в контейнере через CMD или ENTRYPOINTинструкцию.

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

  1. FROM: первая строка должна быть FORM centos, что означает создание контейнера из образа centos.
  2. Значение ключа ENV: установка переменных среды.
  3. Команда RUN: выполнить инструкцию на основе предыдущего образа и отправить его как новый образ.
  4. EXPOSE 80: открыть порт 80. Вам необходимо использовать -p, чтобы указать сопоставленный порт при запуске. Распределение по умолчанию не указано.
  5. VOLUME /data: объявите /data в контейнере как анонимный том. -v может привязать этот анонимный том к хосту. Если не указано, он будет автоматически привязан к /var/lib/docker/volumes.
  6. ADD src dest: файл должен находиться в том же каталоге, что и Dockerfile.,Помимо копирования локальных файлов в контейнер,Также имеется функция распаковки файлов.
  7. КОПИРОВАТЬ src dest: файл должен находиться в том же каталоге, что и Dockerfile. Переместите каталог/файл src в целевой каталог контейнера.
  8. CMD: команда выполняется при запуске контейнера
  9. ТОЧКА ВХОДА: Как и в случае с CMD, укажите команду для запуска контейнера.

Выше приведены часто используемые команды в Dockerfile. После просмотра вышеизложенного у вас могут возникнуть вопросы. Разве CMD и ENTRYPOINT не являются одной и той же командой?

CMD и ТОЧКА ВХОДА

CMD Инструкция используется для указания команды и параметра по умолчанию для изображения, но эту команду можно использовать в Запустить контейнер переопределяется указанной командой. Мы до сих пор помним, когда впервые изучили докер, Запустить Используйте докер, когда контейнер run,В конце будет добавлен /bin/bash.,Этот /bin/bash является стандартом,Это перезапишет CMD.

Язык кода:bash
копировать
docker run my-image echo "Hello, World!"

Так же и здесь, эхо "Hello, World!" перезапишет Dockerfile в CMD инструкция。

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

Язык кода:bash
копировать
docker run my-image "Hello, World!"

здесь "Hello, World!" будет передан в качестве параметра ENTRYPOINT в команду, не заменяя ее. Иногда КМД и ТОЧКА ВХОДА также будет использоваться вместе с ENTRYPOINT. используется для указания фиксированных команд, в то время как CMD Используется для предоставления параметров по умолчанию. Таким образом, вы можете контейнер при добавлении или замене CMD параметры по умолчанию.

Например, после того, как я использую следующее изображение DockerfileПоустановить:

Язык кода:bash
копировать
FROM centos
ENTRYPOINT ["echo"]
CMD ["Hello, World!"]

Запустить контейнер не указывает команду, он выведет «Привет, Мир!», если я укажу команду:

Язык кода:bash
копировать
docker run my-image "Hello, Docker!"

Затем «Hello, Docker!» перезапишет «Hello, World!», указанный CMD, и, наконец, выведет «Hello, Docker!»

Tomcat Dockerfile

здесь Я основан на изображении Centos,Написать Docker-файл,Чтобы создать образ Tomcat. Прежде чем создавать образ,Нам также необходимо учитывать переменные среды, загруженные пакеты программного обеспечения, открытые команды и т. д., от которых зависит этот образ.

Если мы собираем Tomcat на сервере, нам нужно загрузить tomcat, затем настроить jdk, открыть порт 8080, а затем выполнить start.sh в каталоге bin tomcat, чтобы служба tomcat была успешно запущена. Нам нужно преобразовать эти операции в Dockerfile.

Dockerfile

Сначала я загрузил установочный пакет tomcat, который находится в каталоге /data хост-компьютера, а jdk хост-компьютера помещен в /usr/local. Как поставить tomcat и jdk в зеркало? В это время некоторые ученики бросятся отвечать: «КОПИРОВАТЬ!»

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

Язык кода:bash
копировать
FROM centos
VOLUME /usr/local/jdk
VOLUME /usr/local/tomcat
ENV JAVA_HOME /usr/local/jdk
ENV CATALINA_HOME /usr/local/tomcat
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin
EXPOSE 8080
CMD catalina.sh run

В Докерфайле,Я объявил всего два тома в /usr/local: jdkиtomcat,Тогда в следующей ENVинструкции,Используйте эти два тома в качестве каталога переменных среды jdkиtomcat.,Настраивается в PATH.

затем вCMDказнен вcatalina.sh runизинструкция,здесь нельзя использовать start.sh,потому чтоdockerконтейнерСуществует для защиты процесса/команды,Поэтому его необходимо использоватьРежим запуска на переднем плане

Построить изображение

Затем начинается строительство. Построить изображение:

Язык кода:bash
копировать
docker build -t="tomcat-aqi" .

После успешного строительства,через докер Изображения могут просматривать наши изображения.

Запустить контейнер

Согласно конфигурации в dockerfile, в docker в команде запуска,Нам нужно изменить каталог vjdkиtomcat на хост-машине.,Монтируем в том контейнера,Затем порт контейнера 8080 сопоставляется с портом 9092 хоста.

Язык кода:bash
копировать
docker run -d --name tomcat-qi -p 9092:8080 \
-v /data/apache-tomcat-8.0.11:/usr/local/tomcat \
-v /usr/local/jdk1.8.0_201:/usr/local/jdk  \
-it tomcat-aqi

После успешного запуска контейнера через докер можно просмотреть процесс.

В браузере доступ к контейнеру вtomcat осуществляется через порт сервера 9092.

В информации о контейнере мы видим информацию о монтировании. Каталоги JDK и tomcat на хосте были подключены к тому контейнера.

Вы также можете просмотреть переменные среды ENV и информацию CMD контейнера.

Зеркальный слой

Зеркальный слой(Image Слои) есть Docker Важная концепция зеркалирования. каждый Docker Образ на самом деле состоит из многослойной файловой системы (Union File System), каждый уровень доступен только для чтения и называется Зеркальным. слой. Эти уровни являются основой изображения, и каждый уровень представляет собой шаг или команду в процессе построения изображения.

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

Docker Механизмы кэширования реализуются через уровни. Например, если вы измените Dockerfile в определенной строке Докер Слои будут перестраиваться только начиная с этой строки, а предыдущие слои кэшируются и используются повторно. Это значительно повышает скорость сборки.

уменьшать Зеркальный Количество и размер каждого слоя могут оптимизировать размер изображения и скорость передачи. Слишком много слоев приведет к увеличению избыточных данных и увеличению времени сборки. Мы можем сделать это, объединив несколько RUN инструкции объединены в одну, чтобы сократить Зеркальный слой。

Добавляем три строки RUNинструкции в приведенный выше файл Dockerfile:

Язык кода:bash
копировать
RUN ps
RUN echo 1
RUN date

Затем объедините три RUNинструкции:

Язык кода:bash
копировать
RUN ps && echo 1 && date

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

Заключение

Наконец, давайте поговорим о том, почему вместо альпийского зеркалирования используется centos. Причина в том, что Alpine необходимо загрузить соответствующую версию OpenJDK и она не поддерживает мой Oracle JDK, поэтому я воспользовался ярлыком и напрямую использовал Centos.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose