✅ Решения заданий

⚡ Ключевые команды решений

# Задание 1
docker create ubuntu
docker run -d --name my_ubuntu_container ubuntu tail -f /dev/null
docker stop my_ubuntu_container && docker rm my_ubuntu_container

# Задание 2
docker run -d --name mynginx nginx
docker exec -it mynginx bash
echo "Hello, Docker!" | docker exec -i mynginx sh -c "cat > /tmp/hello.txt"

# Задание 3
docker images
docker history nginx
docker commit <ID> my-ubuntu:v1
docker rmi my-ubuntu:v1

Решение задания 1: Жизненный цикл контейнера

# Терминал

# 1. Создать контейнер из ubuntu (не запускать)
docker create ubuntu
# Вывод: <container_id> (например, a1b2c3d4e5f6...)

# 2. Запустить созданный контейнер
docker start <container_id>
# Контейнер мгновенно останавливается — образ ubuntu не имеет
# длительного процесса. Docker завершает контейнер, как только
# завершается PID 1 (которого по умолчанию нет у ubuntu).
docker ps -a
# STATUS: Exited (0) X seconds ago

# 3. Запустить в фоне с вечной задачей
docker run -d --name my_ubuntu_container ubuntu tail -f /dev/null
#   -d           фоновый режим
#   --name       имя для удобства
#   tail -f /dev/null  читает пустой файл вечно = контейнер не завершается
docker ps
# STATUS: Up X seconds

# 4a. Остановить через stop (graceful — SIGTERM, ждёт 10 с, потом SIGKILL)
docker stop my_ubuntu_container
# 4b. Или через kill (немедленный SIGKILL — не даёт приложению завершиться корректно)
# docker kill my_ubuntu_container

# Разница stop vs kill:
# stop: посылает SIGTERM → приложение может сохранить данные → SIGKILL через 10 с
# kill: сразу SIGKILL → немедленное завершение, данные могут не сохраниться

# 5. Перезапустить
docker restart my_ubuntu_container
docker ps
# STATUS: Up X seconds

# 6. Удалить (сначала нужно остановить)
docker stop my_ubuntu_container
docker rm my_ubuntu_container

# Или принудительно одной командой:
# docker rm -f my_ubuntu_container

# 7. Проверить
docker ps -a
# Контейнера my_ubuntu_container нет в списке

Решение задания 2: Инспектирование и взаимодействие с nginx

# Терминал

# 1. Запустить nginx в фоне
docker run -d --name mynginx nginx
docker ps -a
# Видим mynginx в статусе Up

# 2. Логи
docker logs mynginx          # весь журнал
docker logs -f mynginx       # следим в реальном времени (Ctrl+C для выхода)

# 3. Процессы и файлы
docker top mynginx
# PID    USER    COMMAND
# 1      root    nginx: master process nginx ...
# X      nginx   nginx: worker process

docker exec -it mynginx ls /   # список файлов в корне

# 4. Создать файл и скопировать в контейнер

# PowerShell (Windows):
"Hello, Docker!" | Out-File -Encoding utf8 hello.txt
docker cp hello.txt mynginx:/usr/share/nginx/html/hello.txt

# bash (Linux/Mac):
# echo "Hello, Docker!" > hello.txt
# docker cp hello.txt mynginx:/usr/share/nginx/html/hello.txt

# 5. Проверить наличие файла
docker exec -it mynginx ls /usr/share/nginx/html/
# index.html  50x.html  hello.txt

# 6. Подробная информация (JSON)
docker inspect mynginx
# Найти IP-адрес:
docker inspect -f '{{.NetworkSettings.IPAddress}}' mynginx

Решение задания 3: Управление образами

# Терминал

# 1. Список образов
docker images
# REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
# nginx        latest    ...            ...            ...
# ubuntu       latest    ...            ...            ...

# 2. История слоёв образа
docker history nginx
# Видим каждый слой: команды RUN, COPY, ENV из Dockerfile nginx

# 3. Подробная информация
docker inspect nginx
# JSON с конфигурацией, метками, переменными среды

# 4. Создание образа из контейнера
#    Шаг 4a: запустить интерактивный контейнер
docker run -it --name myubuntu ubuntu bash

#    Шаг 4b: внутри контейнера
#    touch /myfile.txt
#    echo "custom" > /etc/custom.conf
#    exit

#    Шаг 4c: создать образ из изменений
docker commit myubuntu my-ubuntu:v1
docker images | grep my-ubuntu
# my-ubuntu    v1    <id>    seconds ago    X MB

# 5. Удалить образ
docker stop myubuntu 2>/dev/null; docker rm myubuntu
docker rmi my-ubuntu:v1
docker images | grep my-ubuntu
# Пусто — образ удалён
← К оглавлению урока