Введение
Docker — это мощный инструмент для упаковки и распространения приложений в виде контейнеров. В основе этого процесса лежат образы Docker — готовые пакеты, содержащие всё необходимое для запуска приложения, включая код, зависимости и конфигурацию. В этой лабораторной работе вы научитесь создавать пользовательские образы Docker, которые расширяют возможности ваших приложений за счет включения дополнительного программного обеспечения, библиотек или настроек.
На протяжении всей лабораторной работы мы будем использовать WebIDE (VS Code) для редактирования файлов. WebIDE предоставляет привычный и удобный интерфейс, что упрощает работу с конфигурационными файлами и кодом.
Настройка среды проекта
Давайте начнем с создания директории проекта и перехода в нее.
На протяжении всей лабораторной работы мы будем использовать WebIDE (VS Code) для редактирования файлов. WebIDE предоставляет привычный и удобный интерфейс, что упрощает работу с конфигурационными файлами и кодом.
- Откройте терминал в WebIDE. Это можно сделать, нажав «Terminal» в верхнем меню и выбрав «New Terminal».
- В терминале выполните следующие команды:
mkdir -p ~/project/docker
cd ~/project/docker

Эта команда создает новую директорию docker в папке ~/project и переходит в нее.
- Убедитесь, что вы находитесь в нужной директории:
pwd
В выводе вы должны увидеть /home/labex/project/docker.
Разбор команд:
mkdir -p: создает директорию. Флаг-pпозволяет создавать родительские директории, если они не существуют.cd: меняет текущую директорию.pwd: выводит путь к текущей рабочей директории.
Создание простого образа Docker
Теперь давайте создадим простой образ Docker, который запускает веб-сервер Nginx.
- В WebIDE перейдите в проводник файлов (обычно это первая иконка на левой боковой панели).
- Нажмите правой кнопкой мыши в области проводника и выберите «New File». Назовите его
Dockerfile(с заглавной буквы 'D', без расширения). - Откройте
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в корневую веб-директорию контейнера.
- Создайте новый файл
index.htmlв той же директории. Для этого снова нажмите правой кнопкой мыши в проводнике и выберите «New File». - Откройте
index.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>
Это простая HTML-страница, которая будет обслуживаться нашим сервером Nginx.
- Откройте терминал в WebIDE (Terminal -> New Terminal, если вы закрыли предыдущий) и соберите образ Docker с помощью следующей команды:
docker build -t my-nginx .
Эта команда собирает новый образ Docker с тегом my-nginx.
Разбор команды:
docker build: команда для сборки образа Docker.-t my-nginx: флаг-tприсваивает нашему образу имяmy-nginx..: указывает контекст сборки (директорию, содержащую Dockerfile) как текущую директорию.
- После завершения сборки убедитесь, что образ был успешно создан:
docker images
Вы должны увидеть образ my-nginx в списке.
Запуск и тестирование пользовательского образа
Давайте запустим контейнер на основе нашего нового образа и протестируем его.
- В терминале 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: имя образа, который мы используем для создания контейнера.
- Убедитесь, что контейнер запущен:
docker ps
Вы должны увидеть my-nginx-container в списке. Эта команда показывает все запущенные контейнеры.
- Чтобы просмотреть содержимое веб-страницы, используйте команду
curl:
curl http://localhost:8080
Вы должны увидеть HTML-код файла index.html в терминале.
Если вам интересно, что делает curl — это инструмент для передачи данных с сервера или на сервер. В данном случае мы используем его для получения контента с нашего веб-сервера.
Вы также можете перейти в верхнюю часть виртуальной машины LabEx, нажать «+» для создания нового веб-сервера и ввести порт 8080, чтобы просмотреть содержимое.

