Говоря о докере, все знают, что это контейнер. Мы загружаем образ из хранилища в локальное хранилище, а затем запускаем указанный образ для запуска контейнера. Затем этот контейнер начинает защищать внутренние программы.
Но во многих случаях нам необходимо развернуть наши собственные программы в Docker или, поскольку извлекаемый образ слишком велик, нам нужно реконструировать его на основе небольшого образа, что требует от нас самостоятельной сборки Docker, а этапы создания Docker основаны в Dockerfile для достижения.
Прежде чем изучать Dockerfile, сначала разберитесь с образом. Контейнер похож на «виртуальную машину», а для виртуальной машины требуется операционная система, и эта операционная система является образом.
проходитьdocker imagesВы можете просмотреть все существующие изображения на хост-компьютере.。
На изображении выше используется Centos, но в Centos предустановлено много программного обеспечения, поэтому размер составляет 231 МБ. Такие образы, как alpine и busybox, относительно небольшие, и многие команды необходимо устанавливать самостоятельно. Однако на практике вам не нужно слишком много выполнять много команд в контейнере.
Сначала имя файла должно быть Dockerfile.,В первой строке необходимо использоватьFROMинструкцияимпортировать изображение,Последняя строка предназначена для указания команды, которая будет запущена в контейнере через CMD или ENTRYPOINTинструкцию.
Построение имиджа начинается с базового образа и конструируется в наш собственный имидж с помощью различных стандартов.
Выше приведены часто используемые команды в Dockerfile. После просмотра вышеизложенного у вас могут возникнуть вопросы. Разве CMD и ENTRYPOINT не являются одной и той же командой?
CMD Инструкция используется для указания команды и параметра по умолчанию для изображения, но эту команду можно использовать в Запустить контейнер переопределяется указанной командой. Мы до сих пор помним, когда впервые изучили докер, Запустить Используйте докер, когда контейнер run,В конце будет добавлен /bin/bash.,Этот /bin/bash является стандартом,Это перезапишет CMD.
docker run my-image echo "Hello, World!"
Так же и здесь, эхо "Hello, World!" перезапишет Dockerfile в CMD инструкция。
Инструкция ENTRYPOINT используется для настройки основной команды, которая всегда будет выполняться при запуске контейнера.,Не будет такой проблемы с перезаписью.,По умолчанию будет использоваться инструкция, указанная в Docker, как отдельный параметр.,такой же
docker run my-image "Hello, World!"
здесь "Hello, World!" будет передан в качестве параметра ENTRYPOINT в команду, не заменяя ее. Иногда КМД и ТОЧКА ВХОДА также будет использоваться вместе с ENTRYPOINT. используется для указания фиксированных команд, в то время как CMD Используется для предоставления параметров по умолчанию. Таким образом, вы можете контейнер при добавлении или замене CMD параметры по умолчанию.
Например, после того, как я использую следующее изображение DockerfileПоустановить:
FROM centos
ENTRYPOINT ["echo"]
CMD ["Hello, World!"]
Запустить контейнер не указывает команду, он выведет «Привет, Мир!», если я укажу команду:
docker run my-image "Hello, Docker!"
Затем «Hello, Docker!» перезапишет «Hello, World!», указанный CMD, и, наконец, выведет «Hello, Docker!»
здесь Я основан на изображении Centos,Написать Docker-файл,Чтобы создать образ Tomcat. Прежде чем создавать образ,Нам также необходимо учитывать переменные среды, загруженные пакеты программного обеспечения, открытые команды и т. д., от которых зависит этот образ.
Если мы собираем Tomcat на сервере, нам нужно загрузить tomcat, затем настроить jdk, открыть порт 8080, а затем выполнить start.sh в каталоге bin tomcat, чтобы служба tomcat была успешно запущена. Нам нужно преобразовать эти операции в Dockerfile.
Сначала я загрузил установочный пакет tomcat, который находится в каталоге /data хост-компьютера, а jdk хост-компьютера помещен в /usr/local. Как поставить tomcat и jdk в зеркало? В это время некоторые ученики бросятся отвечать: «КОПИРОВАТЬ!»
На самом деле, лучшим решением является использованиеVOLUMNинструкция,Смонтируйте каталог хоста в контейнер,Таким образом, каждый контейнер использует файлы на хост-компьютере.,И уменьшить занятость дискового пространства.
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контейнерСуществует для защиты процесса/команды,Поэтому его необходимо использоватьРежим запуска на переднем плане。
Затем начинается строительство. Построить изображение:
docker build -t="tomcat-aqi" .
После успешного строительства,через докер Изображения могут просматривать наши изображения.
Согласно конфигурации в dockerfile, в docker в команде запуска,Нам нужно изменить каталог vjdkиtomcat на хост-машине.,Монтируем в том контейнера,Затем порт контейнера 8080 сопоставляется с портом 9092 хоста.
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:
RUN ps
RUN echo 1
RUN date
Затем объедините три RUNинструкции:
RUN ps && echo 1 && date
Используйте два файла Dockerfile соответственно изображение, как видно из журнала строительства, согласно инструкции Зеркальный до слияния слой равен 8, а вместе взятый — 6.
Наконец, давайте поговорим о том, почему вместо альпийского зеркалирования используется centos. Причина в том, что Alpine необходимо загрузить соответствующую версию OpenJDK и она не поддерживает мой Oracle JDK, поэтому я воспользовался ярлыком и напрямую использовал Centos.