В современной разработке программного обеспечения появляется все больше и больше новых инструментов и методологий, которые позволяют автоматизировать и упростить процессы разработки, тестирования и развертывания приложений. Один из таких инструментов – CI/CD (Continuous Integration/Continuous Deployment).
CI/CD включает в себя процессы автоматической сборки, тестирования и развертывания приложений, что помогает упростить и ускорить процесс разработки и внедрения изменений. Основная идея CI/CD заключается в том, чтобы каждый раз, когда разработчик вносит изменения в репозиторий кода, автоматически выполнять все необходимые действия для проверки изменений и развертывания обновленной версии приложения.
Использование Docker контейнеров является одним из способов упростить и изолировать процесс развертывания приложений. Docker контейнеры позволяют упаковать приложение и все его зависимости в единую сущность, которая может быть легко развернута на любой машине, поддерживающей Docker.
- Настройка CI/CD для Python приложения в Docker контейнере
- Инструменты
- Настройка репозитория на GitHub
- Настраиваем Travis CI
- Непрерывная интеграция (CI)
- Непрерывное развертывание (CD)
- Заключение
- Установка и настройка Docker
- Установка Docker на операционную систему
- Установка Docker на Linux
- Установка Docker на macOS
- Установка Docker на Windows
- Настройка Docker для работы с Python приложением
- Создание Dockerfile для Python приложения
- Настройка системы Continuous Integration (CI)
- Выбор и настройка CI-сервера для Python приложения
- Выбор CI-сервера
- Настройка CI-сервера для Python приложения
- Рекомендации
- Настройка CI-сервера для работы с Docker контейнерами
- Настройка CI-сервера для автоматического развертывания приложения
- Шаги настройки CI-сервера для автоматического развертывания приложения:
- Вопрос-ответ:
- Что такое CICD?
- Зачем использовать Docker контейнеры для Python приложений?
- Какие инструменты мне понадобятся для настройки CI/CD для Python приложения в Docker контейнере?
- Как настроить автоматическую сборку и развертывание Python приложения в Docker контейнере с помощью Jenkins?
- Можно ли автоматически запустить тесты после каждой сборки Docker образа с Python приложением?
- Видео:
- PYTHON DOCKER NGINX DJANGO. Разворачиваем web-сервер
- Bash + Docker Compose. Простой деплой docker приложений на простой Ubuntu сервер
Настройка CI/CD для Python приложения в Docker контейнере
Continuous Integration (CI) и Continuous Deployment (CD) – это практики разработки программного обеспечения, смысл которых заключается в автоматизации процессов сборки, тестирования и развертывания приложений. Использование Docker контейнеров для разрешения зависимостей и изолирования приложения является популярным подходом в разработке программного обеспечения. В этой статье мы рассмотрим, как настроить CI/CD для Python приложения в Docker контейнере.
Инструменты
Для настройки CI/CD для Python приложения в Docker контейнере мы будем использовать следующие инструменты:
- Git – система контроля версий для отслеживания изменений в коде приложения.
- GitHub – хостинг-провайдер Git репозиториев, на котором будет храниться код нашего приложения.
- Docker – платформа для разработки, развертывания и запуска приложений в контейнерах.
- Docker Compose – инструмент для определения и запуска многоконтейнерных Docker приложений.
- Travis CI – облачный сервис непрерывной интеграции и развертывания для нашего CI/CD процесса.
Настройка репозитория на GitHub
1. Создайте новый репозиторий на GitHub.
2. Склонируйте репозиторий на свой компьютер:
git clone https://github.com/ваш-username/ваш-репозиторий.git
3. Перейдите в папку с репозиторием:
cd ваш-репозиторий
4. Создайте файл Dockerfile в корневой папке проекта и определите в нем инструкции для сборки Docker образа вашего приложения.
5. Создайте файл docker-compose.yml в корневой папке проекта и определите в нем сервисы и настройки для запуска контейнеров вашего приложения.
Настраиваем Travis CI
- Зарегистрируйтесь на travis-ci.com используя аккаунт GitHub.
- Перейдите в раздел Settings вашего репозитория и активируйте CI/CD для него.
- Создайте файл .travis.yml в корневой папке проекта и определите в нем настройки для Travis CI.
- Добавьте исходный код, Dockerfile и docker-compose.yml в ваш репозиторий на GitHub.
Непрерывная интеграция (CI)
Travis CI будет автоматически запускать сборку вашего приложения при каждом вашем коммите/пуше в репозиторий на GitHub.
После каждой сборки Travis CI предоставляет отчет с результатами, который позволяет легко отслеживать проблемы и ошибки в вашем приложении.
Непрерывное развертывание (CD)
Вы можете настроить Travis CI для автоматического развертывания вашего приложения в Docker контейнере после успешной сборки и тестирования.
При пуше ветки master в ваш репозиторий, Travis CI может запускать определенные команды для сборки нового Docker образа и запуска его в контейнере.
Заключение
Настройка CI/CD для Python приложения в Docker контейнере позволяет автоматизировать процессы сборки, тестирования и развертывания приложения. Это позволяет значительно упростить и ускорить процесс разработки и внедрения новых функций в ваше приложение.
Использование инструментов, таких как Git, GitHub, Docker и Travis CI, позволяет создать стабильный и надежный процесс CI/CD для вашего Python приложения в Docker контейнере.
Установка и настройка Docker
Докер (Docker) – это программное обеспечение, которое упрощает развертывание и управление приложениями в контейнерах. Контейнеры являются легковесными и изолированными платформами, которые содержат все необходимое для запуска приложений, включая код, зависимости, конфигурацию и файлы системы.
Установка Docker осуществляется в несколько простых шагов:
- Перейдите на официальный сайт Docker по ссылке https://www.docker.com/
- Выберите подходящую версию Docker для вашей операционной системы. Для Windows и macOS доступны Docker Desktop, а для Linux есть разные дистрибутивы, такие как Docker Engine, Docker CE или Docker EE.
- Загрузите и установите Docker, следуя инструкциям на сайте.
После установки вам потребуется настроить Docker. Вот основные шаги для настройки Docker:
- Запустите Docker после установки.
- Настройте общие параметры Docker, такие как расположение образов и контейнеров, ресурсы системы и другие настройки по вашему усмотрению.
- Убедитесь, что Docker работает корректно, запустив небольшой контейнер для проверки.
После установки и настройки Docker вы будете готовы использовать его для развертывания и управления своими приложениями в контейнерах. Docker обеспечивает простой и эффективный способ упаковывания, доставки и запуска вашего приложения, что делает его отличным инструментом для работы с CI/CD процессами.
Установка Docker на операционную систему
Docker – это открытая платформа, которая позволяет автоматизировать процесс развертывания и управления приложениями в контейнерах. Она предоставляет лёгкую и эффективную виртуализацию, которая позволяет разработчикам и системным администраторам создавать и запускать приложения практически в любой среде.
Прежде чем начать использовать Docker, необходимо установить его на свою операционную систему.
Установка Docker на Linux
- Откройте терминал.
- Добавьте официальный ключ Docker GPG:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
- Установите стабильную версию Docker:
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
- Обновите список пакетов:
sudo apt-get update
- Установите Docker:
sudo apt-get install docker-ce docker-ce-cli containerd.io
- Запустите Docker:
sudo systemctl start docker
- Убедитесь, что Docker успешно установлен и работает:
sudo docker run hello-world
Если вы видите сообщение “Hello from Docker!”, значит Docker установлен верно.
Установка Docker на macOS
- Перейдите на официальный сайт Docker.
- Скачайте установочный файл Docker для macOS.
- Установите Docker, следуя инструкциям установщика.
- После установки Docker запустите его из директории “Applications”.
- Убедитесь, что Docker успешно установлен и работает:
docker run hello-world
Если вы видите сообщение “Hello from Docker!”, значит Docker установлен верно.
Установка Docker на Windows
- Перейдите на официальный сайт Docker.
- Скачайте установочный файл Docker для Windows.
- Запустите установку Docker, следуя инструкциям установщика.
- После установки Docker запустите его из меню “Start”.
- Убедитесь, что Docker успешно установлен и работает:
docker run hello-world
Если вы видите сообщение “Hello from Docker!”, значит Docker установлен верно.
После установки Docker вы будете готовы использовать его вместе с вашим Python приложением в контейнере для реализации непрерывной интеграции и доставки (CI/CD) вашего приложения.
Настройка Docker для работы с Python приложением
Docker – это открытая платформа, которая позволяет автоматизировать развертывание и управление приложениями в контейнерах. Он обеспечивает изоляцию, позволяет упаковать приложение и его зависимости в легковесный контейнер, который можно запустить практически на любой операционной системе.
Для настройки Docker для работы с Python приложением вам понадобится:
- Установить Docker на вашу машину. Для этого посетите официальный сайт Docker и следуйте инструкциям для вашей операционной системы.
- Создать Dockerfile в корневом каталоге вашего проекта. Dockerfile – это текстовый файл, который содержит инструкции для сборки образа Docker. Вам понадобится выбрать базовый образ, указать команды для установки зависимостей Python, скопировать ваше приложение в образ и указать команду для его запуска. Например:
“`Dockerfile
FROM python:3.9
WORKDIR /app
COPY requirements.txt .
RUN pip install –no-cache-dir -r requirements.txt
COPY . .
CMD [ “python”, “./your_app.py” ]
“`
FROM python:3.9 указывает базовый образ Python, который будет использоваться для вашего приложения.
WORKDIR /app задает рабочую директорию внутри контейнера.
COPY requirements.txt . копирует файл requirements.txt внутрь контейнера.
RUN pip install –no-cache-dir -r requirements.txt устанавливает зависимости Python из файла requirements.txt.
COPY . . копирует все файлы вашего приложения внутрь контейнера.
CMD [ “python”, “./your_app.py” ] задает команду, которая будет выполняться при запуске контейнера.
- Создайте файл requirements.txt в корневом каталоге вашего проекта и добавьте в него все необходимые зависимости Python, необходимые для работы вашего приложения. Каждая зависимость должна быть указана на отдельной строке. Например:
“`plaintext
flask==2.0.1
pandas==1.3.1
“`
Это позволит Docker установить все указанные пакеты Python при сборке образа.
- Откройте терминал или командную строку и перейдите в директорию вашего проекта.
- Выполните команду docker build -t your_app . для сборки образа Docker. Замените “your_app” на имя вашего приложения или любое другое имя, которое вы хотите использовать для образа.
- Дождитесь завершения сборки образа. После успешного завершения, вы увидите сообщение “Successfully built…” со значением ID образа.
- Выполните команду docker run your_app для запуска контейнера, использующего образ Docker. Замените “your_app” на имя вашего приложения или имя образа, которое вы использовали при сборке.
- После выполнения команды, ваше Python приложение будет запущено в контейнере Docker. Вы можете открыть веб-браузер и перейти по адресу http://localhost:5000 (если ваше приложение работает на порту 5000), чтобы увидеть его в действии.
Вот и все! Теперь вы можете использовать Docker для удобного развертывания и управления вашим Python приложением. Docker обеспечивает изоляцию и автоматизацию процесса развертывания, позволяя вам работать с вашим приложением на любой операционной системе без необходимости устанавливать зависимости и конфигурировать среду разработки.
Удачи с вашими Docker и Python проектами!
Создание Dockerfile для Python приложения
Для развертывания и управления Python приложением в контейнере Docker необходимо создать Dockerfile – текстовый файл, который содержит инструкции для сборки образа контейнера. Dockerfile определяет окружение и все необходимые зависимости для работы приложения.
Вот как может выглядеть простой Dockerfile для Python приложения:
- Выбор базового образа: Начните с выбора базового образа для вашего контейнера. В случае Python приложения можно использовать официальный Python образ из Docker Hub. Например, для Python 3.8:
FROM | python:3.8 |
- Добавление зависимостей: Если ваше приложение зависит от дополнительных пакетов Python, их можно установить с помощью инструкции RUN. Например:
RUN | pip install requests |
- Копирование исходного кода: С помощью инструкции COPY можно скопировать исходный код вашего приложения в контейнер. Вам также может понадобиться настроить рабочую директорию с помощью WORKDIR. Например:
COPY | . | /app |
WORKDIR | /app |
- Установка переменных среды: Если ваше приложение требует определенных переменных среды, их можно установить с помощью инструкции ENV. Например:
ENV | PORT=5000 |
- Запуск приложения: И наконец, добавьте инструкцию CMD для указания команды, которая будет выполняться при запуске контейнера. Для Python приложения это будет команда для запуска сервера или скрипта. Например:
CMD | python app.py |
Это лишь базовый пример Dockerfile для Python приложения. Вы можете расширить его для установки дополнительных зависимостей, конфигурации сети или даже для использования многоконтейнерной архитектуры с помощью Docker Compose.
Пример Dockerfile демонстрирует, как создать контейнер для запуска простого Python приложения. В зависимости от ваших потребностей и требований приложения, вы можете настроить Dockerfile соответствующим образом.
Настройка системы Continuous Integration (CI)
Continuous Integration (CI) – это практика разработки программного обеспечения, которая заключается в том, чтобы регулярно интегрировать изменения в код и автоматически проходить проверки и тесты для обнаружения ошибок и проблем, связанных с интеграцией кода.
Для настройки системы Continuous Integration для Python приложения в Docker контейнере, мы можем использовать различные инструменты, такие как:
- Jenkins – это один из самых популярных инструментов для настройки Continuous Integration. Он позволяет создавать и управлять пайплайнами CI/CD и настраивать автоматическую сборку, тестирование и доставку кода.
- GitLab CI/CD – это встроенный инструмент в GitLab, который позволяет создавать и настраивать пайплайны CI/CD для автоматической сборки, тестирования и доставки кода.
- Travis CI – это облачный инструмент для Continuous Integration, который предоставляет простой и удобный способ настройки пайплайнов CI/CD.
При настройке системы Continuous Integration для Python приложения в Docker контейнере, в первую очередь необходимо определить набор шагов, которые должны быть выполнены в пайплайне CI/CD. Вот некоторые из основных шагов:
- Сборка Docker контейнера – это шаг, который отвечает за сборку Docker контейнера с нашим Python приложением.
- Запуск тестов – это шаг, который отвечает за запуск автоматических тестов для проверки корректности работы нашего приложения.
- Артефакты – это шаг, который отвечает за сохранение и хранение содержимого сборки, например, Docker образа или файлов, необходимых для дальнейшей доставки кода.
Кроме того, важно установить пайплайн CI/CD, который будет автоматически запускаться при каждом коммите или пуше в репозиторий наших исходных кодов. Такой пайплайн может иметь следующие этапы:
- Клонирование репозитория – это этап, который отвечает за клонирование репозитория с исходными кодами нашего проекта.
- Установка зависимостей – это этап, который отвечает за установку всех необходимых зависимостей для работы нашего приложения.
- Выполнение шагов сборки и тестирования – это этап, который отвечает за выполнение всех необходимых шагов сборки и тестирования, указанных ранее.
- Доставка кода в Docker Registry или другую целевую среду – это этап, который отвечает за доставку кода из контейнера в целевую среду, например, в Docker Registry или на сервер развертывания.
Важно отметить, что настройка системы Continuous Integration требует определенного времени и ресурсов. Однако, она значительно упрощает и автоматизирует процесс разработки и интеграции изменений в код, что позволяет сократить количество ошибок и обеспечить более стабильную и надежную работу нашего приложения.
Итак, настройка системы Continuous Integration (CI) для Python приложения в Docker контейнере – это важный шаг в процессе разработки программного обеспечения, который помогает автоматизировать сборку, тестирование и доставку кода, а также улучшает качество и процесс работы нашего приложения.
Выбор и настройка CI-сервера для Python приложения
CI (Continuous Integration) сервер — это инструмент, который помогает автоматизировать процесс сборки, тестирования и развертывания приложения. В случае с Python приложениями, CI серверы обеспечивают непрерывную интеграцию кода и автоматическую проверку тестов. В этом разделе мы рассмотрим выбор и настройку CI-сервера для Python приложения.
Выбор CI-сервера
На рынке существует множество CI-серверов, которые могут быть использованы с Python приложениями. Ниже приведены некоторые популярные варианты:
- Jenkins: Jenkins является одним из самых популярных CI-серверов. Он предоставляет широкие возможности и обладает большим сообществом разработчиков.
- GitLab CI: GitLab CI является частью платформы GitLab и обеспечивает интеграцию с репозиториями GitLab. Он легко настраивается и предоставляет интуитивный интерфейс.
- Travis CI: Travis CI является облачным CI-сервером, который хорошо интегрируется с GitHub. Он позволяет настраивать сборку и тестирование на нескольких платформах.
- CircleCI: CircleCI также является облачным CI-сервером, который предоставляет интеграцию с различными инструментами разработки и позволяет легко настраивать сборку и тестирование.
Настройка CI-сервера для Python приложения
После выбора CI-сервера, следующим шагом является его настройка для Python приложения. Вот несколько шагов, которые необходимо выполнить:
- Установите CI-сервер на своем сервере или используйте облачный сервис.
- Создайте новый проект или подключите существующий репозиторий с вашим Python приложением.
- Настройте webhook в вашем репозитории, чтобы CI-сервер мог получать уведомления о новых коммитах.
- Настройте конфигурационный файл для CI-сервера, в котором определены шаги сборки, тестирования и развертывания приложения.
- Запустите первую сборку и удостоверьтесь, что все шаги проходят успешно.
- Настройте уведомления о результатах сборки, чтобы получать оповещения о проблемах.
Рекомендации
При выборе и настройке CI-сервера для Python приложения рекомендуется учитывать следующие факторы:
- Интеграция с инструментами разработки: Удостоверьтесь, что выбранный CI-сервер интегрируется с инструментами, которые вы уже используете в своем процессе разработки.
- Удобство использования: Обратите внимание на интерфейс и интуитивность выбранного CI-сервера. Легкость настройки и использования повысит производительность команды.
- Сообщество разработчиков: Проверьте наличие активного сообщества разработчиков для выбранного CI-сервера. Наличие сообщества может быть очень полезно, если у вас возникнут вопросы или проблемы.
В итоге, правильный выбор и настройка CI-сервера может значительно упростить процесс разработки и повысить качество вашего Python приложения.
Настройка CI-сервера для работы с Docker контейнерами
CI-сервер (Continuous Integration) – это инструмент, который позволяет разработчикам автоматически собирать, тестировать и развертывать приложение при каждом изменении кода в репозитории. Для работы с Docker контейнерами необходимо выполнить несколько шагов:
- Установите Docker на CI-сервере. Docker – это платформа для разработки, развертывания и запуска приложений в изолированных контейнерах. Установка Docker может быть выполнена с помощью команды apt-get install docker.
- Зарегистрируйте новый образ Docker. Образ Docker – это готовая к использованию файловая система, которая содержит все необходимые компоненты, такие как операционная система и приложение. Образ создается с помощью Dockerfile, который описывает все шаги по сборке образа. При регистрации образа в Docker Hub или другом репозитории ему присваивается тег (например, “myapp:latest“).
- Настройте CI-сервер для автоматической сборки контейнеров. Для этого необходимо создать файл конфигурации (например, .gitlab-ci.yml), в котором указать шаги сборки и тестирования приложения. Например:
build:
stage: build
script:
- docker build -t myapp .
- docker push myapp:latest
В данном примере выполняются два шага: сборка Docker контейнера и загрузка его в репозиторий. Команда docker build -t myapp . создает образ с тегом “myapp:latest” из Dockerfile, находящегося в текущей директории. Команда docker push myapp:latest загружает образ в репозиторий.
- Не забудьте настроить автоматические тесты на CI-сервере. Тесты могут быть запущены внутри контейнера с помощью команды docker run myapp:latest pytest, где “myapp:latest” – имя образа, “pytest” – команда для запуска тестов.
- Настройте автоматическое развертывание приложения с помощью Docker контейнера на целевом сервере. Это может быть выполнено с помощью CI/CD инструментов, таких как GitLab CI/CD или Jenkins. Настройте задачу развертывания, в которой будет выполняться команда docker run myapp:latest, чтобы запустить контейнер с приложением.
После настройки CI-сервера для работы с Docker контейнерами вы сможете автоматизировать процесс сборки, тестирования и развертывания вашего Python приложения. Это позволит значительно упростить и ускорить разработку и внедрение новых изменений.
Настройка CI-сервера для автоматического развертывания приложения
CI-сервер (Continuous Integration) – это инструмент, используемый разработчиками для автоматизации процесса сборки, тестирования и развертывания приложения. Настройка CI-сервера позволяет значительно упростить и ускорить процесс разработки и развертывания приложения.
В данной статье мы рассмотрим настройку CI-сервера для автоматического развертывания Python приложения, упакованного в Docker контейнер.
Шаги настройки CI-сервера для автоматического развертывания приложения:
- Установка CI-сервера – для настройки CI-сервера мы будем использовать Jenkins, который является одним из самых популярных и мощных инструментов для непрерывной интеграции. Для установки Jenkins необходимо скачать и установить пакет, доступный для операционной системы, на которой будет запускаться CI-сервер.
- Настройка Jenkins – после установки Jenkins необходимо настроить его для работы с Python и Docker. Для этого необходимо установить соответствующие плагины и настроить окружение.
- Создание проекта – после успешной настройки Jenkins необходимо создать новый проект, который будет служить для сборки и развертывания нашего Python приложения. В настройках проекта необходимо указать параметры сборки, обозначить репозиторий, в котором хранится исходный код приложения, а также определить последовательность шагов сборки и развертывания.
- Создание скриптов сборки и развертывания – для сборки и развертывания приложения необходимо создать соответствующие скрипты, которые будут выполняться на CI-сервере. Например, для сборки приложения в Docker контейнере можно использовать Dockerfile и команды docker build. Для развертывания приложения можно использовать Docker Compose или другие инструменты.
- Настройка автоматического развертывания – после создания проекта и скриптов необходимо настроить CI-сервер для автоматического развертывания приложения при каждом новом коммите в репозиторий. Для этого необходимо настроить триггеры сборки, определить шаги сборки и развертывания, а также указать параметры окружения.
После завершения этих шагов мы получим настроенный CI-сервер, способный автоматически собирать и развертывать наше Python приложение в Docker контейнере. Это значительно упростит и ускорит процесс разработки и развертывания приложения.
Важно помнить, что настройка CI-сервера – это всего лишь одна из частей процесса CI/CD (Continuous Integration/Continuous Deployment). Важно также учитывать другие аспекты разработки, такие как тестирование, мониторинг, откат изменений и документирование.
Вопрос-ответ:
Что такое CICD?
CICD – это сокращение от Continuous Integration and Continuous Deployment, что означает непрерывную интеграцию и непрерывный деплоймент. Это методология разработки программного обеспечения, которая позволяет автоматизировать процессы сборки, тестирования и развертывания приложений.
Зачем использовать Docker контейнеры для Python приложений?
Использование Docker контейнеров для Python приложений позволяет создавать изолированное окружение с необходимыми зависимостями и конфигурацией. Это облегчает разработку, тестирование и развертывание приложения, а также обеспечивает его надежность и масштабируемость.
Какие инструменты мне понадобятся для настройки CI/CD для Python приложения в Docker контейнере?
Для настройки CI/CD для Python приложения в Docker контейнере вам понадобятся следующие инструменты: Docker, Git, Jenkins или другая система непрерывной интеграции, и настроенные конфигурации для автоматической сборки и развертывания приложения.
Как настроить автоматическую сборку и развертывание Python приложения в Docker контейнере с помощью Jenkins?
Для настройки автоматической сборки и развертывания Python приложения в Docker контейнере с помощью Jenkins, вам необходимо настроить пайплайн с несколькими шагами: скачивание исходного кода из репозитория Git, сборка Docker образа с приложением, отправка образа в репозиторий Docker, развертывание образа на сервере. Конфигурация шагов может быть адаптирована под ваши потребности.
Можно ли автоматически запустить тесты после каждой сборки Docker образа с Python приложением?
Да, можно автоматически запустить тесты после каждой сборки Docker образа с Python приложением. Для этого вам понадобится настроить шаг в вашем CI/CD пайплайне, который запускает тесты после сборки образа. Вы можете использовать такие инструменты, как pytest или unittest, для написания и запуска автоматических тестов.
Видео:
PYTHON DOCKER NGINX DJANGO. Разворачиваем web-сервер
PYTHON DOCKER NGINX DJANGO. Разворачиваем web-сервер by Мир IT с Антоном Павленко 2 years ago 10 minutes, 25 seconds 25,929 views
Bash + Docker Compose. Простой деплой docker приложений на простой Ubuntu сервер
Bash + Docker Compose. Простой деплой docker приложений на простой Ubuntu сервер by Галера Морева 2 years ago 18 minutes 6,792 views