В очень распространенном веб-приложении я использую 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 .