The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:
Docker - это инструмент командной строки, который может запускать команду оболочки в виртуальной системе Linux в изолированной файловой системе. Каждый раз, когда мы собираем наши проекты, мы хотим, чтобы они работали в своих собственных контейнерах Docker. Возьмем, например, этот проект Maven:
Эта команда запустит новую систему Ubuntu и выполнит внутри нее mvn clean test
. Rultor.com, наш виртуальный помощник, делает именно это с нашими сборками, когда мы их развертываем, упаковываем, тестируем и объединяем.
Какие преимущества это дает нам? И почему Docker, когда есть много других технологий виртуализации, например, LXC?
Ну, есть несколько очень важных преимуществ:
Versioning
“Application-centric” - “Ориентированный на приложения”
Давайте обсудим их подробнее.
Docker позволяет обмениваться образами через свой общедоступный репозиторий на hub.docker.com. Это означает, что после того, как я подготовлю рабочую среду для своего приложения, я создаю из нее образ и загружаю его на хаб.
Предположим, мне нужно выполнить сборку Maven в контейнере с предустановленным пакетом graphviz
(чтобы включить инструмент командной строки dot
). Сначала я запускаю обычный контейнер Ubuntu и устанавливаю в него graphviz
.
У меня есть контейнер, который остановился несколько секунд назад. ID контейнера - 215d2696e8ad
. Теперь я хочу сделать его многоразовым для всех последующих тестов на Rultor.com. Мне нужно создать из него образ.
Я только что сделал новый коммит в новое изображение yegor256/beta
. Это изображение можно использовать прямо сейчас. Я могу создать новый контейнер из этого изображения, и внутри него будет установлен graphviz
!
Теперь пришло время поделиться моим изображением на Docker Hub, чтобы оно стало доступным для Rultor:
Последний шаг - настроить Rultor для использования этого образа во всех сборках. Для этого я отредактирую .rultor.yml
в корневом каталоге моего репозитория GitHub.
Вот и все. Теперь Rultor будет использовать моё собственное Docker-изображение с предустановленным graphviz
в каждой сборке (слияние, релиз, развертывание и т.д.).
Кроме того, если и когда я захочу добавить что-то еще в изображение, это легко сделать. Например, я хочу установить Ruby в мое сборочное изображение. Я запускаю контейнер из изображения и устанавливаю его (обратите внимание, что я запускаю контейнер не из образа ubuntu
, как делал раньше, а из yegor256/beta
).
Теперь вы можете видеть, что у меня есть два контейнера. Первый из них - тот, который я использую прямо сейчас; в нем содержится Ruby. Второй - тот, который я использовал раньше, и в нем содержится graphviz
.
Теперь мне нужно снова закоммитить и запушить:
Таким образом, Docker Hub является очень удобной функцией для Rultor и подобных систем.
Как вы видели в приведенном выше примере, каждое изменение образа Docker имеет свою собственную версию (хеш) и возможность отслеживать изменения. Также возможно откатиться к любому конкретному изменению.
Rultor сам не использует эту функциональность, но пользователи Rultor могут контролировать свои конфигурации сборки с гораздо большей точностью.
Docker, в отличие от, например, LXC или Vagrant, ориентирован на приложения. Это означает, что когда мы запускаем контейнер - мы запускаем приложение. С другими технологиями виртуализации, когда вы получаете виртуальную машину - вы получаете полностью функциональную среду Unix, где вы можете войти через SSH и делать все, что хотите.
Docker упрощает все. Он не предоставляет вам доступ по SSH к контейнеру, но запускает приложение внутри и показывает вам его вывод. Это именно то, что нам нужно в Rultor. Нам нужно запустить автоматическую сборку (например, Maven или Bundler), увидеть ее вывод и получить код завершения. Если код не равен нулю, мы отменяем сборку и сообщаем пользователю.
Вот как мы запускаем сборку Maven:
Как видите, Maven запускается сразу. Мы не беспокоимся о внутреннем устройстве контейнера. Мы просто запускаем приложение внутри него.
Более того, благодаря опции --rm
, контейнер уничтожается сразу после завершения выполнения Maven.
Вот что означает ориентированность на приложения.
В целом, наше впечатление от Docker’a очень положительное.
пс. Компактная версия этой статьи была опубликована на devops.com
Translated by ChatGPT gpt-3.5-turbo/42 on 2023-12-16 at 15:35