Запуск LAMP и сотен других веб-приложений в несколько кликов
В прошлой публикации я рассказал как 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.
Если Docker на сервере еще не установлен, сделать это можно нажатием кнопки Install
.
Менее, чем через минуту, завершится установка, откроется отчет, который можно непрочитать и закрыть, а в главном окне будет список контейнеров, томов и форма запуска нового контейнера.
Запуск контейнера
В самом низу рабочей области располагается блок запуска нового контейнера. В нем отображается:
- том, выбранный из списка выше, который будет подключен к контейнеру, если он это поддерживает
- пароль, который будет установлен приложению в контейнере, опять же, если он это поддерживает
- выбор образа контейнера
- и выбор тэга образа
Выбрать можно любой официальный 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 и порта, а по доменному имени, то нужно выпонить два простых условия:
- Первым запустить jwilder/nginx-proxy
- Иметь Wildcard DNS запись
Т.е. если, например, у вас есть домен 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 после запуска спрашивает пароль, записанный в файле.
- Запускаем Jenkins
- Выбираем его том
jenkins_var_jenkins_home
- Указываем пароль для доступа
- Запускаем coderaiser/cloudcmd
- Открываем http://coderaiser-cloudcmd.<домен>, вводим логин
admin
и пароль из п. 3 - Смотрим пароль от Jenkins
Взаимодействие между контейнерами
Также бывает нужно из одного контейнера подключаться к другому. Например wordpress при установке попросит указать параметры подключения к базе данных: адрес сервера (host) и порт.
localhost
для взаимодействия между контейнерами работать не будет.
В общем случае, нужно указывать внешний IP адрес сервера и порт, отображенный
перед стрелкой (->
) в списке контейнеров. Для простоты, добавлена возможность вместо IP адреса сервера указывать просто слово host
.
Кроме MySQL, может пригодиться PostgreSQL, MongoDB, Redis, memcached, Tomcat, InfluxDB, CouchDB и т.п…
Файлообменник
- Запускаем nginx: alpine
- Вводим пароль администратора для web-интерфейса
- Выбираем том
nginx_usr_share_nginx_html
- Запускаем coderaiser/cloudcmd: latest-alpine
Теперь можно зайти на http://<адрес сервера>:8000, чтобы загружать файлы с авторизацией, а через http://<адрес сервера> будут доступны прямые ссылки. Нужно только указать полный путь к файлу.
Wordpress
- Придумываем и вводим пароль для базы данных
- Запускам mariadb
- Запускаем wordpress: apache
- Переходим по адресу http://<адрес сервера>, начинаем установку и указываем параметры подключения к СУБД:
- Имя базы данных:
db
- Имя пользователя:
admin
- Пароль — тот, что ввели в п.1
- Сервер базы данных:
host
- Префикс таблиц — любой
- Имя базы данных:
LAMP
- Придумываем и вводим пароль для базы данных
- Запускам mariadb
- Запускаем webdevops/php-apache-dev: alpine
- Выбираем том
webdevops-php-apache-dev_app
- Придумываем и вводим пароль для FTP сервера
- Запускаем panubo/vsftpd
Теперь можно загрузить .php
файлы на ftp://<адрес сервера> и запустить их, перейдя по адресу http://<адрес сервера>
Далеко не все контейнеры доступны в приложении, а некоторые из доступных — не работают без дополнительных настроек — редактируйте файл на GitHub и присылайте свои Pull Request’ы. Если не знаете как — открывайте Issue. Этим вы поможете развитию проекта.
Другие способы поддержать проект, а так же множество полезной информации — в файле README.