Docker - экономим время на установке приложений
В сети немало статей о Docker и каждый рассматривает его плюсы со своей “колокольни”, для меня это инструмент, который позволяет экономить кучу времени при развертывании моего проекта и установки различных зависимостей, служб, программного обеспечения.
Предположим, у вас проект, 3 среды (тестовая, предпродуктовая, продуктовая), есть поисковый движок Elasticsearch, база данных PostgreSQL, и нереляционное хранилище данных Redis.
Теперь у нас стоит задача, чтобы на всех окружениях были идентичные параметры/настройки всех служб и ПО и все они между собой работали без проблем, так как если не соблюдать такое правило, со временем может получится так, что на тестовом сервере у нас все отлично работает, а на бою все сломалось или к примеру на локальной машине разработчика все отрабатывает правильно, а на бою этот же код работать не хочет.
Вот тут и поможет нам Docker
, в данной статье будет в основном практика, так как теории везде полно, теорию можно почитать к примеру тут .
Приступим!
Основная суть Docker
- это взять ваш проект/код и загрузить его в отдельное изолированное окружение/процесс на базе готового образа и работать с ним внутри этого окружения.
Образы можно смотреть вот на этом ресурсе hub.docker.com, а так же создавать свои и заливать туда.</p>
Для использования в своем проекте 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
#выполняем команду 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 тоже хорошо написано в офф документации, вот тут, настройки этого файла можно посмотреть в репозиториях данного проекта.