✅ Решения заданий урока 03

⚡ Ключи решений

  • Задание 1: FROM nginx:alpine + COPY index.html /usr/share/nginx/html/ + docker build -t my-nginx .
  • Задание 2: FROM debian:stable-slim + curl + скрипт + VOLUME ["/data"] + docker run --rm -v "${PWD}/data:/data"
  • Задание 3: FROM python:3.12-slim + COPY + RUN pip + ENTRYPOINT ["python3", "memory_info.py"]

Решение задания 1: nginx с кастомной страницей

Файлы проекта

<!-- my-nginx/index.html -->
<!DOCTYPE html>
<html lang="ru">
<head>
  <meta charset="UTF-8">
  <title>Hello ICH!</title>
</head>
<body>
  <h1>Success! The NGINX server is working!</h1>
  <p>Страница обслуживается из Docker-контейнера.</p>
</body>
</html>
# my-nginx/Dockerfile

# Официальный образ NGINX на alpine — минимальный размер
FROM nginx:1.27-alpine

# Копируем нашу страницу в директорию статики nginx
COPY index.html /usr/share/nginx/html/

# Документируем порт
EXPOSE 80

# CMD уже определён в базовом образе: nginx -g "daemon off;"

Команды

# Терминал (PowerShell) — из папки my-nginx
docker build -t my-nginx:1.0 .

docker run -d -p 8080:80 --name my-running-nginx my-nginx:1.0

# Проверка
docker ps
# Открыть http://localhost:8080 — должна появиться ваша страница

Объяснение

  • nginx:1.27-alpine — конкретная версия вместо latest делает сборку воспроизводимой
  • COPY index.html /usr/share/nginx/html/ — nginx по умолчанию ищет файлы в этой директории
  • -p 8080:80 — проброс порта: 8080 на хосте → 80 в контейнере

Решение задания 2: Bash-скрипт с volume

# fetch-data-app/fetch_data.sh
#!/bin/bash

URL="https://api.coindesk.com/v1/bpi/currentprice.json"
OUTPUT_FILE="/data/price.json"

curl -o "$OUTPUT_FILE" "$URL"
echo "Data saved to $OUTPUT_FILE"
# fetch-data-app/Dockerfile

FROM debian:stable-slim

# Один RUN: обновление + установка + очистка кеша
RUN apt-get update && apt-get install -y curl \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

COPY fetch_data.sh /usr/local/bin/fetch_data.sh
RUN chmod +x /usr/local/bin/fetch_data.sh

WORKDIR /usr/src/app

ENV URL=https://api.coindesk.com/v1/bpi/currentprice.json
ENV OUTPUT_FILE=/data/price.json

VOLUME ["/data"]

CMD ["/usr/local/bin/fetch_data.sh"]
# Терминал (PowerShell)
docker build -t fetch-data-image .

mkdir data

docker run --rm -v "${PWD}/data:/data" fetch-data-image

# Проверка результата
type data\price.json

Объяснение

  • VOLUME ["/data"] — объявляет точку монтирования; при -v данные пишутся в папку хоста
  • --rm — контейнер удаляется после выполнения, данные сохраняются через volume
  • ${PWD} в PowerShell — текущая директория (аналог $(pwd) в bash)

Решение задания 3: Python + psutil

Это задание совпадает с ДЗ из LMS. Подробное пошаговое решение — в homework.html.

# memory-info-app/memory_info.py
import psutil
import platform

def get_cpu_usage():
    return psutil.cpu_percent(interval=1)

def get_memory_usage():
    memory = psutil.virtual_memory()
    return {
        'Всего': f'{memory.total / (1024**3):.2f} ГБ',
        'Используется': f'{memory.used / (1024**3):.2f} ГБ',
        'Свободно': f'{memory.available / (1024**3):.2f} ГБ',
        'Процент использования': f'{memory.percent}%'
    }

def main():
    import os
    os.makedirs('data', exist_ok=True)
    with open('data/output.txt', 'a') as f:
        print("OS: ", platform.platform(), file=f)
        print("=== Мониторинг системы ===", file=f)
        print(f"\nЗагрузка CPU: {get_cpu_usage()}%", file=f)
        print("\nИспользование памяти:", file=f)
        for key, value in get_memory_usage().items():
            print(f"{key}: {value}", file=f)

if __name__ == '__main__':
    main()
# memory-info-app/requirements.txt
psutil
# memory-info-app/Dockerfile
FROM python:3.12-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY memory_info.py .

ENTRYPOINT ["python3", "memory_info.py"]
# Терминал (PowerShell)
docker build -t memory-info-image .

mkdir data

docker run --rm -v "${PWD}/data:/app/data" memory-info-image

type data\output.txt
← Задания  ·  ← К оглавлению урока