🏠 Домашнее задание 2.1

📋 Docker & Cloud Tech: Домашнее задание 2.1

⚡ Суть задания

Запустить nginx, войти через exec, найти index.html, заменить заголовок на Welcome from <hostname>, скопировать файл на хост через docker cp.

# Терминал — краткая последовательность
docker run -d --name my_web nginx
docker exec my_web hostname            # запомнить ID хоста
docker cp my_web:/usr/share/nginx/html/index.html .
# Отредактировать index.html: заменить "Welcome to nginx!" на "Welcome from <ID>"
docker cp index.html my_web:/usr/share/nginx/html/
docker exec my_web cat /usr/share/nginx/html/index.html

Задание из LMS

Docker & Cloud Tech: Домашнее задание 2.1

  1. Запустите контейнер из образа веб-сервера, например, nginx.
  2. Запустите контейнер в режиме, чтобы он продолжал работать длительное время (не останавливался мгновенно).
  3. Войдите в контейнер, используя команду exec, и проверьте наличие конфигурационного файла веб-сервера (/usr/share/nginx/html/index.html).
  4. В строке <title>Welcome to nginx!</title> конфигурационного файла (/usr/share/nginx/html/index.html) замените Welcome to nginx! на Welcome from <hostname>, где <hostname> — результат выполнения команды hostname внутри контейнера.
  5. Скопируйте из контейнера (docker cp) этот конфигурационный файл с исправленной строкой и пришлите его.

Подготовка окружения

Перед выполнением убедитесь:

  • Docker Desktop запущен (иконка в трее активна)
  • Терминал открыт (PowerShell на Windows, bash на Linux/Mac)
  • Доступ в интернет (для загрузки образа nginx, если он не скачан)
# Терминал: проверить, что Docker работает
docker --version
docker ps

Пошаговое решение

Шаг 1: Запустить контейнер nginx в фоновом режиме

Nginx — это веб-сервер, у которого есть собственный вечный процесс. Флаг -d запускает его в фоне (detached mode), поэтому дополнительная «задержка» вроде tail -f /dev/null не нужна.

# Терминал
docker run -d --name my_web nginx
# Вывод: <container_id> (длинный hex)

# Убедиться, что контейнер работает
docker ps
# CONTAINER ID   IMAGE   COMMAND                  STATUS        NAMES
# 0194da877895   nginx   "/docker-entrypoint.…"   Up 5 seconds  my_web

Связь с теорией: docker run создаёт и запускает контейнер. Флаг -d — detached mode.

Шаг 2: Проверить наличие конфигурационного файла

# Терминал
docker exec my_web ls -l /usr/share/nginx/html/index.html
# -rw-r--r-- 1 root root 896 Apr 7 11:37 /usr/share/nginx/html/index.html

Команда docker exec my_web ls -l ... выполняет ls -l внутри контейнера my_web, не входя в оболочку. Связь с теорией: docker exec.

Шаг 3: Узнать hostname контейнера

По умолчанию Docker задаёт контейнеру hostname = первые 12 символов Container ID. Это имя нужно вставить в файл.

# Терминал
docker exec my_web hostname
# Пример вывода: 0194da877895
# Запомните это значение — оно понадобится в следующем шаге

Шаг 4: Скопировать index.html из контейнера на хост

# Терминал
docker cp my_web:/usr/share/nginx/html/index.html .
# Successfully copied 2.56kB to /current/directory/index.html

Команда docker cp CONTAINER:SRC DST копирует файл из контейнера на хост. Точка . означает текущую директорию. Связь с теорией: docker cp.

Шаг 5: Отредактировать index.html

Откройте скопированный файл в текстовом редакторе и замените текст в теге <title>.

Было:

<!-- /usr/share/nginx/html/index.html (фрагмент) -->
<head>
<title>Welcome to nginx!</title>
...

Стало (подставьте свой hostname из шага 3):

<!-- /usr/share/nginx/html/index.html (фрагмент) -->
<head>
<title>Welcome from 0194da877895</title>
...

Способы редактирования:

# Терминал (PowerShell — способ 1: PowerShell)
$hostname = docker exec my_web hostname
(Get-Content index.html) -replace "Welcome to nginx!", "Welcome from $hostname" | Set-Content index.html

# Способ 2: открыть в VS Code
code index.html
# Найти (Ctrl+H): "Welcome to nginx!"
# Заменить на: "Welcome from 0194da877895"
# Терминал (bash — Linux/Mac)
HOSTNAME=$(docker exec my_web hostname)
sed -i "s/Welcome to nginx!/Welcome from $HOSTNAME/" index.html

Шаг 6: Скопировать изменённый файл обратно в контейнер

# Терминал
docker cp index.html my_web:/usr/share/nginx/html/
# Successfully copied 2.56kB to my_web:/usr/share/nginx/html/

Шаг 7: Проверить результат

# Терминал
docker exec my_web cat /usr/share/nginx/html/index.html
# В выводе должна быть строка:
# <title>Welcome from 0194da877895</title>

Шаг 8: Скопировать файл для отправки

Файл index.html уже лежит в текущей директории на хосте (мы его скопировали в шаге 4 и изменили). Это тот файл, который нужно отправить преподавателю.

Проверка в VS Code

  1. Откройте папку с index.html в VS Code: code .
  2. Откройте файл index.html
  3. Нажмите Ctrl+F, найдите «Welcome from» — заголовок должен содержать hostname контейнера
  4. В терминале VS Code можно выполнить все команды Docker непосредственно
Расширение Docker для VS Code: установите расширение «Docker» (ms-azuretools.vscode-docker). Оно позволяет управлять контейнерами и просматривать логи прямо из редактора.

Ожидаемый результат

<!-- /usr/share/nginx/html/index.html (итоговый вариант) -->
<html>
<head>
<title>Welcome from 0194da877895</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome from 0194da877895</h1>
...
</body>
</html>

Очистка после выполнения ДЗ

# Терминал
docker stop my_web
docker rm my_web

Связь с теорией и примерами

  • docker run — запуск контейнера, флаги -d и --name
  • docker exec и docker cp — взаимодействие с контейнером
  • Примеры — пример 3 (docker exec) и пример 4 (docker cp) демонстрируют именно эти команды
  • Ошибки — ошибка 3 объясняет, почему данные теряются без volume
← К оглавлению урока