Работа с изображениями Docker
Каждый контейнер Docker основан на изображении.
До сих пор мы использовали изображения, которые были созданы другими и доступны в Docker Hub.
Docker может автоматически создавать изображения, прочитав инструкции из Dockerfile
DockerFile — это текстовый документ, который содержит все команды, которые пользователь может вызвать в командной строке, чтобы собрать изображение.
Обзор Dockerfile
Основной формат Dockerfile:
FROM busybox COPY cat.txt ADD add.txt ADD compress.tar.gz /tmp CMD ["sh"]
Dockerfile должен начать с инструкции. Ользовательская инструкция указывает базовое изображение, с которого вы строите.
Есть несколько инструкций, которые доступны в Dockerfile, некоторые из них включают в себя:
- ОТ
- БЕЖАТЬ
- CMD
- МЕТКА
- РАЗОБЛАЧАТЬ
- Эн
- ДОБАВЛЯТЬ
- Копия
- ТОЧКА ВХОДА
- ОБЪЕМ
- ПОЛЬЗОВАТЕЛЬ
Многое другое….
Копия против добавления инструкции
Копия и Добавить оба инструкции DockerFile, которые служат аналогичными целями.
Они позволяют копировать файлы из определенного местоположения в изображение Docker.
Разница между копией и добавлением
Копия берет в SRC и пункт назначения. Это позволяет только копировать в локальном файле или каталоге с вашего хоста
Добавить Позволяет вам сделать это тоже, но это также поддерживает 2 других источника.
Во -первых, вы можете использовать URL вместо локального файла/каталога. Во -вторых, вы можете извлечь файл TAR из источника непосредственно в пункт назначения.
Используйте Wget/Curl, где это возможно
Использование Add to Fetch Packages из удаленных URL -адресов сильно обескуражено; Вместо этого вы должны использовать Curl или Wget.
Это будет выполнять все строки неоднократно, будет выполняться каждый раз, когда один и один и один файл. Так, Это не хорошая практика
ADD http://example.com/big.tar.xz /usr/src/things/ RUN tar -xJf /usr/src/things/big.tar.xz -C /usr/src/things RUN make -C /usr/src/things all
Это не создаст ненужных файлов и будет создавать последовательность, которая будет иметь дело только с файлом файла, а затем обрабатывается.
RUN mkdir -p /usr/src/things \ && curl -SL http://example.com/big.tar.xz \ | tar -xJC /usr/src/things \ && make -C /usr/src/things all
Давайте будем демо, чтобы показать вам, как Добавить Работа.
- Создать сжатый файл
- Создайте DockerFile и определите файл для копирования из назначения
- Запустите этот Dockerfile
- Проверьте вывод в каталоге назначения.
Шаг 1. Создайте сжатый файл
root@dporwal-docker:~# touch compress.txt root@dporwal-docker:~# tar -czvf compress.tar.gz compress.txt root@dporwal-docker:~# docker build -t demobusybox .
Шаг 2. Создайте DockerFile и определите файл для копирования из назначения
vi Dockerfile
Dockerfile1
Шаг 3. Запустите этот Dockerfile
$ docker build .
Шаг 4. Проверьте вывод в каталоге назначения.
Запустите контейнер, который построен Dockerfile
Разоблачить инструкцию
Разоблачить Инструкция сообщает Docker, что контейнер прослушивает указанные сетевые порты во время выполнения, и на самом деле не публикует порт. Он функционирует как тип документации между человеком, который строит изображение, и человеком, который управляет контейнером, о котором порты предназначены для публикации.
В выше Dockerfile1 вы можете увидеть сценарий, в котором человек не сможет получить порт, который он должен намерен опубликовать из -за не использовать Разоблачить командование
Итак, теперь мы будем использовать это Разоблачить Команда Dockerfile.
Здесь я создаю DockerFile, который запустит NGINX Server на порте 9080.
FROM ubuntu:latest LABEL version="0.0.1" LABEL maintainer="porwal.deepak2000@gmail.com" RUN apt-get update && apt-get upgrade -y RUN apt-get install nginx -y EXPOSE 9080 CMD ["nginx", "-g", "daemon off;"]
Это моя первоначальная среда моего сервера Docker.
Теперь мы запустим команды ниже, чтобы создать пользовательское изображение ExposedEmo с меткой 0,0,1
docker image build --tag exposedemo:0.0.1 .
И здесь мы создадим контейнер из ExposedEmo Изображение мы строим.
docker container run -d exposedemo:0.0.1
И на этом изображении вы можете увидеть в желтой коробке, контейнер работает на порту 9080
Чтобы проверить, вы также можете использовать эту команду.
docker inspect exposedemo:0.0.1
Инструкция HealthCheck
Инструкция HealthCheck Docker позволяет нам рассказать платформе о том, как проверить, что наше приложение здоровое.
Когда Docker запускает контейнер, он отслеживает процесс, который работает контейнер. Если процесс заканчивается, контейнер выходит.
Это просто базовая проверка и не обязательно рассказывает подробности о приложении.
Мы можем указать определенные параметры перед работой CMD, это включает в себя:
HEALTHCHECK --interval=5s CMD ping -c 1 172.17.0.2 --interval=DURATION (default: 30s) --timeout=DURATION (default: 30s) --start-period=DURATION (default: 0s) --retries=N (default: 3)
Давайте создадим контейнер DemohealthCheck который мы будем использовать для проверки соединения, и создадим другой контейнер монитор где мы будем реализовать HealtCheck Команда, проверяя соединение с DemohealthCheck контейнер.
Команды:
docker container run -dt --name demohealthcheck busybox sh
Мы получим IP -адрес этого контейнера для подключения.
docker inspect demohealthcheck
Теперь давайте создадим Dockerfile и реализуем HealthCheck командование
FROM demohealthcheck HEALTHCHECK --interval=5s CMD ping -c 1 172.17.0.3
Построение изображения и контейнер из приведенного выше файла Docker и проверьте соединение.
Мы также можем проверить журналы HealthCheck
docker inspect monitor
Если Exitcode: 1 Тогда что -то не так с контейнером.
0: Успех | Контейнер полезен и готов к использованию |
1: Отказ | Контейнер работает неправильно |
2: Зарезервированный | Не используйте код выхода |
Мы также можем использовать команды HealthCheck при создании контейнера. Как ниже, мы используем -Коллегистр-CMD
Команда:
docker run -dt --name tmp --health-cmd "curl -f http://localhost" busybox sh
И мы увидим, что контейнер нездоровый. На выполнении Docker осмотреть TMP Мы обнаружили, что команда Curl не найдена.
Теперь мы удалим этот контейнер и постараемся проверить контейнер через каждые 5 секунд, и он повторно повторно проведет 1 время при сбое.
Вы можете попробовать команду ниже и дайте мне знать в обсуждении, если вам нравится это сделать.
docker run -dt --name tmp --health-cmd "curl -f http://localhost" --health-interval=5s --health-retries=1 busybox sh
Для получения дополнительных команд вы можете проверить: https://docs.docker.com/engine/reference/run/#healthcheck
Dockerfile entrypoint
Лучшее использование для входа — это установить основную точку команды в команде изображения, не позволяет вам переопределить команду. Важно понять различие между CMD и точкой входа.
AS, команда CMD в DockerFile может быть переопределена командой времени выполнения. В то время как команда intrypoint будет добавлена к данной команде, указанной во время выполнения.
Пример фрагмента кода:
FROM ubuntu ENTRYPOINT ["top", "-b"] CMD ["-c"]
Workdir Trancing
Workdir Инструкция устанавливает рабочий каталог для любого запуска, CMD, входной точки, копирования и добавления инструкций, которые следуют за ним в Dockerfile
FROM busybox RUN mkdir /root/demo WORKDIR /root/demo RUN touch dporwal.txt CMD ['/bin/sh']
Инструкция WorkDir может использоваться несколько раз в DockerFile
Пример фрагмента:
WORKDIR /a WORKDIR b WORKDIR c RUN pwd
Output =/a/b/c
Env Инструкция
Проходя в качестве аргумента во время выполнения. Инструкция ENV устанавливает переменную среды на значение.
Вы можете использовать флаги -E, -ENV и -ENV -файла для установки простых переменных среды в контейнере, в котором вы запускаете, или перезаписывают переменные, которые определены в DockerFile с изображением, которое вы запускаете.
Пример фрагмента:
docker run --env VAR1=value1 --env VAR2=value2 ubuntu env | grep VAR Eg. docker run -dt --name env01 --env USER=USERADMIN busybox sh
Реализация Env в Dockerfile
Пример фрагмента:
FROM busybox ENV NGINX 1.2 RUN touch web-$NGINX.txt CMD ["/bin/sh"]
Ссылки: Официальный докер Курс Udemy
Кредит: Рвение Вора
Предыдущая: Начало работы с Docker
Далее: создание изображений, управление и реестр (часть 2)
Оригинал: «https://dev.to/dporwal/image-creation-management-and-registry-part-1-pk9»