Добавление пользовательского ПО в образ
На этом этапе вы измените свой образ Docker, чтобы включить в него дополнительное программное обеспечение. В качестве примера мы добавим текстовый редактор nano, так как он отсутствует в базовом образе nginx.
- В WebIDE откройте
Dockerfile. - Измените содержимое
Dockerfileна следующее:
FROM nginx
RUN apt-get update && apt-get install -y nano
COPY index.html /usr/share/nginx/html/
Этот Dockerfile добавляет новую инструкцию RUN, которая обновляет индекс пакетов и устанавливает пакет nano с помощью менеджера пакетов apt-get.
Разбор новой строки:
RUN apt-get update && apt-get install -y nano: эта строка обновляет список пакетов (apt-get update), а затем устанавливаетnano(apt-get install -y nano). Флаг-yавтоматически отвечает «yes» на все запросы во время установки.
- Сохраните файл в WebIDE, нажав Ctrl+S (или Cmd+S на Mac).
- В терминале WebIDE пересоберите образ Docker с новым тегом:
docker build -t my-nginx-nano .
Эта команда собирает новый образ Docker с тегом my-nginx-nano, который включает редактор nano.
- Убедитесь, что новый образ создан:
docker images
Вы должны увидеть образ my-nginx-nano в списке.
Тестирование пользовательского образа с Nano
На этом этапе вы запустите контейнер на основе вашего нового образа и подтвердите, что пакет nano доступен внутри него.
- В терминале WebIDE запустите новый контейнер с помощью следующей команды:
docker run -d --name nano-container my-nginx-nano
Эта команда запускает новый контейнер на основе образа my-nginx-nano и называет его nano-container.
- Выполните следующую команду, чтобы проверить установленную версию
nanoвнутри контейнера:
docker exec nano-container nano --version
Эта команда выполняет nano --version внутри запущенного контейнера, чтобы вы могли убедиться, что пакет установлен.
Разбор команды:
docker exec: выполняет команду в запущенном контейнере.nano-container: имя нашего контейнера.nano --version: выводит установленную версиюnanoизнутри контейнера.
- Вы должны увидеть вывод, начинающийся с
GNU nano, что подтверждает наличие редактора в пользовательском образе.
Использование переменных окружения в образе
На этом этапе мы изменим наш образ Docker для использования переменных окружения в целях настройки.
В WebIDE снова откройте
Dockerfile.Измените содержимое
Dockerfileна следующее:
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/
Этот Dockerfile добавляет инструкцию ENV, которая устанавливает переменную NGINX_PORT в значение 9000. Также добавлена инструкция RUN, которая изменяет конфигурацию Nginx для использования этого порта.
Разбор новых строк:
ENV NGINX_PORT 9000: устанавливает переменную окруженияNGINX_PORTсо значением9000.RUN sed -i "s/listen[[:space:]]*80;/listen $NGINX_PORT;/g" /etc/nginx/conf.d/default.conf: используетsedдля замены порта по умолчанию (80) на значение нашей переменной окружения в конфигурационном файле Nginx.
Сохраните файл в WebIDE.
В терминале WebIDE пересоберите образ Docker с новым тегом:
docker build -t my-nginx-env .
- Запустите контейнер на основе нового образа:
docker run -d -p 9000:9000 --name env-container my-nginx-env
Эта команда запускает новый контейнер на основе образа my-nginx-env и пробрасывает порт 9000 на хосте на порт 9000 в контейнере. Обратите внимание, что переменная окружения уже задана в Dockerfile, поэтому ее не нужно указывать повторно в команде docker run.
- Убедитесь, что веб-сервер запущен на указанном порту:
curl http://localhost:9000
Вы должны увидеть HTML-контент файла index.html в терминале.
Использование ENTRYPOINT в Dockerfile
На этом этапе мы узнаем, как использовать инструкцию ENTRYPOINT в Dockerfile, и задействуем другой порт (9100).
В WebIDE снова откройте
Dockerfile.Измените содержимое
Dockerfileна следующее:
FROM nginx
COPY index.html /usr/share/nginx/html/
COPY start.sh /start.sh
RUN chmod +x /start.sh
ENTRYPOINT ["/start.sh"]
Этот Dockerfile удаляет переменную окружения и команду sed. Вместо этого мы будем управлять конфигурацией во время выполнения с помощью скрипта ENTRYPOINT. Это делает наш образ более гибким.
- Создайте новый файл
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, и затем запускает Nginx.
Сохраните оба файла в WebIDE.
В терминале WebIDE пересоберите образ Docker с новым тегом:
docker build -t my-nginx-entrypoint .
- Запустите контейнер на основе нового образа. Мы установим порт 9100 с помощью переменной окружения.
docker run -d -p 9100:9100 -e NGINX_PORT=9100 --name entrypoint-container my-nginx-entrypoint
- Проверьте логи контейнера, чтобы увидеть сообщение о запуске:
docker logs entrypoint-container
Вы должны увидеть сообщение "Starting Nginx on port 9100" в выводе.
- Убедитесь, что веб-сервер правильно работает на новом порту:
curl http://localhost:9100
Вы должны увидеть HTML-контент файла index.html в терминале.
Резюме
В этой лабораторной работе вы научились создавать пользовательские образы Docker, которые расширяют функциональность ваших приложений. Вы начали с создания простого образа с веб-сервером, затем перешли к добавлению пользовательского ПО и использованию переменных окружения для конфигурации. На протяжении всей работы вы использовали WebIDE (VS Code) для редактирования файлов, что сделало процесс более интуитивно понятным и удобным.
Краткий итог проделанной работы:
- Настроили среду проекта и изучили базовые команды терминала.
- Создали простой образ Docker с Nginx и пользовательской HTML-страницей.
- Собирали и запускали контейнеры Docker, изучив проброс портов и именование контейнеров.
- Изменили образ Docker, добавив дополнительное ПО (curl).
- Использовали
docker execдля выполнения команд внутри контейнера. - Внедрили переменные окружения в образ Docker для упрощения конфигурации.



