Статьи

Docker встречает Vagrant (режим без регистрации)


В очень распространенном веб-приложении я использую MongoDB в качестве базы данных, memcached для хранения данных и кэшей сессии, ActiveMQ для обмена сообщениями и Solr для полнотекстового поиска. 

И каждый раз, когда появляется очень общая команда, работает над очень распространенным приложением.
И каждый разработчик в моей команде меняет вещи в базах данных. И каждый QA хочет иметь свой собственный мусор в базах данных. Наконец, мне нужно до 7 различных сред (для каждого разработчика и для тестирования разработки, и для постановки). И я помню «Делать задание более двух раз? Тогда автоматизируйте это. править. 


В этой статье я опишу, как использовать Docker и Vagrant локально без удаленного реестра.
И как я могу легко решить все свои проблемы со всеми этими современными технологиями DevOps. Я собираюсь использовать Vagrant для автоматизации подготовки виртуальных машин на компьютере разработчика. И Docker для управления контейнером. Каждый системный компонент (например, MongoDB или ActiveMQ) будет описан как Docker-контейнер. Для этого шага Docker будет выполнять ту же работу, что и Chef или Puppet, но в следующей статье я объясню, как использовать его с удаленным реестром для поддержки не виртуальной среды.

Хорошо, у меня в системе установлен Vagrant, и мне нужно установить ActiveMQ в Vagrant, используя Docker. Начнем с файла Vagrant.

    VAGRANTFILE_API_VERSION = "2"
    Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
      config.vm.box = "base"
      config.vm.network "forwarded_port", :guest => 8162, :host => 8162
      config.vm.network "forwarded_port", :guest => 61616, :host => 61616  
      config.vm.provision "docker"
    end

После запуска `vagrant up` у меня установлена ​​виртуальная машина с установленным Docker.
Я также сопоставил порты ActiveMQ из виртуальной машины в хост. Следующим шагом является создание Dockerfile для контейнера ActiveMQ. Dockerfile описывает, какие команды должны быть выполнены для подготовки контейнера. Но я понятия не имею, какие команды должны быть выполнены для установки ActiveMQ. Но это нормально. Я выясню это внутри. 

