Docker облегчает развертывание приложений, позволяет "упаковать" как само приложение, так и только его зависимости в изолированную среду. Основной посыл здесь: "Ничего лишнего, только то, что надо для конкретного приложения". Как следствие — экономия ресурсов системы.
Общая схема выглядит так:
Есть основное ПО, его называют Docker Engine — это движок, который устанавливают на ОС. Обычно слово Engine опускают, подразумевая его. Существует бесплатная версия Docker Community Edition и платная Docker Enterprise.
После чего нам понадобится Docker File, в котором и описываются правила по сборке самого образа приложения, иными словами инструкция в виде текстового файла того, что будем собирать для образа.
Далее на основе Docker File собирается образ, который называют Docker Image, включающий зависимости, конфигурацию для дальнейшего развертывания среды.
И собственно сам Docker Container — это легкий, автономный пакет программного обеспечения, который включает в себя все необходимое для запуска приложения: код, среду выполнения, системные инструменты, системные библиотеки и настройки.
По установке Docker Engine на разные ОС существует официальная документация и, конечно, много роликов на youtube, поэтому останавливаться здесь не будем. В рамках экспериментов ниже будем использовать Docker на ОС Ubuntu 20.04.
Хотелось отметить, что существует Docker Hub, где хранятся Images всех известных ПО, сайт: https://hub.docker.com/ и через поиск найти необходимый софт. При этом можно искать и сразу в командной строке.
Важно! Команды для Docker`а нужно будет запускать с sudo, иначе они не будут отрабатывать, и будет писать permission denied. Для того, чтобы сделать постоянное применение команд с sudo, нужно выполнить:
sudo usermod -aG docker $USER
После чего нужно сделать логофф/логин.
Чтобы найти Images сразу в терминале:
docker search название_ПО
Что скачать Image с Docker Hub:
docker pull название_ПО
Проверить какие Images уже есть локально:
docker images
При этом можно сразу объединить как проверку на наличие локально Image, так и на выкачку из репозитория, и последующий запуск Docker Container
docker run название_ПО
Итак, запустим первый тестовый контейнер:
docker run hello-world
В результате мы видим, что он не нашел локально данный Image, скачал его и вывел сообщение, что запуск отработал корректно:
Hello from Docker!
This message shows that your installation appears to be working correctly.
Теперь можем проверить какие есть Images локально на ОС с помощью команды, которую рассмотрели ранее:
Теперь запустим контейнер c веб-сервером Tomcat и, на который зайдём локально в браузере.
docker run -d -p 1236:8080 tomcat
где
-d — (от сокр. detach) запустить контейнер "бэкграундом" и вывести его ID.
-p — сделать перенаправление порта с дефолтного Tomcat 8080 на 1236.
Эти или другие дополнительные флаги ставятся при необходимости.
После успешного старта мы увидим ID контейнера:
Теперь можем обратиться через браузер или по IP, или через localhost, используя проброшенный порт.
Обратиться-то обратились, однако нам выдало ошибку HTTP Status 404 - Not Found, т.е. нам не показывает начальную страницу.
Оказалось, что автор контейнера Tomcat на докерхабе сделал примечание, что в соответствии с рекомендациями по безопасности по дефолту сейчас не включена загрузка начальной страницы, однако файлы по прежнему доступны в директории webapps.dist
Решение следующее:
1. Нужно узнать ID котейнера
docker ps
Эта команда выводит все запущенные в настоящий момент контейнеры. С флагом -a — отобразит как настоящие, так и запущенные ранее. Здесь нас интересует строка с ID tomcat.
2. Заходим в контейнер tomcat в директорию /bin/bash
docker exec -it ID_контенера /bin/bash
где
-it — (от сокр. interactive) отобразить в терминале подключения к контейнеру и оставаться там.
После чего выводим на экран отображения содержимого в директории, куда зашли
ls -la
где
-la — отобразит список в столбец + все файлы.
Нас интересует две директории webapps и webapps.dist. Здесь можно поступать по-разному, например, файлы из webapps.dist переместить в webapps или удалить одну и переименовать другую и пр. Мы же, в этом примере переименуем webapps в webapps_old, а webapps.dist в webapps.
mv webapps webapps_old
mv webapps.dist webapps
Файлы, которые находились webapps.dist теперь стали в webapps. На этом всё, теперь идём вновь в браузер и обращаемся к Tomcat:
Начальная страница загрузилась.