Belov Solutions

Создание образов из Dockerfile: подробное руководство

Введение

Эта статья посвящена созданию Docker-образов с использованием Dockerfile. Мы рассмотрим, как создать образ, настроить его с помощью инструкций FROM, RUN, COPY и ENTRYPOINT, а также как оптимизировать образы с учетом файловой системы UnionFS. Примеры приведены для Linux и Windows.

Создание Dockerfile

Dockerfile — это текстовый файл с инструкциями для создания Docker-образа. Создайте каталог и файл Dockerfile:

Linux

mkdir cowsay
cd cowsay
touch Dockerfile

Windows (PowerShell)

mkdir cowsay
cd cowsay
New-Item Dockerfile

Добавьте в Dockerfile следующее содержимое:

FROM debian:wheezy
RUN apt-get update && apt-get install -y cowsay fortune

Инструкция FROM задаёт базовый образ (в данном случае debian:wheezy) и является обязательной первой инструкцией. Инструкция RUN выполняет команды в оболочке внутри образа, здесь — устанавливает пакеты cowsay и fortune.

Создание образа

Создайте образ с помощью команды docker build:

Linux/Windows

ls
Dockerfile
docker build -t test/cowsay-dockerfile .
Sending build context to Docker daemon  2.048 kB
Step 0 : FROM debian:wheezy
 ---> f6fab3b798be
Step 1 : RUN apt-get update && apt-get install -y cowsay fortune
 ---> Running in 29c7bd4b0adc
...
Setting up cowsay (3.03+dfsg1-4) ...
 ---> dd66dc5a99bd
Removing intermediate container 29c7bd4b0adc
Successfully built dd66dc5a99bd

Команда docker build создаёт образ с именем test/cowsay-dockerfile. Запустите контейнер из этого образа:

Linux/Windows

docker run test/cowsay-dockerfile /usr/games/cowsay "Moo"

Образы, контейнеры и файловая система UnionFS

Docker использует файловую систему UnionFS (иногда называемую каскадно-объединённым монтированием), которая объединяет несколько файловых систем в одну. Образы состоят из слоёв, каждый из которых создаётся инструкцией в Dockerfile и является защищённым от записи. При запуске контейнера добавляется верхний слой с возможностью записи. Узнать, какая реализация UnionFS используется, можно командой:

Linux/Windows

docker info --format '{{.Driver}}'

Поддерживаемые реализации включают AUFS, Overlay, devicemapper, BTRFS и ZFS. Изменение драйвера хранения рекомендуется только при глубоком понимании его преимуществ и недостатков.

Каждая инструкция в Dockerfile создаёт новый слой. Чтобы минимизировать их количество (например, из-за лимита AUFS в 127 слоёв), объединяйте команды в одной инструкции RUN. Контейнеры могут быть в состояниях: created, restarting, running, paused или exited. Остановленный контейнер сохраняет изменения, включая настройки (например, IP-адрес), в отличие от исходного образа.

Упрощение запуска с помощью ENTRYPOINT

Инструкция ENTRYPOINT задаёт команду, выполняемую при запуске контейнера. Обновите Dockerfile:

FROM debian:wheezy
RUN apt-get update && apt-get install -y cowsay fortune
ENTRYPOINT ["/usr/games/cowsay"]

Пересоздайте образ и запустите контейнер:

Linux/Windows

docker build -t test/cowsay-dockerfile .
docker run test/cowsay-dockerfile "Moo"

Теперь не нужно указывать /usr/games/cowsay при запуске, но команда fortune недоступна. Для её поддержки создайте скрипт entrypoint.sh:

Linux

echo '#!/bin/bash
if [ $# -eq 0 ]; then
    /usr/games/fortune | /usr/games/cowsay
else
    /usr/games/cowsay "$@"
fi' > entrypoint.sh
chmod +x entrypoint.sh

Windows (PowerShell)

@"
#!/bin/bash
if [ $# -eq 0 ]; then
    /usr/games/fortune | /usr/games/cowsay
else
    /usr/games/cowsay "$@"
fi
"@ | Out-File -FilePath entrypoint.sh -Encoding ASCII
# В Windows для chmod используйте WSL или Git Bash, если доступно
# Например, в WSL: chmod +x entrypoint.sh

Обновите Dockerfile:

FROM debian:wheezy
RUN apt-get update && apt-get install -y cowsay fortune
COPY entrypoint.sh /
ENTRYPOINT ["/entrypoint.sh"]

Инструкция COPY копирует entrypoint.sh в образ. Скрипт запускает fortune | cowsay, если аргументы отсутствуют, или cowsay с переданными аргументами. Создайте и протестируйте образ:

Linux/Windows

docker build -t test/cowsay-dockerfile .
docker run test/cowsay-dockerfile
 ____________________________________
/ The last thing one knows in        \
| constructing a work is what to put |
| first.                             |
| (Лишь в конце работы мы обычно узнаем,   |
| с чего ее нужно было начать.)            |
\ -- Blaise Pascal (Блез Паскаль)      /
 ------------------------------------
       \
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

docker run test/cowsay-dockerfile "Hello Moo"
 ____________
< Hello Moo >
 ------------
       \
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

Заключение

Вы узнали, как создавать Docker-образы с помощью Dockerfile, используя инструкции FROM, RUN, COPY и ENTRYPOINT. Также вы познакомились с файловой системой UnionFS и её ролью в Docker. В следующих статьях мы изучим работу с реестрами и более сложные сценарии.

Отзывы

Оставить отзыв

Ваша эл. почта не будет опубликована