Прежде чем я начну пару слов о терминологии Docker:
    Dockerfile -> (build) -> image > (run) -> container 

 — Dockerfile — файл, который описывает изображение (родительское изображение, команды оболочки, манипуляции с FS, точка входа).

 — Изображение — на самом деле результат Dockerfile `build`. Изображение содержит все файлы для следующих контейнеров. Вы можете использовать изображение в качестве родительского для других изображений, а также вы можете извлекать и помещать изображения в хранилище.

 — Контейнер — когда вы `запускаете ‘изображение с помощью определенной команды, он создает новый контейнер. Команда может быть определена в Dockerfile или в командной строке.

Вернуться к моей ActiveMQ.
Внутри Vagrant (`vagrant ssh`) я выполняю` docker run -a stdin -a stdout -i -t ubuntu / bin / bash`. Он запускает оболочку bash в контейнер ubuntu (загружает образ ubuntu и создает контейнер bash). Хорошо, через несколько минут вот что я получил:
    apt-get update --fix-missing # first, update the system
    apt-get install -y software-properties-common python-software-properties #install add-apt-repository
    add-apt-repository -y ppa:webupd8team/java # add java
    apt-get update # one more update for java
    echo debconf shared/accepted-oracle-license-v1-1 select true | sudo debconf-set-selections # agree to java license
    echo debconf shared/accepted-oracle-license-v1-1 seen true | sudo debconf-set-selections
    apt-get install -y oracle-java8-installer # install java
    cd /tmp #load ActiveMQ
    wget http://mirror.netcologne.de/apache.org/activemq/5.10.0/apache-activemq-5.10.0-bin.tar.gz
    tar -xvzf apache-activemq-5.10.0-bin.tar.gz
    mv apache-activemq-5.10.0 /var/lib/activemq

А также я изменил порт веб-консоли ActiveMQ с 8161 на 8162 (потому что я сумасшедший). И я могу запустить `/ var / lib / activemq / bin / activemq console` внутри этого контейнера ubuntu (он недоступен снаружи контейнера). Время сказать `выход` для контейнера. 

Несколько команд Dockers, которые могут помочь:


 — `docker ps -a` — показывает все контейнеры

 -` docker images` — все загруженные изображения

 — `docker rm <хэш / имя контейнера>` — удаление контейнера

 — `docker rmi <хэш изображения>` — удаление изображения

 — `сборка docker <путь к каталогу Dockerfile> `- сборка образа из файла Docker -` Docker

 run <имя образа> <команда> `- запуск контейнера из образа (каждый запуск запускает новый контейнер)

 -` Docker start / stop / kill / attach <хеш контейнера / name> `- запускает / останавливает / убивает / присоединяет к контейнеру

`sick_torvalds` — автоматически сгенерированное имя для моего контейнера bash. И я удаляю его `docker rm sick_torvalds` (эти имена иногда звучат ужасно).


Давайте сделаем мой Dockerfile внутри директивы `activemq`. 
    FROM ubuntu:latest
    
    RUN apt-get update --fix-missing
    RUN apt-get install -y software-properties-common python-software-properties
    RUN add-apt-repository -y ppa:webupd8team/java
    RUN apt-get update
    RUN echo debconf shared/accepted-oracle-license-v1-1 select true | sudo debconf-set-selections
    RUN echo debconf shared/accepted-oracle-license-v1-1 seen true | sudo debconf-set-selections
    RUN apt-get install -y oracle-java8-installer
    
    RUN cd /tmp
    RUN wget http://mirror.netcologne.de/apache.org/activemq/5.10.0/apache-activemq-5.10.0-bin.tar.gz
    RUN tar -xvzf apache-activemq-5.10.0-bin.tar.gz
    RUN mv apache-activemq-5.10.0 /var/lib/activemq
    COPY jetty.xml /var/lib/activemq/conf/jetty.xml
    
    EXPOSE 61616
    EXPOSE 8162
    
    ENV ACTIVEMQ_OPTS_MEMORY -Xms300m -Xmx300m
    
    ENTRYPOINT /var/lib/activemq/bin/activemq console

Довольно точно, верно. Я использую `jetty.xml` для переопределения порта веб-консоли на 8162 (просто пример здесь). Поэтому мне нужно поместить `jetty.xml` в папку` activemq`. Несколько слов о нотации Dockerfile: 


 — `FROM` — имя родительского образа

 -` RUN` — выполнить команду оболочки (докер продолжит выполнение в случае исключения)

 — `COPY` (или` ADD`) — скопировать из каталога Dockerfile в образ

 — `EXPOSE` — сделать порт доступным для других контейнеров (но не из-за пределов инфраструктуры Docker)

 — `VOLUME` — смонтировать том Docker (см. следующую статью)

 -` USER` — изменить на пользователя (`root` по умолчанию для контейнера)

 -` ONBUILD `- выполнить только для дочерних контейнеров

 -` ENTRYPOINT` — `command` или` [‘binary’] `для execute. Если вы определили массив JSON в качестве аргумента, тогда первый элемент должен быть двоичным. Если это команда `/ bin / sh -c <команда>` будет выполнена.

 — `CMD` — команда по умолчанию для` docker`. Если вы используете ENTRYPOINT с двоичным файлом, вы можете определить аргументы по умолчанию здесь. Честно говоря, я не понимаю разницу между ENTRYPOINT и CMD, и это может быть неправильно.


Вернуться к материалам ActiveMQ.
Теперь вы можете собрать и запустить контейнер внутри Vagrant box:
    docker build -t myrepo/activemq /vagrant/activemq
    docker run -d -p 8162:8162 -p 61616:61616 --name activemq myrepo/activemq
    docker logs activemq # see the logs

`-p 8162: 8162 -p 61616: 61616` говорит, что я хочу отобразить` host_port: container_port`. Я также картирую эти порты в Вагранте, помнишь? Откройте http: // localhost: 8162 / на вашем хосте. Должно сработать.

Последняя модификация в Vagrantfile, позволяющая собирать activemq и запускать время создания виртуальной машины. Замените `config.vm.provision» docker «` на:

    VAGRANTFILE_API_VERSION = "2"
    Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
      config.vm.box = "base"
      config.vm.network "forwarded_port", :guest => 8162, :host => 8162
      config.vm.network "forwarded_port", :guest => 61616, :host => 61616  
      config.vm.provision "docker" do |d|
        d.build_image "-t myrepo/activemq /vagrant/activemq"
        d.run "-d -p 8162:8162 -p 61616:61616 --name activemq myrepo/activemq"
      end
    end

Вот и все.
Вы можете выполнить `vagrant destroy` и` vagrant up`, чтобы проверить, работает ли он.

Спасибо за чтение. Теперь вы можете легко автоматизировать подготовку машин для разработчиков с помощью Vagrant и Docker. Следующим шагом будет автоматизация вашей промежуточной среды и (может быть) доставка в производство с использованием реестра Docker. Источник на  github .