[Из песочницы] Внедрение Docker для небольшого проекта в Production
Эта статья посвящена всем, кто еще думает, а стоит ли мне заморачиваться с данной технологией имея не большую виртуалку на одном из известных хостеров и что в итоге мне это даст.
Тем кому это интересно добро пожаловать под кат.
Спешу так же заметить, что данная статья не является полноценным руководством к действию, а всего лишь описывает один из возможных сценариев развертывания собственного сервера.
Я имею большой опыт работы с различного рода хостинг провайдерами, могу выбирать площадку как для больших так и малых проектов, знаю плюсы и минусы некоторых площадок и имею свое собственное мнение. Так как это информативная статья, а не рекламная то оперировать конечными именами площадок мы не будем. А зададим лишь несколько условий:
- Вариант развития событий, чисто установленная ОС, без лишних компонентов, последняя версия Docker, о том как ее установить подробно описано в документации.
- Еще один прекрасный способ это использовать ОС созданную специально для контейнеров, например CoreOS
Я остановлюсь более подробно на варианте номер 2, так как именно его я выбрал для себя. Изначально я выбирал между RancherOS и CoreOS, но в период эксплуатации первой я обнаружил множество недоработок, проблем и неудобств, после чего решил отказаться от ее использования. Для тех кому интересно, что это за ОС, тот может легко справиться с гуглом и поискать о ней информацию. Вкратце это форк, но CoreOS, но единственное все системные службы это Docker контейнеры. В целом они достаточно похожи, у каждой есть свои фичи. Но недостатком ранчера для меня лично стало отсутствие хорошей документации, не возможность выполнить ряд настроек через cloud-config и еще пара моментов утилизации памяти и системных ресурсов. Не говоря уже о том, что структура файловой системы очищается на первоначальное состояние кроме папок /opt и /home. Так же одним из недостатков этого дистрибутива было то что он по умолчанию как и все дистрибутивы Linux настроен на временную зону UTC, но вот, возможности изменить это дело в консоли после установки не было, и нужно было полностью менять консоль на любую поддерживаемую, например CentOS или Ubuntu, что не совсем удобно, занимает дополнительное время и место на дисках. Так же команды инициализации из cliud-config и user-config выполняются только в контексте нашей консоли. Следовательно специфичны. В CoreOS с этим все хорошо, можно сделать вот так:
cp /usr/share/zoneinfo/Europe/Moscow /etc/localtime
А после пробрасывать эти настройки в любой из наших контейнеров. Еще одной проблемой было создание стартового скрипта, который должен выполнить Rancher после установки, скрипт благополучно создавался, но не выполнялся. Хотя права были установлены верно. По мере работы с ним, возникало множество мелких вопросов, в следствии чего решено было отказаться от его использования. И выбрать CoreOS, которая кстати из коробки поддерживает кластеризацию, чего в RancherOS пока нет вовсе. К тому же CoreOS умеет работать как с контейнерами Docker так и со своими собственными Rocket (rkt), что является конечно же плюсом. Еще одной особенностью CoreOS являются авто обновления, которые она запрашивает очень часто, а в случае получения такового она обязательно перезагружается вся целиком, это конечно поправимо на этапе установки или в пользовательском файле конфигурации, но сами разработчики рекомендуют не изменять это значение и позволить ОС выполнять перезагрузку, когда у вас кластер, и сервисы автоматически мигрируют по нодам это не так критично, но если у вас 1 сервер, то возможно такая особенность будет критична к простою сервиса в несколько минут. Хотя честно говоря, загрузка происходит очень быстро.
В целом оба варианта установки не имеют никаких различий кроме того, что одна ОС настолько минималистична, что не имеет даже пакетного менеджера. Но никто не запрещает разворачивать контейнеры на привычном дистрибутиве. Я не хотел иметь на хост машине какой-то лишний софт, и считаю, что любые утилиты или программы я могу установить в нужный мне контейнер, который я могу удалить в любой момент, не нарушая целостность самой ос.
Для начала установим CoreOS на наш сервер, если ваш оператор позволяет загружать данный образ. Изначально вам нужно создать файл конфигурации cloud-config.yml в формате YAML:
#cloud-config
hostname: укажите имя хоста
# Далее настроим синхранизацию времени с российскими серверами
write_files:
- path: /etc/systemd/timesyncd.conf
content: |
[Time]
NTP=0.ru.pool.ntp.org 1.ru.pool.ntp.org
# После чего настроим демон sshd
write_files:
- path: /etc/ssh/sshd_config
permissions: 0600
owner: root:root
content: |
# Мои настройки демона.
UsePrivilegeSeparation sandbox
Subsystem sftp internal-sftp
PermitRootLogin yes
PasswordAuthentication no
ChallengeResponseAuthentication no
Port укажите желаемый порт
PrintLastLog yes
PrintMotd yes
SyslogFacility AUTHPRIV
RSAAuthentication yes
PubkeyAuthentication yes
PermitEmptyPasswords no
UseDNS no
UsePAM yes
coreos:
units:
# Настроим наше сетевое подключение
- name: 10-static.network
runtime: true
content: |
[Match]
Name=имя сетевой карты в системе
[Network]
DNS=8.8.8.8
DNS=8.8.4.4
Address=192.168.100.100/24
Gateway=192.168.100.1
DHCP=no
# Установим временную зону для нашего сервера Europe/Moscow
- name: settimezone.service
command: start
content: |
[Service]
ExecStart=/usr/bin/timedatectl set-timezone Europe/Moscow
RemainAfterExit=yes
Type=oneshot
# Сменим сокет демона sshd на нужный нам порт
- name: sshd.socket
command: restart
runtime: true
content: |
[Socket]
ListenStream=порт из конфига выше
FreeBind=true
Accept=yes
# Далее настроим, чтобы наш журнал сервера отправлялся на другой сервер syslog в сети
- name: journalctl-output.service
command: start
content: |
[Service]
Type=simple
Restart=always
TimeoutStartSec=60
RestartSec=60
ExecStart=/usr/bin/bash -c '/usr/bin/journalctl -o short -f | /usr/bin/ncat адрес_сервера порт'
ExecStop=
[Install]
WantedBy=multi-user.target
ssh_authorized_keys:
- тут ваши ключи, так как в дальнейшем авторизация будет возможна только по ключу
Я намеренно не настраиваю пользователя, и другие параметры, так как привел минимальную конфигурацию для того, чтобы ваш сервер мог работать принимать подключения безопасно и быть готовым к запуску нужных контейнеров.
Для тех у кого не завелась сеть, после загрузки с установочного диска CoreOS можно настроить сети в ручную:
sudo ifconfig имя_карты add наш_ip
sudo route add -net 0.0.0.0/0 имя_карты
sudo echo nameserver 8.8.8.8 > /etc/resolv.conf
Первая строчка назначит нашей карте наш адрес, вторая пропишет маршрут во все сети через эту карту, а третья строчка нам пропишет DNS сервера, к сожалению в базовом образе файл resolv.conf не имеет ссылок даже на гугловый сервер, и без этой строчки на этапе инсталляции мы получим ошибку.
Для того, чтобы нам было проще залить сколь угодно большой конфиг на наш сервер, можно сделать небольшую настройку.
- Меняем пароль пользователю core командой
sudo passwd core
; - Подключаемся к серверу по ssh;
- Делаем копипаст конфига после команды
vi cloud-config.yml
.
Далее следует выполнить установку командой:
sudo coreos-install -d /dev/sda -c cloud-config.yml
Где мы говорим системе установиться на первый диск, она сама сделает разметку томов, а файл конфигурации взять этот. Кстати можно переключить ветку установки, по умолчанию идет Stable, но я не стал этого делать.
После установки делаем перезагрузку, и наша система готова к использованию контейнеров Docker, о том какие и как использую я, могу описать в следующей части, если это будет интересно.
Прошу сильно не пинать, это моя первая статья на Хабре) Всем спасибо за внимание!