Skip to content

Commit

Permalink
add new docker-cloud post
Browse files Browse the repository at this point in the history
  • Loading branch information
ctrlok committed Apr 7, 2016
1 parent ef9e31e commit d80c987
Show file tree
Hide file tree
Showing 3 changed files with 79 additions and 0 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
ssl/
.Ulysses-favorites.plist
.Ulysses-Group.plist
Binary file added content/images/docker-cloud.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
77 changes: 77 additions & 0 deletions content/post/docker-cloud.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
+++
date = "2016-04-07T15:18:03+03:00"
draft = false
title = "Перенос блога и Docker Cloud"

+++

В общем, решил мигрировать блог на [hugo][1] - генерилку статичных страниц, написанную на go, так как вордпрес меня в конец достал своим существованием и непредсказуемостью, а так html он и есть html.

Соответственно если что-то делать, то можно заодно посмотреть на какие-то новые штуки, до которых всё равно не доходили руки, а тут как раз подвернулся [Docker Cloud][2] - решение из разряда всё в одном.

Из плюсов которые меня привлекли:

1. Он умеет билдить имеджи по хукам гитхаба, так что я первым делом сделал [docker образ][3] для hugo. Также это удобно для того что б не париться лишний раз с CI.
2. У Docker Cloud есть интеграция с различными [облачными провайдерами][4], а так же возможность подключать докеры даже к провайдерам [не из списка][5] . Мне был нужен DO, так что я просто присоединил его аккаунт к Docker Cloud и в админке докер клауда создал новую ноду
3. Он бесплатен для одной ноды, что меня вполне устраивает на текущий момент и вообще делает из себя вид что он какой-то месос\кубернетис.
4. У него есть поддержка [stacks][6] эдакого варианта docker-compose для клауда, в котором можно обычным yaml описать нужную тебе инфратсруктуру. Важно что этот stacks приватный, соответственно можно складывать в него всякие ключи, которые нельзя хранить в репе (в моём случае это был ключ от slackin для [ukrops][7])
5. Всё работает в связке: ты делаешь коммит в гит, гит дёргает докерхаб, который собирает твой имедж и после апдейта имеджа он деплоится на твою ноду.


Я сразу решил что такой сервис, да ещё и забесплатно как раз то, что мне нужно. В итоге у меня должно было бы получится что-то такое:

{{< figure src="/images/docker-cloud.png" >}}

Есть [репо][8], в котором лежит сайт в hugo формате и конфиг nginx. По коммиту, при помощи ctrlok/hugo имеджа докер билдит статику и экспортит это всё дело в волюмы.

{{<highlight docker "style=friendly">}}
FROM ctrlok/hugo
MAINTAINER Vsevolod Polyakov [[email protected]][9]
ADD config.toml /opt/ctrlok.com/
ADD content/ /opt/ctrlok.com/content
ADD themes/ /opt/ctrlok.com/themes
RUN mkdir /opt/ctrlok.com/public
WORKDIR /opt/ctrlok.com
RUN hugo -t angels-ladder
VOLUME /opt/ctrlok.com/public
ADD nginx/default.conf /etc/nginx/conf.d/default.conf
VOLUME /etc/nginx/conf.d
{{< / highlight >}}

Эти волюмы цепляет к себе nginx:alpine, который в свою очередь ещё залинкован на имедж с slackin. То есть ничего сложного.

В итоге я сделал stack файл, и вроде бы всё заработало, но линк на slackin не заработал. Его просто не видно по DNS. Более-менее сразу гуглится [ответ][10]: если у вас не работают линки по DNS, то используйте env переменные. Насколько я понял там не обычная линковка, а сеть, которую они менеджат при помощи [weave][11], что уже само по себе подозрительно.
Переменные окружения в nginx использовать не очень удобно, для этого нам надо по конфигу раскидать

{{<highlight nginx "style=friendly">}}
# в основном контексте, чтобы пробросить переменную к воркерам
env SLACKIN\_PORT\_3000\_TCP\_ADDR;
# в контексте http, чтобы заюзать
perl\_set $slackin 'sub { return $ENV{"SLACKIN\_PORT\_3000\_TCP\_ADDR"}; }';
{{< / highlight >}}

Попробовал внести эти изменения и оказалось что контейнер с nginx, который берёт волюмы с другого контейнера не рестартуется когда тот контейнер меняется и передеплаивается (кстати, сама по себе пауза между сборкой контейнера и его передеплоем может быть больше двух минут).

Самое забавное что даже если ты руками из консоли стопаешь и стартуешь nginx, то он всё равно поднимается с волюмами предыдущего контейнера. Так что нет никакой возможности обновлять сайт\конфиг через волюмы.

После этого я стопнул всё, стартанул опять и проблема повторилась. Я так понял что надо просто вообще все сервисы убивать и заново создавать :) Фиг знает чем они думали и зачем так делали.

Сама по себе консоль хоть и отзывчивая, но любит посыпать всякими странными ошибками, когда меняешь конфиги. Я не заскриншотил, но когда ты одновременно `restart policy` и `destroy policy`, то она сходит с ума и не разрешает вообще ничего сделать.

Пару раз нарывался на невозможность стартануть контейнер. В общем мне непонятно за что просят 12 баксов за ноду. Это Docker Cloud ещё должен доплачивать.

В итоге я пока решил не делать CI, переписал всё на [grammarly/rocker][12] и [grammarly/rocker-compose][13] и заюзал докер-машину с DO.

[1]: https://gohugo.io
[2]: https://cloud.docker.com/onboarding/
[3]: https://github.com/ctrlok/docker-hugo
[4]: https://docs.docker.com/docker-cloud/getting-started/use-hosted/
[5]: https://docs.docker.com/docker-cloud/tutorials/byoh/
[6]: https://docs.docker.com/docker-cloud/feature-reference/stacks/
[7]: http://slack.ukrops.club
[8]: https://github.com/ctrlok/ctrlok.com
[9]: mailto:[email protected]
[10]: https://docs.docker.com/docker-cloud/feature-reference/service-links/
[11]: https://www.weave.works/
[12]: https://github.com/grammarly/rocker
[13]: https://github.com/grammarly/rocker-compose

0 comments on commit d80c987

Please sign in to comment.