Пользовательские образы Docker

DockerBeginner
Практиковаться сейчас

Введение

Docker — это мощный инструмент для упаковки и распространения приложений в виде контейнеров. В основе этого процесса лежат образы Docker — предварительно собранные пакеты, содержащие все необходимое для запуска приложения, включая код, зависимости и конфигурацию. В ходе этого практикума вы научитесь создавать пользовательские образы Docker, которые расширяют возможности ваших приложений за счет включения дополнительного программного обеспечения, библиотек или специфических настроек.

На протяжении всей лабораторной работы мы будем использовать WebIDE (VS Code) для редактирования файлов. WebIDE предоставляет привычный и удобный интерфейс, что упрощает работу с конфигурационными файлами и кодом.

Настройка среды проекта

Начнем с создания директории проекта и перехода в нее.

Напоминаем, что для редактирования файлов мы используем WebIDE (VS Code), которая обеспечивает удобную работу с файловой структурой проекта.

  1. Откройте терминал в WebIDE. Это можно сделать, нажав «Terminal» в верхнем меню и выбрав «New Terminal».
  2. В терминале выполните следующие команды:
mkdir -p ~/project/docker
cd ~/project/docker
Терминал, показывающий команды создания директории проекта

Эти команды создают новую папку docker внутри каталога ~/project и делают ее текущей рабочей директорией.

  1. Убедитесь, что вы находитесь в правильной директории:
pwd

В выводе вы должны увидеть путь /home/labex/project/docker.

Разбор команд:

  • mkdir -p: создает директорию. Флаг -p позволяет создавать родительские директории, если они еще не существуют.
  • cd: изменяет текущую рабочую директорию.
  • pwd: выводит путь к текущей рабочей директории.

Создание простого образа Docker

Теперь создадим простой образ Docker, который запускает веб-сервер Nginx.

  1. В WebIDE перейдите в проводник файлов (обычно это первая иконка на боковой панели слева).
  2. Нажмите правой кнопкой мыши в панели проводника и выберите «New File». Назовите его Dockerfile (с заглавной буквы 'D' и без расширения).
  3. Откройте Dockerfile, нажав на него. Добавьте следующее содержимое:
FROM nginx
COPY index.html /usr/share/nginx/html/

Этот Dockerfile определяет новый образ на основе официального образа Nginx и копирует файл index.html в корневую директорию документов Nginx по умолчанию.

Разбор Dockerfile:

  • FROM nginx: эта строка указывает базовый образ. В данном случае мы используем официальный образ Nginx.
  • COPY index.html /usr/share/nginx/html/: эта строка копирует наш файл index.html в веб-директорию внутри контейнера.
  1. Создайте новый файл с именем index.html в той же директории.
  2. Откройте index.html и добавьте следующий HTML-код:
<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Hello Docker!</title>
  </head>
  <body>
    <h1>Hello Docker!</h1>
    <p>This is a custom Docker image.</p>
  </body>
</html>

Это простая страница, которую будет отдавать наш сервер Nginx.

  1. Откройте терминал в WebIDE и соберите образ Docker с помощью следующей команды:
docker build -t my-nginx .

Эта команда создает новый образ Docker с тегом my-nginx.

Разбор команды:

  • docker build: команда для сборки образа.
  • -t my-nginx: флаг -t присваивает образу имя (тег) my-nginx.
  • .: указывает, что контекст сборки (директория с Dockerfile) — это текущая папка.
  1. После завершения сборки проверьте, что образ был успешно создан:
docker images

Вы должны увидеть my-nginx в списке доступных образов.

Запуск и тестирование пользовательского образа

Давайте запустим контейнер на основе нашего нового образа и проверим его работу.

  1. В терминале WebIDE запустите контейнер следующей командой:
docker run -d -p 8080:80 --name my-nginx-container my-nginx

Разбор команды:

  • docker run: создает и запускает новый контейнер.
  • -d: запускает контейнер в фоновом режиме (detached mode).
  • -p 8080:80: пробрасывает порт 8080 хост-машины на порт 80 внутри контейнера.
  • --name my-nginx-container: присваивает контейнеру понятное имя.
  • my-nginx: имя образа, который мы используем.
  1. Убедитесь, что контейнер запущен:
docker ps

Вы должны увидеть my-nginx-container в списке. Эта команда показывает все активные контейнеры.

  1. Чтобы просмотреть содержимое веб-страницы, используйте команду curl:
curl http://localhost:8080

В терминале должен отобразиться HTML-код файла index.html.

Если вам интересно, что такое curl — это инструмент для передачи данных с сервера или на сервер. В данном случае мы используем его для получения контента с нашего веб-сервера.

Вы также можете нажать на иконку «+» в верхней части интерфейса LabEx VM, чтобы создать новый веб-сервер, и ввести порт 8080 для просмотра страницы в браузере.

Настройка порта веб-сервера

Добавление программного обеспечения в образ

Теперь модифицируем наш образ Docker, чтобы включить в него дополнительное ПО. В качестве примера добавим утилиту curl.

  1. В WebIDE откройте Dockerfile.
  2. Измените содержимое Dockerfile на следующее:
FROM nginx
RUN apt-get update && apt-get install -y curl
COPY index.html /usr/share/nginx/html/

В этот Dockerfile добавлена инструкция RUN, которая обновляет индекс пакетов и устанавливает утилиту curl с помощью пакетного менеджера apt-get.

Разбор новой строки:

  • RUN apt-get update && apt-get install -y curl: обновляет список пакетов и устанавливает curl. Флаг -y автоматически подтверждает установку, чтобы процесс не прерывался на запросы подтверждения.
  1. Сохраните файл в WebIDE, нажав Ctrl+S (или Cmd+S на Mac).
  2. В терминале WebIDE пересобберите образ с новым тегом:
