Статьи

Как Ansible и Docker Fit: Использование Ansible для начальной загрузки и координации Docker-контейнеров

В инфраструктуре и пространстве виртуализации появилось много интересных инструментов, появившихся за последние пару лет. Ansible и Docker , пожалуй, два самых захватывающих на мой взгляд. В то время как я уже широко использовал Ansible, я только начал использовать Docker, так что это большая оговорка в отношении содержания этого поста.

Что такое Докер и почему меня это должно волновать?

Docker описывает себя как «контейнерную платформу» , которую на первый взгляд легко спутать с виртуальной машиной. Википедия описывает контейнеры Docker следующим образом:

Docker использует функции изоляции ресурсов ядра Linux, такие как cgroups и пространства имен ядра, чтобы позволить независимым «контейнерам» работать в пределах одного экземпляра Linux, избегая накладных расходов при запуске виртуальных машин.

Мой взгляд на то, где Docker полезен и не полезен:

1. Как «процесс» / контейнер приложения

Docker полезен в качестве контейнера для отдельных процессов или групп процессов, составляющих приложение. Типичным примером этого может быть использование контейнера, на котором запущен сервер nginx с настроенным https, обслуживающий статический контент и JavaScript, а также запуск веб-приложения за сервером nginx, который обслуживает динамические страницы или службы RESTful.

Это может быть особенно полезно в тех случаях, когда вы запускаете приложения или процессы, которые должны быть изолированы в целях безопасности, но могут совместно использовать мощное оборудование без дополнительной нагрузки на полную виртуальную машину, а также там, где потенциальный конфликт ЦП или памяти в контейнере не является проблемой (при недостаточной загрузке). аппаратное обеспечение, это потенциально даже желательно, чтобы кучка жести не стояла в основном на холостом ходу).

Хотя реальная сила в концепции «контейнера» и «изображения» Dockers заключается в том, что он делает тривиальным совместное использование контейнера приложения со всеми его движущимися частями, предварительно настроенными как код (см. Dockerfiles . быть действительно разрушительным, когда дело доходит до преодоления барьеров для совместной работы в больших организациях.

2. В качестве одноразовой изолированной среды для запуска инициируемых пользователем, потенциально опасных процессов или данных

Именно здесь Docker приходит на ежедневную работу с нашей службой Code Qualified для автоматического тестирования программистов, которую мы можем использовать в качестве примера — когда пользователи представляют свои решения проблем программирования, код должен быть запущен, проанализирован и проверено на правильность. Тем не менее, злонамеренный пользователь может потенциально отправить вредоносный код на серверы Code Qualifieds, чтобы попытаться выполнить любую неприятную, разрушительную операцию. Вот где приходит Docker : мы запускаем представленный код во временных контейнерах Docker, а это означает, что в худшем случае они уничтожат временный контейнер, который предназначен только для жизни в течение нескольких минут, и получат большой ноль в тесте, который они «решили».

Docker как контейнер приложений

3. НЕ пытайтесь использовать Docker в качестве замены виртуальной машины или для запуска «целых систем»

Наконец, мы добрались до того, что не нужно делать с Docker: не пытайтесь запускать его как полноценную ОС / своего рода систему. Это не то, для чего он предназначен. Как указали в Phusion , в базовых доступных образах Docker отсутствуют некоторые важные системные настройки и службы, поэтому попытка запуска контейнеров Docker вместо «реальной» системы / ВМ может быть сопряжена с потенциальными проблемами.

Я могу запускать команды в моем Dockerfile, зачем использовать Ansible?

Вы можете запускать произвольные команды в Dockerfile, который создает образ Docker, в том числе apt-get, если вы создаете образ на основе Ubuntu. Так почему же это Ansible?

1. Начальная загрузка Docker-контейнеров

Я собрал очень простой пример на GitHub, который использует Ansible для настройки виртуальной машины Vagrant, которая затем запускает Docker-контейнеры, в которых образы создаются частично с помощью … Ansible (часть Vagrant не подходит, если вы работаете в Linux. I использовал его для настройки виртуальной машины для запуска Docker, поскольку OS X изначально не поддерживает Docker).
Несмотря на то, что в Dockerfile можно полностью написать сценарий с помощью директивы RUN , я считаю, что сценарии Ansible полезны по нескольким причинам:

  • Ansible скрипты переносимы. Я могу протестировать их на виртуальной машине Vagrant, на экземпляре AWS EC2 , на «реальной» машине Linux или на Docker.
  • Приемлемые сценарии являются идемпотентными: если вы позже запустите их на контейнере / виртуальной машине / машине, они могут выступить в качестве проверки того, что блок действительно правильно настроен (и исправить все, что не было).
  • Ansible-скрипты могут одновременно предоставлять несколько хостов: для этого предназначен ваш Ansible -файл инвентаризации .

Чтобы запустить Ansible при создании образа Docker, вы можете создать следующий файл инвентаризации заглушки:

[local]
localhost

 Затем сделайте так, чтобы ваш Dockerfile выглядел примерно так (где у вас есть скрипт Ansible с именем «provision.yml» в той же директории, в этом случае, вероятно, вы устанавливаете nginx и настраиваете его правильно):

FROM ubuntu:14.04.1
MAINTAINER Wille Faler "wfaler@recursivity.com"
RUN apt-get update
RUN apt-get install -y software-properties-common
RUN apt-add-repository ppa:ansible/ansible
RUN apt-get update
RUN apt-get install -y ansible
ADD inventory-file /etc/ansible/hosts
ADD provision.yml provision.yml
RUN ansible-playbook provision.yml -c local
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
EXPOSE 80
CMD ["nginx"]

2. Настройка и координация хостов Docker

Ansible имеет модуль Docker , который вы можете использовать для создания, запуска, запуска, остановки, связывания и координации ваших контейнеров и образов Docker различными способами. Именно здесь Ansible действительно сияет, и это почти всегда будет предпочтительнее хрупких скриптов-сценариев, созданных вручную.

Честно говоря, я еще не использовал модуль Docker так сильно в гневе, хотя я подозреваю, что в конечном итоге я буду широко его использовать. Это задачи, в которых Ansible действительно великолепен даже без Docker, поэтому я не ожидал, что это изменится на один бит с Docker. На самом деле, я подозреваю, что Ansible станет еще более неотъемлемой частью работающей инфраструктуры, когда у вас будет несколько хостов, работающих с несколькими контейнерами Docker.

Что еще там?

Я только немного поцарапал поверхность, но это краткое изложение моего понимания того, как инструменты, такие как Ansible и Docker, вписываются в экосистему инфраструктуры — я ожидаю, что мое понимание и взгляды со временем будут развиваться по мере углубления в Это.

Я даже не начал смотреть на такие вещи, как Core OS , которые вместе с etcd и fleet могут оказаться интересными и потенциально ценными строительными блоками, но я оставлю это на следующий день, когда у меня будет время изучить его подробнее. глубоко.