Запуск LAMP и сотен других веб-приложений в несколько кликов

image В прошлой публикации я рассказал как SSHeller помогает быстро и легко развернуть OpenVPN сервер. В версии 1.1.0 был добавлен еще один плагин — Docker.
Хочу сразу предупредить, что если у вас руки заточены под консоль, а управление Docker через командную строку кажется удобным и интуитивно понятным, — не нужно читать дальше, не нужно писать ничего в комментариях, я и так знаю, что SSHeller вам не нужен.

А кому он нужен? В первую очередь разработчикам веб-приложений, а так же всем, кому легко и быстро нужно поднять какой-нибудь сервис, будь то сайт, блог, или импровизированный файлообменник.

Нужен сервер с практически любым современным Linux дистрибутивом. Но, в отличии от OpenVPN, для Docker я бы порекомендовал Debian 9 либо Ubuntu 18.04. С Fedora и Centos дела обстоят чуть хуже, так как требуется ставить больше пакетов, дополнительно настраивать автозапуск, немного иначе построена работа с хранилищем.

Самое главное — это должна быть либо физическая либо виртуальная машина, но никак не контейнер (LXC, OpenVZ не подойдут). И нужен доступ по SSH. В прошлой публикации есть подробное описание, как зарегистрироваться и запустить сервер в DigitalOcean, а в конце — чуть менее подробная инструкция для Linode. Оба этих сервиса предлагают простые машины за $5/месяц и бонусы при регистрации по реферальной ссылке. Для начала этого будет вполне достаточно.

Как только у нас есть IP, логин и пароль к серверу, можно устанавливать SSHeller. Скачать его можно из релизов на GitHub, есть версии для macOS, Windows и Linux. После запуска добавляем наш сервер, подключаемся к нему и переходим к плагину Docker.

vt_nzd3_3-0x7pfb-ogoxhzaya0.png

Если Docker на сервере еще не установлен, сделать это можно нажатием кнопки Install.
Менее, чем через минуту, завершится установка, откроется отчет, который можно непрочитать и закрыть, а в главном окне будет список контейнеров, томов и форма запуска нового контейнера.

ubycgrxynpo-elqkqu_z2gimbcs.png


Запуск контейнера

В самом низу рабочей области располагается блок запуска нового контейнера. В нем отображается:


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

Выбрать можно любой официальный Docker образ и еще несколько дополнительных. Их перечень задается в файле https://github.com/delfer/ssheller/blob/master/plugins/docker-profiles.json и на момент публикации это:


  • jwilder/nginx-proxy — автоматически настраиваемый Nginx для доступа к контейнерам через доменное имя, а не порт
  • panubo/vsftpd — FTP сервер
  • coderaiser/cloudcmd — WEB-инетрфейс для доступа к файлам
  • webdevops/php-apache-dev — сборка Apache + PHP + модули для разработки (выводит ошибки)
  • webdevops/php-apache — сборка Apache + PHP + модули для «прода» (не выводит ошибки)
  • webdevops/php-nginx-dev — сборка Nginx + PHP + модули для разработки (выводит ошибки)
  • webdevops/php-nginx — сборка Nginx + PHP + модули для «прода» (не выводит ошибки)

Большинство контейнеров будут игнорировать содержимое поля Password, кроме перечисленных в docker-profiles.json (секция parameters):


  • panubo/vsftpd — пароль для подключения по FTP под пользователем admin
  • coderaiser/cloudcmd — пароль для входа под пользователем admin
  • mysql/mariadb/postgres/influxdb — пароль для подключения к базе db под пользователем admin
  • rabbitmq/couchdb/orientdb — пароль для подключения под пользователем admin

Важные особенности:


  • Тэги загружаются автоматически после выбора образа. Доступен поиск
  • Контейнер будет доступен на том порту, который указал его автор. Если порт занят — будет выбран первый свободный
  • Контейнер будет доступен на домене <имя контейнера>.<домен сервера> если есть соответствующие записи в DNS
  • Для контейнера будут созданы тома, если их указал автор образа, либо они заданы в docker-profiles.json (секция volumes)

Полезные советы:


  • jwilder/nginx-proxy нужно запускать первым, чтобы он занял 80 порт
  • panubo/vsftpd нужно запускать последним, так как при запуске он меняет права доступа к папке, чтобы иметь к ней полный доступ
  • почти всегда лучше использовать образ с тэгом alpine или latest-alpine — они работают так же как и обычные, но гораздо быстрее загружаются за счет меньшего веса
  • если вам нужна MySQL — используйте лучше MariaDB, если, конечно, вы точно не уверены в том, что MariaDB вам не подходит
  • если вы запускаете что-то с PHP, то fpm вам, скорее всего, не нужен, а нужен apache

