Я не буду описывать что это за инструмент и для чего он служит. Просто попытаюсь пройти путь: от установки docker, до деплой контейнера на сервере.
Это сейчас я могу открыть консоль моего компьютера, зайти на свой хостинг "timeweb", и там запустить docker-контейнер с простейшим приложением, написанным на flask. Чтобы его могли все увидеть:
Но прежде чем я смог это сделать, пришлось пройти немалый путь по изучению docker'a. И это только азы (минимальный набор) этого инструмента.
Итак, первое, я работаю в операционной системе Manjaro Linux:
Все действия, что будут описаны далее в статье, будут именно для Manjaro (она же Arch) Linux. Если у кого-то другой дистрибутив Линукса, делайте поправки под свою систему.
Изначально я выбрал неверную тактику, пошел так сказать "дальней дорогой" - через официальный сайт docker. Стал устанавливать программное обеспечение по тем "лекалам" что описаны на сайте. Я это описывал еще полгода назад, когда изучал Django:
А надо было сделать проще:
sudo pacman -S doker
Как оказалось огромное (1.7 Гб) приложение Docker-Desktop не очень то и нужно для Linux систем, здесь вполне достаточно консольной версии, чтобы выполнить все интересующие нас действия.
Чтобы эксперимент был более полным, я его выполню на ноутбуке, на котором стоит Manjaro Linux, но не стоит docker.
Последний раз я им пользовался летом, в отпуске, с тех пор он у меня лежал без дела и многие пакеты приложений устарели, поэтому начнем с обновления системы:
sudo pacman -Syu
Установим докер:
Проверим теперь наличие докера в системе:
Как можно видеть, докер присутствует, но демон не запущен, пытаюсь его запустить, программа просит пароль пользователя с правами sudo:
Но к сожалению, вход не выполнен, ошибка:
Как оказалось, нужно было просто перезагрузить ноутбук. После чего повторный запуск демона прошел удачно.
Необходимо выполнить процедуру аутентификации на докер_хабе. Пока это нужно делать при помощи sudo.
Само собой нужно пройти регистрацию и авторизацию на сайте докер_хаб. Особо сложного тут ничего нет, но на всякий случай я заскриншотил процедуру регистрации:
Создаю новый репозиторий, в котором будут храниться задания от SkillBox, так его и назову:
Как можно было заметить, при аутентификации пользователя, я использовал другие учетные данные, но думаю, надо ж сделать всё "по-чесноку" - новая систем, новая учетная запись, новый репозиторий. Поэтому вышел из docker:
docker logout
И попытался войти вновь, но выскочила ошибка - в пароле был разделительный символ "точка с запятой". Лечится это просто - заключаем пароль в кавычки (я попробовал одинарные, и получилось):
Процедуры регистрации, аутентификации и установки программного обеспечения пройдены, создаем из нашего приложения docker-контейнер (или образ, я еще не сильно их различаю...). Приложение я скопировал в корень домашней директории:
Для начала попробую его запустить по всем правилам на своем ноутбуке, без всяких докер-контейнеров и прочего. Что из этого получится?!
В терминале, открываю директорию "new_year_application" и создаю виртуальное окружение, активирую его, устанавливаю необходимые зависимости из файла requirements.txt
Пробую запустить flask-приложение, работает:
Теперь дело за созданием Dockerfile, он у меня уже подготовлен и выглядит вот так:
Попробую объяснить как это работает, потому как у меня первая строка вызвала бурю непонимания, так как в роликах skillbox там было test_app, ну я по аналогии что только там не попробовал прописать, и свое приложение new_year, и названия своих репозиториев и только когда понял что я делаю что-то не так решил уточнить что же точно должно быть в первой строке. Там помещаются образы linux подобных систем, сконфигурированных и загруженных с докер_хаба. Даже если она называется просто python, там тоже будет кусочек линукса с пайтоном внутри. Я попробовал python без указания версий и обалдел от размера полученного мной image:
В общем указал версию как в ролике по созданию докер-образа и у меня всё получилось довольно таки красиво, образ в 10 раз меньше (но и то мне кажется многовато...)
Все строчки Dockerfile довольно таки понятны? кроме ADD templates.tar.gz /new_year/ и ADD static.tar.gz /new_year/ чтобы скопировать в докер-образ директории с файлами приходится их вот таким образом туда помещать. Сначала делаются архивы двух директорий templates и static:
А затем уже с помощью команды ADD помещаются в образ, где они автоматически разархивируются.
Если с первого раза образ создан не правильно, что-то пошло не так то чтобы переписать все файлы заново нужно убрать команду создания директории из Dockerfile RUN mkdir /new_year. Иначе будет ошибка, мол такой каталог уже есть...
Ну и собственно сам файл app.py. В нём нужно указать адрес хоста и порт в последней строчке.
Ну собственно и всё, образ создан, можно попробовать его запустить:
Образ запустился и работает. Осталось дело за малым - отправить этот образ на докер_хаб, а затем установив docker на нашем timeweb хостинге - скачать образ с докер_хаба и запустить. Вроде бы не очень сложно, но мне понадобилось несколько дней чтобы в этом разобраться.
Заливаем на докер_хаб:
Вот образ появился на докер_хабе:
Теперь входим по нашим учетным данным через ssh в терминал сервера на хостинге timeweb, на моем ноутбуке не созданы ключи ssh, поэтому я их создаю:
... и вхожу в систему:
Успешный вход, докер у меня на виртуальной машине, на хостинге уже установлен (устанавливается так же как и на локальной машине) единственное, что я изменю - войду под другим пользователем.
Ну вот, теперь можно запустить докер образ на хостинге timeweb, откуда он будет работать для всех желающих:
Ну и собственно, результат работы в браузере:
Ну вот, работа выполнена. Надеюсь данное описание окажется полезным не только мне...
Только что прилетело сообщение: