
ОБУЧЕНИЕ ДОКЕРУ III
Содержание
- Докер-образы
- Докерфайл и инструкции
- Как создавать образы Docker
- Основы Докерхаба
Основное и родительское изображение
Большинство Dockerfiles начинаются с родительского образа. Если вам нужно полностью контролировать содержимое вашего образа, вам может понадобиться создать базовый образ.
- Базовое изображение: вызываются изображения, которые не находятся в файлах DockerFiles. У базового образа есть царапина FROM в файле DockerFile. Скретч-образ — это пустой образ, в котором ничего нет. Основываясь на этом, мы можем добавить к нему все, что захотим, и создать свои собственные изображения.
- Родительское изображение: изображения, отличные от нуля, являются родительскими изображениями. Вы также можете создать с помощью ключевого слова FROM.
DockerFile Подробно
Каждая строка в Dockerfile представляет собой инструкцию. При создании образа для каждой инструкции создается новый слой. Таким образом, количество слоев увеличивается с каждой инструкцией, которую мы пишем.
При запуске инструкции она работает на предыдущем слое, а изменения сохраняются как новый слой и передаются новой инструкции. и так далее, пока инструкция не будет закончена.
Давайте сделаем это на простом примере.
mkdir context_example # create folder cd context_example # go to folder dd if=/dev/zero of=freefile bs=10M count=1 # create a 10 MB file
Давайте создадим DockerFile и назначим в качестве родительского образа busybox.
cat > Dockerfile # create docker file FROM busybox # save and exit
Давайте создадим и создадим образ в Dockerfile
docker build -t contextexample . # create image

ПРИМЕЧАНИЕ. Если вы изучите выходные данные, вы увидите, что контекст отправлен демону Docker, а его размер составляет 10,49 МБ. Это означает, что даже если мы не добавили ни одного файла в образ, все файлы в каталоге будут отправлены демону Docker. Это будет проблемой для больших проектов, и скоро мы увидим, как с этим справиться.
Давайте перед тем, как начать решать эту проблему, удалим freefile, создадим образ и посмотрим изменения.
rm freefile # delete freefile docker build -t contextexample . # create image

Вы можете видеть, что размер контекста изменился с 10,49 МБ до 2,048 КБ.
Давайте определим, какие из файлов включены или нет, и решим проблему.
Мы создадим файл DockerIgnore для решения этой проблемы.
dd if=/dev/zero of=freefile bs=10M count=1 # create 10 MB file cat > .dockerignore # create .dockerignore file freefile # file we don't want to include -> SAVE AND EXIT
ПРИМЕЧАНИЕ. Если вы хотите просмотреть файл DockerIgnore, команда ls не работает, поэтому запустите команду ls -a, чтобы просмотреть скрытые файлы.
docker build -t contextexample . # create image

ПРИМЕЧАНИЕ: свободный файл игнорируется, а размер файла уменьшается. Мы используем для игнорирования этого файла DockerIgnore file
DockerIgnore позволяет нам игнорировать ненужные файлы, такие как журнал, настройки, пароли, тестовые файлы.
КОММЕНТАРИИ
Если вы хотите использовать информативные комментарии в Dockerfile, используйте # для входа в файл.
cat > Dockerfile # based on alpine parent image FROM alpine:latest
Если мы хотим создать образ с этим файлом, все будет работать как и раньше. Это просто информативный текст для разработчиков.
docker build .
Инструкция FROM
Инструкция FROM, используемая для указания базового образа DockerFile.
Давайте посмотрим, как используется инструкция FROM.
cat > betik.sh # create new shell script echo 'Hello World' # SAVE AND EXIT cat > Dockerfile # create Dockerfile FROM alpine:latest # assign alpine as base image COPY betik.sh / # included betik.sh file to image docker build -t betik . # created Docker image
Инструкция RUN
Используется для написания команд для запуска на предыдущем слое при создании образа.
Команда run используется в Dockerfile двумя способами.
оболочка ; запуск типа оболочки запускается в командной строке
выполнить ; Формат exec type run запускается напрямую. Командная строка не запускается
ПРИМЕЧАНИЕ. Переменные среды нельзя передавать в формате exec, поэтому вам нужно запустить оболочку и получить оттуда переменные.
$ cat > Dockerfile FROM alpine:latest RUN apk add --no-cache git RUN ["git", "clone", "https://github.com/xyzuser/BuildFromGit.git"]
Инструкция CMD
Команда CMD не вносит никаких изменений в образ, кроме добавления слоя. Когда контейнер создается из образа, он служит для определения того, что будет выполняться по умолчанию, если пользователь не укажет, какой пользователь любит бегать.
$ cat > Dockerfile FROM alpine:latest RUN apk add --no-cache python # installed python CMD python -m SimpleHTTPServer 8888 # started HTTP Server
LABEL Инструкция
Если есть теги и определения, которые мы хотим указать в созданном нами изображении, используется инструкция метки.
$ cat > Dockerfile FROM stracth LABEL maintainer='[email protected]"
EXPOSE Инструкция
Приложения, которые мы запускаем внутри контейнера, часто прослушивают один или несколько портов. EXPOSE используется для указания того, какой из этих портов прослушивается.
Давайте сделаем простой пример
$ cat > index.html <html> <body> <h1> Hello I am Hasan </h1></body> </html>
Мы создали наш файл index.html
$ cat > Dockerfile FROM python:2 EXPOSE 80 COPY index.html / CMD python -m SimpleHTTPServer 80
Мы заявили, что откроем порт 80 в Dockerfile.
$ docker build -t exposeexample .
Мы создали образ.
docker run --name expose -d -p 80:80 exposeexample
Если вы запустите localhost:80 в своем браузере, вы увидите, что файл index.html запущен.