Дополнительная информация
После нажатия на кнопку RUN, как только контейнер будет запущен, появится окно с отчетом, в котором будет указана выполненная команда docker run. Она расскажет много интересного о том, как все на самом деле устроено.


Доступ через доменное имя

Если вы запускаете несколько контейнеров с веб-интерфейсом, например Wordpress и NextCloud, и хотите, чтобы доступ к ним бы не через указание IP и порта, а по доменному имени, то нужно выпонить два простых условия:


  1. Первым запустить jwilder/nginx-proxy
  2. Иметь Wildcard DNS запись

cwlbpti4bl4fh5ft_0yjirq0lzq.png

Т.е. если, например, у вас есть домен example.com, то нужно добавить в него запись * типа A и указать IP сервера. В таком случае, запущенный контейнер worpdress будет доступен по адресу http://wordpress.example.com

А если домена нет — не проблема, можно воспользоваться сервисом nip.io — не нужно ни регистрироваться, ни добавлять записи. Если, например, у вашего сервера IP 172.104.129.183, и на нем запущены jwilder/nginx-proxy и nextcloud, то последний будет доступен по адресу http://nextcloud.172.104.129.183.nip.io


Запуск двух контейнеров с одним томом

Часто бывает, например, что один контейнер файлы публикует (nginx), а второй — загружает (panubo/vsftpd). Или второй нужен чтобы посмотреть/скачать содержимое первого.

Например, Jenkins после запуска спрашивает пароль, записанный в файле.

n6-twxfpt2julveymoefi0tmlnw.png


  1. Запускаем Jenkins
  2. Выбираем его том jenkins_var_jenkins_home
  3. Указываем пароль для доступа
  4. Запускаем coderaiser/cloudcmd
  5. Открываем http://coderaiser-cloudcmd.<домен>, вводим логин admin и пароль из п. 3
  6. Смотрим пароль от Jenkins

ob3tjhmducp1x7g7fkdhioeoeqa.png

3jghtmbxdv9nkwa8gisasqnsslk.png


Взаимодействие между контейнерами

Также бывает нужно из одного контейнера подключаться к другому. Например wordpress при установке попросит указать параметры подключения к базе данных: адрес сервера (host) и порт.

localhost для взаимодействия между контейнерами работать не будет.

В общем случае, нужно указывать внешний IP адрес сервера и порт, отображенный
перед стрелкой (->) в списке контейнеров. Для простоты, добавлена возможность вместо IP адреса сервера указывать просто слово host.

Кроме MySQL, может пригодиться PostgreSQL, MongoDB, Redis, memcached, Tomcat, InfluxDB, CouchDB и т.п…


Файлообменник


  1. Запускаем nginx: alpine
  2. Вводим пароль администратора для web-интерфейса
  3. Выбираем том nginx_usr_share_nginx_html
  4. Запускаем coderaiser/cloudcmd: latest-alpine

Теперь можно зайти на http://<адрес сервера>:8000, чтобы загружать файлы с авторизацией, а через http://<адрес сервера> будут доступны прямые ссылки. Нужно только указать полный путь к файлу.


Wordpress


  1. Придумываем и вводим пароль для базы данных
  2. Запускам mariadb
  3. Запускаем wordpress: apache
  4. Переходим по адресу http://<адрес сервера>, начинаем установку и указываем параметры подключения к СУБД:
    • Имя базы данных: db
    • Имя пользователя: admin
    • Пароль — тот, что ввели в п.1
    • Сервер базы данных: host
    • Префикс таблиц — любой


LAMP


  1. Придумываем и вводим пароль для базы данных
  2. Запускам mariadb
  3. Запускаем webdevops/php-apache-dev: alpine
  4. Выбираем том webdevops-php-apache-dev_app
  5. Придумываем и вводим пароль для FTP сервера
  6. Запускаем panubo/vsftpd

Теперь можно загрузить .php файлы на ftp://<адрес сервера> и запустить их, перейдя по адресу http://<адрес сервера>

Далеко не все контейнеры доступны в приложении, а некоторые из доступных — не работают без дополнительных настроек — редактируйте файл на GitHub и присылайте свои Pull Request’ы. Если не знаете как — открывайте Issue. Этим вы поможете развитию проекта.

Другие способы поддержать проект, а так же множество полезной информации — в файле README.

© Habrahabr.ru