Dockerfile — скрипт, используемый для автоматизации процесса создания образов Docker. Этот текстовый документ содержит специальные инструкции (команды), которые помогают настраивать различные параметры, устанавливать зависимости, копировать файлы и так далее.
В этой статье мы расскажем, как создавать и настраивать образы с помощью Dockerfile.
Содержание:
- Синтаксис Dockerfile
- Написание Dockerfile для образа
- Создание нового образа на основе Dockerfile
- Запуск контейнера и доступ к веб-серверу Apache
- Мониторинг процессов приложения внутри контейнера Docker
- Создание системного файла настроек контейнера Docker
- Выводы
Синтаксис Dockerfile
Dockerfile содержит набор инструкций, которые можно разделить на две категории: обязательные и необязательные. К обязательным относятся:
- FROM — указывает базовый образ, на основе которого будет создан новый;
- WORKDIR — задает рабочий каталог внутри контейнера;
- COPY — копирует код приложения и файлы в образ;
- RUN — выполняет команды во время сборки образа;
- EXPOSE — определяет, какой сетевой порт будет использовать приложение внутри контейнера;
- CMD — определяет команду по умолчанию для выполнения при запуске контейнера.
Написание Dockerfile для образа
Допустим, нам нужно создать собственный образ Docker на базе Ubuntu с установленным веб-сервером Apache. Для этого создадим Dockerfile в каталоге /var/docker/ubuntu/apache:
sudo mkdir -p /var/docker/ubuntu/apachesudo touch /var/docker/ubuntu/apache/Dockerfile
Затем откроем его с помощью текстового редактора nano и заполним следующими инструкциями:
FROM ubuntuRUN apt updateRUN apt -y install apache2RUN echo “Hello Apache server on Ubuntu Docker” > /var/www/html/index.htmlEXPOSE 80CMD /usr/sbin/apache2ctl -D FOREGROUND
Давайте детальнее разберем этот код:
- FROM ubuntu — указывает, что новый образ будет создан на основе официального образа Ubuntu;
- RUN apt update — обновляет репозиторий пакетов в образе Ubuntu;
- RUN apt -y install apache2 — устанавливает в образ Apache;
- RUN echo «Hello Apache server on Ubuntu Docker» > /var/www/html/index.html — создает HTML-файл с указанным содержанием и размещает его в стандартном корневом каталоге Apache;
- EXPOSE 80 — указывает, что контейнер будет прослушивать порт 80;
- CMD /usr/sbin/apache2ctl -D FOREGROUND — определяет команду по умолчанию для выполнения при запуске контейнера (в данном случае запускается веб-сервер Apache на переднем плане, позволяя пользователю управлять его процессом).
Создание нового образа на основе Dockerfile
Чтобы создать новый образ на базе Dockerfile, используется команда docker build. Ее синтаксис имеет следующий вид:
docker build [OPTIONS] PATH
Где PATH — путь к каталогу, в котором находится Dockerfile.
Теперь создадим образ с названием ubuntu-apache (для этого применим параметр -t) с помощью написанного ранее Dockerfile:
sudo docker build -t ubuntu-apache /var/docker/ubuntu/apache/
На скриншоте выше видно, что Docker успешно выполнил все инструкции, указанные в Dockerfile, и создал новый образ с именем ubuntu-apache.
Чтобы убедиться в этом, просмотрим список всех образов Docker в ОС:
sudo docker images
Запуск контейнера и доступ к веб-серверу Apache
Итак, чтобы запустить контейнер на базе образа ubuntu-apache, воспользуемся следующей командой:
sudo docker run -d -p 81:80 ubuntu-apache
Где -d — опция, которая запускает контейнер в фоновом режиме.
Проверим, что контейнер действительно работает, используя команду netstat:
sudo netstat -tulpn | grep :81
На скриншоте видно, что Docker прослушивает порт 81.
У созданного контейнера Docker есть свой IP-адрес. Просмотреть его можно с помощью команды ip addr:
ip addr
У нашего контейнера IP-адрес — 172.17.0.1. Мы можем применять его или IP-адрес локального хоста, чтобы отобразить в терминале информацию с веб-страницы Apache:
curl 172.17.0.1:81curl localhost:81
В обоих случаях утилита curl вывела в терминал сообщение «Hello Apache server on Ubuntu Docker».
Также мы можем использовать IP-адреса для отображения страницы Apache в браузере. Для этого следует написать в поисковой строке один из следующих запросов:
http://172.17.0.1:81http://localhost:81
Мониторинг процессов приложения внутри контейнера Docker
Команда docker top используется для отображения списка запущенных процессов внутри контейнера Docker. Она предоставляет следующую информацию о процессах:
- имя пользователя, который запустил процесс;
- идентификатор PID;
- время работы и многое другое.
Для примера узнаем, какие процессы работают в нашем контейнере:
sudo docker top <container ID>
Команда docker stats в режиме реального времени предоставляет информацию об использовании контейнером следующих ресурсов:
- процессора;
- ОЗУ;
- сети;
- устройства блочного ввода-вывода.
Например:
sudo docker stats <container ID>
Создание системного файла настроек контейнера Docker
Возможности системы инициализации systemd позволяют создавать файлы настроек для контейнеров Docker, как для любой другой локальной службы. Для примера создадим файл настроек /etc/systemd/system/apache-docker.service для нашего контейнера:
sudo touch /etc/systemd/system/apache-docker.service
И заполним его следующим кодом:
[Unit]Description=apache containerRequires=docker.serviceAfter=docker.service[Service]Restart=alwaysExecStart=/usr/bin/docker start -a <container-name>ExecStop=/usr/bin/docker stop -t 2 <container-name>[Install]WantedBy=local.target
Где <container-name> — название контейнера.
Сохраним и закроем этот текстовый документ. Затем перезагрузим демон systemd:
sudo systemctl daemon-reload
Запустим службу на основе нашего контейнера Docker и отобразим ее статус в терминале:
sudo systemctl start apache-docker.servicesudo systemctl status apache-docker.service
Понимание синтаксиса инструкций Dockerfile позволяет с легкостью создавать и настраивать новые образы Docker. Чтобы более детально разобраться с Docker, рекомендуем прочесть остальные статьи из этой серии.
Спасибо за время, уделенное прочтению статьи!
Если возникли вопросы — задавайте их в комментариях.












