Docker - экономим время на установке приложений

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

Предположим, у вас проект, 3 среды (тестовая, предпродуктовая, продуктовая), есть поисковый движок Elasticsearch, база данных PostgreSQL, и нереляционное хранилище данных Redis.

Теперь у нас стоит задача, чтобы на всех окружениях были идентичные параметры/настройки всех служб и ПО и все они между собой работали без проблем, так как если не соблюдать такое правило, со временем может получится так, что на тестовом сервере у нас все отлично работает, а на бою все сломалось или к примеру на локальной машине разработчика все отрабатывает правильно, а на бою этот же код работать не хочет.

Вот тут и поможет нам Docker, в данной статье будет в основном практика, так как теории везде полно, теорию можно почитать к примеру тут .

Приступим!

Основная суть Docker - это взять ваш проект/код и загрузить его в отдельное изолированное окружение/процесс на базе готового образа и работать с ним внутри этого окружения.

Образы можно смотреть вот на этом ресурсе hub.docker.com, а так же создавать свои и заливать туда.</p>

Для использования в своем проекте docker выделяют два основных файла:

В файле Dockerfile вы описываете работу контейнера для своего проекта, для написания инструкций используется язык DSL.

Рассмотрим базовый пример Dockerfile для NodeJS:

#указываем какой образ нужно установить в наш контейнер
FROM node:8

#указываем рабочую папку проекта
WORKDIR /app

#копируем из нашей директории все файлы в WORKDIR
COPY . .

#устанавливаем все зависимости, запускаем команду npm install
RUN npm install

#доступ к контейнеру через порт 8080
EXPOSE 8080

#выполняем команду node index.js в WORKDIR
CMD [ "node", "index.js" ]

Пример Dockerfile для Golang:

#указываем какой образ нужно установить в наш контейнер
FROM golang

#копируем весь пакет, GOPATH в конетйнере лежит в /go/, путь зависит от проекта
COPY . /go/src/<путь до пакета>/

#устанавливаем рабочую директорию, путь зависити от проекта
WORKDIR /go/src/<путь до пакета>/

#устанавливаем нужны пакеты, можно все вынести в один makefile и запустить его
RUN go get github.com/jinzhu/gorm

#собираем приложение, тоже зависит от пути проекта
RUN go build -o main .

#доступ к контейнеру через порт 8080
EXPOSE 8080

#выполняем команду node index.js в WORKDIR
CMD [ "main" ]

После составления Dockerfile, в корне проекта, где лежит этот файл, нужно собрать контейнер и запустить его, хорошо написано об этом в офф документации вот тут.

Выше были показаны типовые/базовые Dockerfile для проекта, каждая команда имеет комментарий, для PHP есть образы сразу в связке с Apache, Nginx и т.п., для проектов на фреймворке Laravel использую laradock.

Для проектов Bitrix, есть подобная сборка bitrixdoc.

Так же можете посмотреть примеры Dockerfile старого проекта maxkrasnov.ru, вот тут для фронт-части, вот тут для бэка.

После того, как мы описали контейнер для своего проекта, мы хотим использовать различные сторонние сервисы/службы с ним, так же используя Docker. Для этого нам нужен файл docker-compose.yml, в нем описываются связи между контейнерами и указываются настройки.

О docker-compose.yml тоже хорошо написано в офф документации, вот тут, настройки этого файла можно посмотреть в репозиториях данного проекта.