Этот блог зародился для заметок, да и просто для того, чтобы посмотреть, что там @umputun посоветовал в своём личном блоге. Благо, я нашёл там для себя живой пример, как и для чего вообще существует такая утилита, как docker-compose.
Сам пост начинал писать несколько раз, приходилось несколько раз останавливаться и забрасывать эту заметку в черновики, потом снова открывать и перечитывать, что я тут написал, и что нужно ещё дописать. Тем не менее, надеюсь, что теперь ничего не забыл и написал всё, что хотел.
Что же было предложено? Umputun предложил воспользоваться таким движком для блога, как Ghost, основан он на node.js, а для построения статики используется модуль python buster, раздавать которую будет nginx. Другими словами, всё достаточно банально до безобразия, самим движком мы будем пользоваться только для написания постов, сами же посты и страницы будут отдаваться nginx'ом, и кешироваться им же. Сделать же такую инсталляцию обособленной и способной к быстрому переносу нам помогут контейнеры в лице docker.
Почему был выбран docker? Да потому, что я и сам не представляю наиболее лёгкого в освоении инструмента, который позволяет с лёгкостью построить и хранить базовые образы и запускать на их основе контейнеры с работающими в них приложениями. Дико удобно, попробовав раз, как говорилось в рекламе... Но не буду отвлекаться. Правилом хорошего тона является запуск контейнера для одного-единственного приложения, чтобы можно было максимально "подробить" комплекс ПО на отдельные кусочки. Также и тут: будем "крутить" nginx в своей песочнице, а ghost+buster в своей. Чтобы этот процесс тоже не представлял особой сложности, была придумана уже в третий раз упоминаемая утилита docker-compose, которая позволит описать в одном файле все интересуемые контейнеры, указать необходимые настройки для их запуска, а самое главное - достаточно быстро обновить запущенные контейнеры при изменении того или иного контейнера. Вот так выглядит по умолчанию содержимое docker-compose.yml у автора:
ghost-buster: image: umputun/ghost-buster-docker restart: always container_name: ghost-buster environment: - BLOG_DOMAIN=http://p.umputun.com #<<-- EDIT THIS - NODE_ENV=production ports: - "2368:2368" volumes: - ./static:/ghost/static - ./data:/ghost-override - ./export.md:/export.md nginx: build: build/nginx restart: always container_name: ghost-nginx links: - ghost-buster:ghost-buster ports: - "80:80" volumes: - ./static:/ghost/static - ./logs:/var/log/nginx
Описали два будущих контейнера ghost-buster и ghost-nginx, первый строится Dockerfile'а, который лежит в текущей папке по пути build/ghost-buster, второй — по пути build/nginx. Тут же указана политика всегда рестартовать контейнер, свои переменные окружения, порты, связки и разделы, которые нужно монтировать внутрь контейнера. Всё описано достаточно просто и понятно. Что важно - файл читается посоедовательно и контейнеры создаются/запускаются/перезапускаются именно в том порядке, в котором они описаны в этом самом файле. Весьма удобное и полезное решение, способное сократить достаточно времени на вполне рутинные операции, которые делались бы вручную.
В принципе, такого конфига вполне достаточно для того, чтобы развернуть движок и сразу начать работать и не особо напрягаться по поводу того, как и что тут создаётся и делается. Я же всё-таки при установке указал жёсткие интерфейсы, по которым нужно было «прокидывать» порты наружу контейнера (на самом деле, можно оставить проброс только для nginx’а). Плюс была ещё пара нюансов, связанных с конкретным моим сервером.
Мне понравился данный подход своей лаконичностью и понятностью конфигурирования и развёртыывания на сервере. Тем, кто пользуется docker-контейнерами, но до сих пор не пользовался утилитой docker-compose советую не терять времени и изучить её. А тем, кто не пользовался контейнерами вообще - обратить на них внимание, благо можно сделать очень много полезного.