и мне не даёт покоя вопрос. Прошу сориентировать меня в пространстве.
Допустим я на своём ПК создал контейнер, в которой поместил PostgreSQL, Python и что-то ещё. Настроил взаимодействия между ПО внутри, создал ETL скрипты, написал тригерные функции в SQL. В общем получается ящик, внутри которого происходит различная магия.
Теперь я хочу перенести своё творение на ресурсы Заказчика и запустить его там. Я просто переношу контейнер и запускаю? Так?
Или я на ресурсах Заказчика использую docker-compose.yml и создаю контейнер с аналогичным «составом», но без моих ETL-скриптов, триггерных функций и т.д.?
хуета идея, под один контейнер у тебя идет одна задача и 1 процесс, бд один конт, сервер второй конт, какйонидь бекапер третий конт
Именно второй вариант. docker-compose аналогичного состава, в него же пишешь свои команды и скрипты, которые выполняются после поднятия эталонного posgres-sql контейнера, например. Ну и да, используй разные контейнеры для разных сервисов. Один контейнер - одна задача. И все их прописывай в одном docker-compose.yaml, вместе с сетью, волюмами и плюшками.
Хм… это несколько не та концепция, которую я представлял. По сути, я переношу на ресурсы заказчика не готовую «мебель», а различные запчасти. А потом на его стороне прихожу и из деталей собираю готовое решение. Подскажите, а как в .yml прописать скрипты и команды для БД?
1. Создал контейнер с python 2. Создал контейнер с mysql 3. Создал контейнер с redis 4. Создал контейнер с mongodb 5. Прописал ПО и скрипты 6. Запушил это все на dockerhub или quai 7. Поместил это все в compose 8. Настроил сети, volumes и очередность запуска 9. Выложил в свой гитхаб только один файл - docker-compose.yaml Который и подтягивает образы с dockerhub/quai/ghcr/gcr 10. Отправил заказчику ссылку на свой гитхаб/гитлаб 11. Получил денюжку Заказчику остается git clone твой гитхаб репозиторий И сделать следующее: dokcer-compose up -d --build
А лучше без build и собирать образы в пайплайне и тянуть их из registry
Вот тут лайк, однозначно👍
Приветствую участников сообщества! Благодарю за предыдущие ответы. Я согласен, что один контейнер стоит использовать под один сервис. Прошу подсказать как выглядит архитектура следующего решения. Как мне видится сейчас: Допустим я написал приложение на Flask (очень много кода). У меня Windows, я поставил Docker, поднял контейнер с Python, Flask и написал весь код приложения прямо в контейнере. Далее, полученный образ (с Flask-приложением внутри) я хочу запустить в облаке. Разумеется, мне необходимо, чтобы никто никогда не увидел мой код и мой контейнер. Как быть в этом случае? Правильно ли я делаю, если пишу приложение прямо в контейнере? Если я захочу дописать функционал приложения, то как организовать процесс?
Пишешь код как и где угодно, пишешь Dockerfile, который собирает образ для твоего приложения, используешь образ для запуска контейнера
«Где угодно» - это где?
Пишешь в IDE, хранишь в git репозитории. База же
Понимаю, что пишу в IDE. Вопрос в другом. Код сохранять в самом контейнере? Приведу пример. Допустим я пишу диссертацию за 1000 страниц в Word. Я могу по нажатию кнопки развернуть сервер, где будет Windows, Word и другое ПО. Но написанной диссертации там не будет. Будет просто чистая виртуальная машина готовая к работе. Верен ли подход, где я по нажатию кнопки поднимаю: 1. виртуальную машину готовую к работе; 2. файл с диссертацией уже на этой ВМ.
Максим, я сейчас привёл абстрактный пример. Прошу не цепляться за детали.
Код сохраняется в образе а не в контейнере. Сам образ хранится на докерхабе, если хочешь чтобы никто не мог его найти то в приватном реаозитории
Вот, отлично! Для моего уровня понимания разница между образом и контейнером небольшая. Образ и есть контейнер, просто он не запущен, разве нет? Ну вот стоит на столе ноутбук- на нём есть всё, что мне нужно, просто он выключен = образ. Включил ноутбук = контейнер. Или я не верно себе представляю концепцию?
Ну не совсем.... Но если бы ты мог на основе своего ноутбука дать доступ тысячи пользователей одновременно, тогда это были бы контейнеры. Сам образ не меняется, а контейнер изменить можно
Образ это iso для установки винды на ноут. Контейнеры - установленная из него винда
Какая-то квантовая физика с суперпозицией) Допустим, я запустил у себя на ПК Docker. На основании образа создал контейнер, где установлен Python и Flask. Через IDE подключился к контейнеру и написал 300 строк кода будущего Flask-приложения. Решил отдохнуть и выключаю ПК. Результаты в контейнере сохранятся, верно? За следующую неделю я напишу 3000 строк кода. Дописал приложение. Весь код в контейнере, который хранится у меня на ПК. Как мне это всё добро перенести в облако? Мне нужно из своего контейнера создать образ, потом поместить его в приватный docker-hub?
Нахера писать код в контейнере
1. Разработка Код обычно пишут не в контейнере а локально, так как если контейнер упадет то весь код пропадет, а если его у тебя много то это нецелесообразно так делать. А тестируют и запускают разумеется в контейнере все. Зачем гадить хостовую систему? 2.Деплой Деплой куда???? Обычно нужна виртуальная машина где будет можно установить докер или готовая контейнер платформа. Туда устанавливается докер и/или докер компоуз. После этого, скачивается имейлж и докер контейнер запускается из этого образа. Пробрасываются порты. Допустим Фласк порт 5000 на 80 порт хостовой вм И все. Пользователи будут заходить на сайт, по умолчанию 80й ну или 443й порт и даже не знать что они в контейнере
Максим, если у тебя другое видение, более зрелое и продвинутое, то ты можешь его написать мне не кидаясь… без излишней критики. Понимаешь? И я буду рад это мнение прочитать.
Я задал вопрос, и жду на него ответ
Нет, результаты не сохраняются в контейнеры. Результаты всегда!!! Сохраняй в гите
Андрей, не стоит использовать манипуляции и интерпретировать сообщения других людей так, как хочется тебе. Максим задал вполне конкретный и корректный вопрос, не оскорбив никого.
Благодарю! Прям стало понятнее. Только в этом описании, после п. 2 я не понял каким образом написанный мной код попадает в запущенный в облаке (Яндекс, например) контейнер.
С помощью докерфайла ты собираешь образ, пушишь его в регистри, оттуда на целевой машине скачиваешь и запускаешь контейнер на основе образа.
quay* же?
Ну тут много путей, или ручками постоянно забирать его с Реджистри, или.... Настроить пайплайн, и чтобы оно автоматически при изменении кода создавался докер имедж, загружался на докер хаб а оттуда прямиком к тебе в Яндекс клауд
Да, точно 😂
Хочу уточнить. Я понял про то, каким образом из образа контейнер запускается в облаке. Каким образом, в этом запущенном контейнере появляется код моего приложения?
Образ = шаблон для контейнера. Код уже в твоём образе лежит.
Он там был изначально при создании имеджа. Код в имедже
Также как и локально. Вот ты запускаешь убунту docker run ubuntu Откуда там файловая система операционной системы? Вот тоже самое с любым кодом. Он изначально в имедже
Оу…. Хм… Интересно получается. Т.е. у меня в Git (например) имеется «папка» с кучей Python файлов (код Flask-приложения) и я прописываю в Docker файле (конфигурация image), что мол создай образ: Ubuntu + Python + Flask + код из «вот этой папочки» размести в следующей директории Ubuntu. Верно?
Ну, есть готовый Пайтон образ 😃 из него можно брать и устанавливать туда Фласк, и убунта не нужна как бы
Да да, согласен!
Ну вот самый базовый пример сборки имеджа и запуска из него Фласк контейнера. 7 минут, сам всё увидишь https://youtu.be/GVs26OxzE3o?si=xRMif5dBPdBQMUKs
И допустим я всё это сделал. Прошёл месяц и я хочу добавить новый код. Мне же не останавливать контейнер, верно? Допускаю, следующий сценарий: Я пишу код у себя на ПК, делаю коммит в GIT. Подключаюсь к запущенному в облаке контейнеру через SSH. И выполняю git pull, т.е. обновляю «папку с файлами программы» (локальный репозиторий) в контейнере. Верно?
Нет, ты обновляешь образ и на основе него пересоздаёшь контейнер уже с новым кодом
Благодарю! Сегодня утром просмотрел несколько видео, но так и не понял, как готовый код приложения оказывается в контейнере запущенном в облаке. Сейчас это видео посмотрю.
Понятно. Спасибо! Выходит, что Docker файл (конфигурация image) должен содержать очень большое количество информации, чтобы без проблем запускаться.
В простом варианте это всё, что нужно FROM python:3.11 COPY requirements.txt /app/ RUN pip install --no-cache-dir -r /app/requirements.txt COPY . /app/ ..... # CMD или ENTRYPOINT тут
Благодарю за набросок! Посмотрю ещё видео.
Я понял концепцию, которую мы обсудили выше, согласен с ней. Но хотел бы вернуться к пункту 1, про тестирование, чтобы не «гадить» у себя в системе. Я согласен, что лучше установить необходимое «окружение» (БД, тучу библиотек) в разные контейнеры и протестировать свой код в контейнерах. Но тут мы приходим к тому, что если мы не хотим засорять свою систему, то разработку мы ведем в контейнере. Всё верно? Просто прямо из контейнера коммитим код в GIT, верно? Процесс деплоя (разворачивания контейнера с готовым кодом) мне понятен. А каким образом корректнее вести разработку?
Как раз для разработки не приходится засорять свою систему. В случае с тем же питоном есть virtual environments (стандартный модуль venv или в pypi://virtualenv/). На других языках все зависимые библиотеки тоже умеют устанавливаться в пределах папки проекта. Есть, конечно, вариант вести разработку в пределах контейнера, но это сложнее и не всегда реально оправдано, имхо.
Обсуждают сегодня