В прошлой публикации я рассказал как 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://<адрес сервера>
P.S.
Далеко не все контейнеры доступны в приложении, а некоторые из доступных — не работают без дополнительных настроек — редактируйте файл на GitHub и присылайте свои Pull Request'ы. Если не знаете как — открывайте Issue. Этим вы поможете развитию проекта.
Другие способы поддержать проект, а так же множество полезной информации — в файле README.
stripe
А вас не смущает что Ubuntu 18.04 не всписке официально поддерживающихся doсker дестрибутивов?
docs.docker.com/install/linux/docker-ce/ubuntu
delfer Автор
Не смущает)

Могу предположить, что документацию еще не обновили, так как Ubuntu 18.04 LTS (Bionic Beaver) поддерживается официальным скриптом установки Docker.
Однако, тот же скрипт (на момент публикации) поддерживает и Debian 7 (Wheeze), хотя «из коробки» у него ядро 3.2.0, тогда когда Docker требует ядро не старше 3.10. Исправить обещали 31 мая.
Совместимость с каждой доступной на DigitalOcean операционной системой была непосредственно протестирована
(таблица из README)
А если углубиться в теорию, то Docker вполне хорошо работает на любом Linux с ядром 3.10 или новее, cgroups и iptables. Запускал его даже на Astra Linux Special Edition 1.5 и Windows Subsystem for Linux (только старую версию Docker, которая не требовала iptables и cgroup). Могут быть небольшие проблемы с сетью (на Windows приходилось использовать --net=host) или хранилищем (в Centos «из коробки» будет глючный loop-lvm вместо нормального overlay2). На Ubuntu 18.04 — все прекрасно.
stripe
Intersting… Я буквально с неделю назад пытался ставить как раз на Ubuntu 18.04 по инструкции указанной выше — и для того чтобы заставить docker установитья нужно было подключать репозиторий 'edge' — т.е версия еще не stable.
Ну и недавно была статья где человек из финансового сектора пугал ужасами docker…