Цель работы: Познакомиться с контейнеризацией на примере Docker в ALT Linux.
Контейнеризация — способ запуска приложений в изолированной среде (контейнере), где уже есть все нужные библиотеки и конфигурация. Контейнеры используют ядро хостовой ОС и изолируются средствами ядра Linux (namespaces, cgroups).
Docker — платформа для работы с контейнерами, включающая:
- демон (службу) `dockerd`;
- клиент `docker` (CLI);
- форматы образов и контейнеров;
- реестры образов (Docker Hub и др.).
Образ (image) — «шаблон» файловой системы и настроек (как ISO-образ, но для контейнера).
Контейнер (container) — запущенный экземпляр образа.
1. Установите Docker:
apt-get install docker-engine -y
2. Включите службу Docker и запустите ее:
systemctl enable --now docker
3. Проверьте статус:
systemctl status docker
4. Проверьте версию Docker:
docker version
1. Загрузите тестовый образ:
docker pull hello-world
2. Проверьте, что образ появился:
docker images
В списке должен быть `hello-world`.
3. Запустите контейнер:
docker run hello-world
Docker:
- при необходимости подкачает образ;
- создаст контейнер;
- выполнит в нём тестовый скрипт;
- выведет поясняющее сообщение.
4. Посмотрите список контейнеров:
docker ps -a
Обратите внимание:
- контейнер на основе `hello-world` будет иметь статус `Exited` (он завершился после вывода текста).
Запишите в отчет:
- текст, который вывел `docker run hello-world` (кратко, главное);
- строку о контейнере из `docker ps -a` (IMAGE, STATUS, NAMES).
1. Загрузите образ Ubuntu:
docker pull ubuntu:latest
2. Проверьте наличие образа:
docker images
3. Запустите интерактивный контейнер:
docker run -it --name test-ubuntu ubuntu:latest bash
Пояснения:
- -it — интерактивный режим;
- --name test-ubuntu — задаем имя контейнеру;
- bash — запустить оболочку bash внутри контейнера.
4. Внутри контейнера выполните:
whoami
hostname
ls /
Обратите внимание:
- пользователь внутри обычно `root` (это не root вашей хост-системы, а внутри контейнера);
- `hostname` внутри контейнера отличается от хоста.
5. Создайте файл внутри контейнера:
touch /from_container
ls /
6. Выйдите из контейнера:
exit
7. Снаружи посмотрите состояние:
docker ps -a
Контейнер `test-ubuntu` будет в статусе `Exited`.
1. Загрузите образ nginx:
docker pull nginx:latest
2. Запустите контейнер nginx в фоновом режиме с пробросом порта:
docker run -d -p 8080:80 --name webserver nginx:latest
Пояснения:
- -d — запуск в фоне (daemon mode);
- -p 8080:80 — порт 8080 хоста будет перенаправлен на порт 80 контейнера;
- --name webserver — имя контейнера.
3. Проверьте, что контейнер запущен:
docker ps
4. Для открытия страницы:
http://IP_ВАШЕЙ_ВМ:8080
Должна открыться стартовая страница nginx.
5. Посмотрите логи контейнера:
docker logs webserver
Запишите в отчет:
- вывод `docker ps` с контейнером `webserver`;
- удалось ли открыть страницу nginx в браузере.
Теперь усложним: создадим свой образ на основе ubuntu через Dockerfile.
Dockerfile — текстовый файл с инструкциями, как собрать образ.
Типичные инструкции:
- FROM — базовый образ (обязателен, первый);
- RUN — выполнить команду при сборке (например, установить пакеты);
- COPY — скопировать файлы в образ;
- WORKDIR — рабочая директория по умолчанию;
- CMD — команда по умолчанию при запуске контейнера;
- EXPOSE — документируемые открытые порты.
По Dockerfile образ собирается командой docker build.
Создадим образ на основе Ubuntu, который:
- установит пакет `curl`;
- при запуске покажет сообщение и версию `curl`.
1. Создайте файл `Dockerfile` (через `nano`, `vim` или `mcedit`). Пример с `nano`:
nano Dockerfile
2. Вставьте в него содержимое:
# Базовый образ
FROM ubuntu:latest
# Обновляем список пакетов и устанавливаем curl
RUN apt-get update && apt-get install -y curl && apt-get clean && rm -rf /var/lib/apt/lists/*
# Рабочая директория (не обязательно, но удобно)
WORKDIR /app
# Команда по умолчанию при запуске контейнера
CMD echo "Мой первый образ Docker на базе Ubuntu"; curl --version
3. Сохраните файл и выйдите из редактора.
1. Находясь в каталоге с `Dockerfile`, выполните:
docker build -t my-ubuntu-curl:1.0 .
Пояснения:
- -t my-ubuntu-curl:1.0 — тег нового образа (имя:версия);
- . — контекст сборки (текущий каталог).
2. Дождитесь окончания сборки.
Если нет ошибок, проверьте список образов:
docker images
В списке появится `my-ubuntu-curl` с тегом `1.0`.
Запишите в отчет:
- команду сборки;
- появилась ли запись `my-ubuntu-curl` в `docker images`.
1. Запустите контейнер:
docker run --rm my-ubuntu-curl:1.0
Пояснения:
- --rm — удалить контейнер после завершения;
- будет выполнена команда из `CMD` в Dockerfile.
2. Обратите внимание на вывод:
- строка `"Мой первый образ Docker на базе Ubuntu"`;
- версия `curl`.
3. Проверьте, что контейнер не остался «висячим»:
docker ps -a
Контейнер, который запускал `my-ubuntu-curl:1.0` с `--rm`, должен отсутствовать.
1. создайте файл `index.html`:
echo "Hello from my Dockerfile on ALT Linux" > index.html
2. Создайте второй Dockerfile, например `Dockerfile.nginx`:
nano Dockerfile.nginx
3. Впишите в него (очень простой вариант на основе nginx):
FROM nginx:latest
# Копируем наш файл в стандартную директорию nginx
COPY index.html /usr/share/nginx/html/index.html
4. Соберите образ:
docker build -f Dockerfile.nginx -t my-nginx:1.0 .
5. Запустите контейнер:
docker run -d -p 8081:80 --name my-nginx my-nginx:1.0
6. Откройте в браузере:
http://IP_ВАШЕЙ_ВМ:8081
Должен отобразиться текст `"Hello from my Dockerfile on ALT Linux"`.
1. Остановите и удалите контейнеры:
docker stop webserver
docker rm webserver
docker stop my-nginx
docker rm my-nginx
2. Для удаления образов:
docker rmi my-ubuntu-curl:1.0
docker rmi my-nginx:1.0
docker rmi nginx:latest
docker rmi ubuntu:latest
docker rmi hello-world
3. Проверьте:
docker ps -a
docker images
1. Что такое контейнер и чем он отличается от образа?
2. Какие преимущества имеет контейнеризация по сравнению с виртуализацией?
3. Какие команды вы использовали, чтобы:
- загрузить образ с Docker Hub;
- запустить тестовый контейнер `hello-world`;
- посмотреть список контейнеров и образов?
4. Что делают команды:
- `docker run hello-world`;
- `docker run -it ubuntu:latest bash`;
- `docker run -d -p 8080:80 nginx:latest`?
5. Что такое Dockerfile? Для чего он используется?
6. Какие инструкции вы использовали в Dockerfile и что они означают:
- `FROM`;
- `RUN`;
- `WORKDIR`;
- `CMD`;
- `COPY`?
7. Какой командой собирается образ из Dockerfile? Что означает флаг `-t` и точка (`.`) в конце команды `docker build`?
8. Что делает флаг `--rm` при запуске `docker run`?
9. Как можно опубликовать (пробросить) порт контейнера на хост? Приведите пример синтаксиса.
10. В чем разница между запуском `docker run` в интерактивном режиме (`-it`) и в фоновом (`-d`)?