Давайте удалим этот контейнер и посмотрим на основную функцию команды expose.
docker rm -f expose # delete expose container docker ps # show existed containers
Дадим параметр -P вместо -p. Он автоматически открывает все порты рядом с этой командой expose для внешнего мира.
docker run --name expose -d -P exposeexample
Порт TCP по умолчанию будет открыт после указанной выше команды.
ПРИМЕЧАНИЕ. Если мы хотим открыть более 1 порта, мы можем использовать, как показано ниже.
EXPOSE 80/tcp 53/udp
Инструкция ENV
Эта инструкция используется для назначения переменных среды.
$ cat > Dockerfile FROM busybox ENV Hasan Ozdemir ENV name=Hasan surname=Ozdemir
ПРИМЕЧАНИЕ. Если вы хотите увидеть переменные среды, вы должны написать эту команду после создания образа.
docker run image_name env
ДОБАВИТЬ и КОПИРОВАТЬ инструкции
Вы можете добавить файл и файлы в любой индекс с помощью инструкции ADD.
Инструкция COPY используется для копирования файла и файлов внутри контейнера, но вы не можете использовать COPY с URL-адресами. С другой стороны, если вы хотите скопировать файлы из старой сборки, вы должны использовать инструкцию COPY.
Как использовать -› ДОБАВИТЬ цель ресурса1
$ cat > Dockerfile FROM python:2 ADD main.py /main.py CMD python /main.py
ПРИМЕЧАНИЕ. Если вы хотите добавить более одного файла, вам просто нужно написать его.
Например ; ДОБАВИТЬ цель res1 res2 res3
ENTRYPOINT Инструкция
Эта инструкция используется для указания того, какие программы запускаются при запуске контейнера. Во время создания контейнера вы можете изменить значение ENTRYPOINT с параметрами.
Он работает как CMD. Он может работать двумя разными способами, в формате оболочки или в формате exec.
!! Основное различие между параметрами shell и exec. В формате exec учитываются параметры, которые записываются после имени изображения. В формате оболочки не учитываются параметры после имени изображения.
Давайте посмотрим на наш пример
$ cat > Dockerfile FROM python:2 ENTRYPOINT python CMD -m SimpleHTTPServer 80
Давайте создадим наш образ
$ docker build -t entryxample
Когда мы запустим этот образ, он будет работать в режиме оболочки и выполнять только команду «sh -c python». Поэтому часть SimpleHTTPServer работать не будет. Даже если мы передаем параметры, это не меняет результат из-за характера режима оболочки
Итак, как мы можем запустить эту часть кода. Первый вариант — перезаписать точку входа во время создания build.
$ docker run --rm -it -entrypoint python entrypointexample -m SimpleHTTPServer 80
Второй вариант - работа в режиме exec для решения этой проблемы.
VOLUME Инструкция
Эта инструкция используется для указания данных в рабочем образе, которые, возможно, потребуется сохранить позже. Файлы базы данных, статические файлы могут быть одними из примеров.
cat > Dockerfile FROM busybox VOLUME /code
Давайте создадим и запустим наш образ
$ docker build -t volexample . $ docker run -d --name vol volexample sleep 5000
Здесь инструкция VOLUME /code позволяет нам создать том и подключить его к контейнеру. Этот том будет существовать до тех пор, пока пользователь не перейдет в текущую папку и не очистит файлы.
Если вы хотите увидеть место назначения папки /code, просто напишите это из CMD
$ docker inspect volexample
Инструкция ПОЛЬЗОВАТЕЛЯ
Эта инструкция используется для изменения UID (идентификатор пользователя) и GID (идентификатор группы), которые находятся в пространстве имен.
$ cat > Dockerfile FROM ubuntu:16.04 RUN useradd user1 USER user1 CMD whoami
В этом примере мы начинаем создавать образ с пользователем root, и во время этого процесса мы добавляем пользователя в систему и продолжаем работу с этим пользователем. Также мы добавили команду whoami, чтобы увидеть, кто запускает процесс.
WORKDIR Инструкция
Instructino используется для определения рабочего каталога контейнера Docker в любой момент времени.

