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

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

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

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

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

Приступим!

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

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

Для использования в своем проекте docker отвечают файлы Dockerfile и docker-compose.yml (опционально), обычно их хранят в корне проекта.

В файле 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
#запускаем скомпилированный файл main в WORKDIR
CMD [ "main" ]

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

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

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

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

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

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