Введение
Эта статья посвящена созданию 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. В следующих статьях мы изучим работу с реестрами и более сложные сценарии.
Отзывы