Docker как замена Homebrew

Проблема

После обновления на OS X Yosemite мне захотелось избавится от зависимости homebrew, не от homebrew как такового, а от установки при помощи него всяких mysql, postgres, redis и т.д. На самом деле из-за homebrew уже давно не накатываю обновления поверх старой системы, а делаю полностью новою установку с форматированием диска. Для этого есть несколько причин:

  • Начинать с чистого листа всегда хорошо и можно избавится от кучи мусора что накопилось за предыдущий цикл жизни мажорной версии ОС
  • Обновления в моем случае никогда не накатываются гладко, не поломав при этот половину критичных вещей

Чаще всего у меня ломаются серверные пакеты из homebrew (о ужас когда-то это был macports), и после обновления в 90% случаев сервер mysql оказывается в положение кота шредингера, он вроде есть, и в тоже время его нет. Ситуацию еще усугубляет python, наверное каждый python разработчик сталкивался с болью установки mysql-python под Mac OS (слава богам что для меня эти времена прошли).

Так вот, после обновления на Yosemite было решено попробовать docker для поднятия всех этих серверных «штук». Как поднимать docker под Mac OS подробно расписано в документации, я лишь скажу что использовать docker в сыром виде для этих целей не лучший вариант.

Решение

И тут на помощь приходит Fig который идеально прижился у меня. Всё что необходимо, это описать конфиг:

fig.yml
1
2
3
4
5
6
7
8
9
10
11
12
redis:
image: redis
ports:
- "6379:6379"
postgres:
image: postgres
ports:
- "5432:5432"
couchdb:
image: "klaemo/couchdb"
ports:
- "5984:5984"

И дальше манипулировать контейнерами как угодно:

1
2
3
4
5
6
7
8
9
10
11
12
$ fig up redis
# или запустить в фоне
$ fig up -d redis
# или запустить всё в фоне
$ fig up -d
$ fig ps
Name Command State Ports
-----------------------------------------------------------------------------
couchdb_1 /entrypoint.sh couchdb Exit 0 0.0.0.0:5984->5984/tcp
postgres_1 /docker-entrypoint.sh postgres Exit 0 0.0.0.0:5432->5432/tcp
redis_1 /entrypoint.sh redis-server Up 0.0.0.0:6379->6379/tcp

Fig достаточно гибкий в настройке. Можно например указать какие папки примаунтить в контейнер (для Mac OS fig >= 1.0.0), полезно для БД, или указать что контейнеру нужен privileged mode, или поставить лимит на RAM, и т.п что можно указать напрямую для docker, только в удобном для редактирования yaml файле.

Единственная проблема которую решил не полностью, это отсутствие в хосте установленных клиентов типа redis-cli или psql, но обычно «хорошие» образы позволяют решить и это. Например для редиса я сделал себе alias:

1
2
3
4
5
$ alias redis-cli="docker run -it --link yurtaev_redis_1:redis --rm redis sh -c
> 'exec redis-cli -h
> \"\$REDIS_PORT_6379_TCP_ADDR\" -p \"\$REDIS_PORT_6379_TCP_PORT\"'"
$ redis-cli
172.17.0.12:6379> SET qwerty 213

А еще можно так:

1
2
$ alias f="fig -f $HOME/fig.yml"
$ f stop

и из любого места управлять контейнерами

Итого

Плюсы

  • Решена проблема при накатывание обновления ОС
  • Можно поднимать то чего нет или очень старое в homebrew
  • Очень просто поднять несколько различных версий одного и того же сервера, полезно при тестирование на этапе разработки

Минусы

  • Нужно не забывать стартовать при включение машины boot2docker и fig, но кто-то еще выключает компьютеры?!
  • Требуется держать в фоне запущенный virtualbox который жрет ресурсы. Рекомендую уменьшить количество RAM и ядер для boot2docker
  • Для доступа к сервисам которые крутятся в docker нужно указывать ip адрес виртуальной машины (никакого localhost по умолчанию теперь). Я просто добавил в /etc/hosts отдельный хост который всегда указывает на boot2docker ip
  • Docker очень любит кушать место на жестком диске