docker build -t my-nginx-curl .

Эта команда создаст новый образ my-nginx-curl, в котором уже предустановлена утилита curl.

  1. Проверьте создание нового образа:
docker images

Вы должны увидеть my-nginx-curl в списке.

Тестирование образа с установленным Curl

Запустим контейнер на основе нового образа и проверим работу утилиты curl прямо внутри него.

  1. В терминале WebIDE запустите новый контейнер:
docker run -d --name curl-container my-nginx-curl
  1. Запустите оболочку bash внутри работающего контейнера:
docker exec -it curl-container bash

Эта команда открывает интерактивный сеанс bash внутри контейнера.

Разбор команды:

  • docker exec: выполняет команду в запущенном контейнере.
  • -it: эти флаги выделяют псевдо-терминал и оставляют стандартный ввод открытым, позволяя вам взаимодействовать с оболочкой.
  • curl-container: имя нашего контейнера.
  • bash: команда, которую мы запускаем (открытие командной оболочки).
  1. Теперь вы увидите новое приглашение командной строки — это значит, что вы находитесь внутри контейнера. Протестируйте curl:
curl http://localhost

Вы должны увидеть HTML-содержимое файла index.html.

  1. Выйдите из оболочки контейнера:
exit

Вы вернетесь в терминал вашей основной системы.

Использование переменных окружения в образе

На этом этапе мы изменим образ так, чтобы использовать переменные окружения для настройки параметров.

  1. В WebIDE снова откройте Dockerfile.

  2. Измените содержимое на следующее:

FROM nginx
ENV NGINX_PORT 9000
RUN sed -i "s/listen[[:space:]]*80;/listen $NGINX_PORT;/g" /etc/nginx/conf.d/default.conf
COPY index.html /usr/share/nginx/html/

Здесь добавлена инструкция ENV, которая задает переменную NGINX_PORT со значением 9000. Также добавлена команда RUN, которая правит конфигурацию Nginx для использования этого порта.

Разбор новых строк:

  • ENV NGINX_PORT 9000: устанавливает переменную окружения.
  • RUN sed -i ...: использует потоковый редактор sed для замены порта по умолчанию (80) на значение из нашей переменной в конфигурационном файле Nginx.
  1. Сохраните файл.

  2. В терминале соберите образ с новым тегом:

docker build -t my-nginx-env .
  1. Запустите контейнер на основе этого образа:
docker run -d -p 9000:9000 --name env-container my-nginx-env

Мы пробрасываем порт 9000 хоста на порт 9000 контейнера. Поскольку переменная уже задана в Dockerfile, Nginx автоматически начнет слушать этот порт.

  1. Проверьте работу сервера на указанном порту:
curl http://localhost:9000

Вы должны получить содержимое index.html.

Использование ENTRYPOINT в Dockerfile

Теперь мы узнаем, как использовать инструкцию ENTRYPOINT для более гибкого управления запуском контейнера, и попробуем использовать другой порт (9100).

  1. В WebIDE снова откройте Dockerfile.

  2. Измените его содержимое следующим образом:

FROM nginx
COPY index.html /usr/share/nginx/html/
COPY start.sh /start.sh
RUN chmod +x /start.sh
ENTRYPOINT ["/start.sh"]

Мы убрали жестко заданную переменную и команду sed из Dockerfile. Вместо этого мы будем настраивать параметры во время запуска с помощью скрипта ENTRYPOINT. Это делает образ более универсальным.

  1. Создайте в той же директории новый файл start.sh со следующим содержимым:
#!/bin/bash
## Устанавливаем порт по умолчанию, если NGINX_PORT не задан
export NGINX_PORT=${NGINX_PORT:-9100}
## Заменяем порт в конфигурации nginx
sed -i "s/listen[[:space:]]*80;/listen $NGINX_PORT;/g" /etc/nginx/conf.d/default.conf
echo "Starting Nginx on port $NGINX_PORT"
nginx -g 'daemon off;'

Этот скрипт проверяет наличие переменной окружения, правит конфиг Nginx «на лету», выводит информационное сообщение и запускает Nginx.

  1. Сохраните оба файла.

  2. Соберите образ:

docker build -t my-nginx-entrypoint .
  1. Запустите контейнер, передав переменную окружения через флаг -e:
docker run -d -p 9100:9100 -e NGINX_PORT=9100 --name entrypoint-container my-nginx-entrypoint
  1. Проверьте логи контейнера, чтобы увидеть сообщение о запуске:
docker logs entrypoint-container

Вы должны увидеть строку "Starting Nginx on port 9100".

  1. Убедитесь, что сервер отвечает по новому порту:
curl http://localhost:9100

Резюме

В ходе этого практикума вы научились создавать пользовательские образы Docker, адаптированные под нужды ваших приложений. Вы начали с простого образа веб-сервера, а затем перешли к установке дополнительного ПО и использованию переменных окружения для гибкой настройки. Использование WebIDE сделало процесс редактирования файлов и управления проектом интуитивно понятным.

Вот краткий список того, что вы освоили:

  1. Настройка среды проекта и базовые команды терминала.
  2. Создание простого образа Docker с Nginx и собственной HTML-страницей.
  3. Сборка и запуск контейнеров с использованием проброса портов и именования.
  4. Модификация образа для включения дополнительных утилит (curl).
  5. Использование docker exec для работы внутри запущенного контейнера.
  6. Применение переменных окружения и скриптов запуска для динамической конфигурации образов.