Если команда workdir не написана, она будет автоматически создана компилятором Docker.
Инструкция АРГ
Эта инструкция используется для указания параметров команды docker build во время создания образа. Если вы хотите, вы также можете передать значение по умолчанию для каждого параметра.
$ cat > Dockerfile
FROM python:2
ARG CYTHON_VERSION
RUN pip install Cython==${CYTHON_VERSION}
CMD python -V
Давайте создадим наш образ, передадим параметры и запустим контейнер.
$ docker build — build-arg CYTHON_VERSION=0.20 -t argexample . $ docker run -rm argexample
ПРИМЕЧАНИЕ. Если вы хотите передать значение по умолчанию, вам нужно только это
ARG CYTHON_VERSION=0.20
подлежит уточнению (53–60)
Структура слоя образов Docker

Образы Docker состоят из слоев. Если мы хотим, мы можем наблюдать за этими слоями. Существует возможный способ наблюдать за этими слоями. Мы можем проверить это из командной строки или из веб-интерфейса.
$ docker history $ docker history --not trunc imagename
ПРИМЕЧАНИЕ. В этой инструкции показаны все детали, поэтому никогда не передавайте данные аутентификации в Dockerfile.
Второй способ увидеть слои на этом сайте imagelayers.io
Вы можете перейти по ссылке и написать имя изображения, которое размещено в Docker Hub, и этого будет достаточно для мониторинга слоев.
Создание образа Docker
Давайте обсудим сначала проблемы. Первая проблема — управление версиями образа Docker. Если мы хотим установить образ на наш компьютер с помощью команды pull, есть способ. Передайте версию или нет, и это будет загрузка, помеченная как последняя.
Однако для изображений может отсутствовать информация о версии, что может привести к ошибкам. Если вы хотите добавить информацию о версии, используйте эту структуру
$ docker pull username/imagename:version $ docker pull hasan/learndocker:0.1 $ docker pull hasan/learndocker:latest
Затем вы можете запустить эту команду для мониторинга версий
$ docker image ls
- Подготовьте Dockerfile
$ cat > Dockerfile FROM busybox CMD echo 'Hello'
2. Создайте образ
$ docker build -t exampleimage .
3. Укажите версию образа
$ docker tag exampleimage exampleimage:1.0
4. Создайте учетную запись dockerhub
Если у вас уже есть учетная запись, просто войдите в систему, а если у вас ее нет, пожалуйста, зарегистрируйтесь.
После того, как вы создали свою учетную запись, мы можем продолжить с терминала
$ docker login
Затем напишите свое имя пользователя и пароль для входа в dockerhub.
5. Загрузите образ докера
Мы увидим, как загрузить изображение в dockerhub.
$ docker tag exampleimage hasan/exampleimage:1.0
и загрузить на dockerhub
$ docker push hasan/exampleimage:1.0
ПРИМЕЧАНИЕ. Если вы хотите загрузить какую-либо другую платформу, вы должны использовать это
$ docker tag exampleimage hasan.com/hasan/exampleimage:1.0
ПРИМЕЧАНИЕ. Иногда создание образа Docker с таким количеством слоев может быть дорогостоящим и несложным. Если вы хотите, вы можете создать образ докера только с одним слоем.
$ docker build --squash -t onelayerexample .
Спасибо, что уделили внимание до сих пор и читаете мой блог. Не стесняйтесь оставлять мне комментарии. Увидимся в моем следующем блоге о Docker.
Оставаться здоровым.