Задание из LMS
Docker & Cloud Tech: Домашнее задание 2.1
- Запустите контейнер из образа веб-сервера, например, nginx.
- Запустите контейнер в режиме, чтобы он продолжал работать длительное время (не останавливался мгновенно).
- Войдите в контейнер, используя команду
exec, и проверьте наличие конфигурационного файла веб-сервера (/usr/share/nginx/html/index.html). - В строке
<title>Welcome to nginx!</title>конфигурационного файла (/usr/share/nginx/html/index.html) заменитеWelcome to nginx!наWelcome from <hostname>, где<hostname>— результат выполнения командыhostnameвнутри контейнера. - Скопируйте из контейнера (
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
- Откройте папку с
index.htmlв VS Code:code . - Откройте файл
index.html - Нажмите Ctrl+F, найдите «Welcome from» — заголовок должен содержать hostname контейнера
- В терминале VS Code можно выполнить все команды 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