Настройка Docker на QNAP TS-231P2

Приветствую тебя, уважаемый читатель!

Поздравляю с покупкой этого замечательного NAS, неплохая альтернатива D-Link в примерно той же ценовой категории.

С данным девайсом мне посчастливилось познакомиться благодаря одному моему хорошему товарищу, приспичило ему упростить доступ к файлам из разных операционок (linux/windows/mac), ну чтож сказал тогда я, идея хорошая, но распрашивать дальше не стал. Некоторое время приходит мне сообщение типа "не получается настроить докер, можешь глянуть?", я как большой любитель всяких нестандартных железок с радостью согласился.

И так, давайте начинать с начала, из плюсов:

  • Возможность установить 2 полноразмерных жестких диска
  • 4х ядерный процессор AL314 ARM Cortex-A15 CPU @ 1.70GHz
  • Наличие 2x гигабитных Ethernet портов
  • 3x USB порта, 1 - спереди, 2 - сзади
  • Почти полноценный Linux inside (почти - потому что это не попсовый Debian или например CentOS, а самодельный QTS 4.3, благодаря busybox очень напоминающий OpenWRT)
  • Веб-интерфейс - ну тут на самом деле очень на любителя, лично я предпочитаю делать всё через консоль (по ssh есссно), однако, без веб-морды почти нереально управлять установленным софтом

Из недостатков:

  • Немного неадекватная система управления софтом - есть консольная версия qpkg_cli но она работает очень странно и иногда сегфолтится
  • Нельзя установить Midnight Commander - в репозиториях его нет, в теории можно скачать портабельную версию под ARM процессоры, но не факт что будет работать
  • Много чего невозможно настроить через веб-интерфейс, точнее можно настроить лишь то что предусмотренно разработчиком приложения
  • Архитектура процессора - ARM, на мой взгляд устройство такого типа должно иметь на борту какой-нибудь Intel Atom например или AMD Zen, чтобы можно было установить нормальную операционку, а не огрызок под названием QTS, отсюда кстати и следующий недостаток
  • Vendor lock - то есть зашить какой-нибудь Debian или FreeNAS (который к слову обладает гораздо большими возможностями) у вас скорее всего не получится

Если вас интересуют подробные технически характеристики сего девайса, то вот ссылочка.

В процессе изучения начинки выяснилось, что операционка не видит установленные 8Гб оперативной памяти, утилита free показала что в системе доступно всего 32мб оперативной памяти, тогда я подумал что с Docker могут возникнуть проблемы, но к счастью Docker демон увидел всю память, вероятно это какой-то глюк.

Давайте ставить Docker!

Установка Container Station

Я без понятия почему спецы из QNAS обозвали Docker не иначе как Container Station, возможно изначально планировалась поддержка других систем контейнеризации, например Rocker или Vagrant (который к слову не простой контейнер, а полноценная виртуальная машина).

Идём в “App Center” > “QTS Essentials”, там находим "Container Station", затем жмём “Add To QTS”. Операционка сама запустит загрузку необходимых утилит среди которых будет Docker и Docker-Compose, так что больше ни о чём беспокоиться не нужно.

Далее логинимся к девайсу через SSH, на винде я обычно использую Putty, а в нормальных операционках уже есть встроенный SSH клиент.

Настройка Docker для работы через командную строку

Увы и ах, "из коробки" Docker на данном чудо девайсе не работает, нужно немного "подшаманить" переменные окружения, для этого добавим в файл /etc/profile (йоу?) пару строк:

cat << EOL >> /etc/profile
export PATH=/share/CACHEDEV1_DATA/.qpkg/container-station/bin:$PATH
export DOCKER_HOST=unix:///var/run/system-docker.sock
EOL

Перелогиниваемся через SSH и вуаля, стали доступны команды типа docker, docker-compose, можно кстати не перелогиниваться, а просто выполнить чтение конфигурации из файла:

source /etc/profile

Теперь давайте поподробнее, что эти переменные окружения означают:

  • DOCKER_HOST - Полный путь к сокету через который утилита docker будет будет взаимодействовать с Docker демоном
  • PATH - Полный путь к директории в которой находятся исполняемые утилиты для работы с Docker, а так же сам демон

Так как QTS это огрызок полноценного Linux дистрибутива, то и реализованные в нём решения по управлению приложениями имеют промежуточное состояние между "собери сам" и "традиционный установочный пакет". Иными словами, если в нормальном дистрибутиве пакеты распаковываются в системные пути типа /usr, /usr/local или например /opt в этой поделке всё сваливается в директорию /share/CACHEDEV1_DATA/.qpkg.

Без понятия почему разработчики реализовали это именно ТАК, наверно захотелось сделать "не как у всех" или "максимально несовместимо", чтобы мешать пользователям (и другим разработчикам) свободно менять платформу и не зависить от производителя (vendor lock, ага).

Проверим работоспособность

Обычно я проверяю работоспособность Docker при помощи:

docker info

В ответ данная команда должна выдать примерно следующее:

Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 17.09.1-ce
Storage Driver: overlay2
 Backing Filesystem: extfs
 Supports d_type: true
 Native Overlay Diff: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 06b9cb35161009dcb7123345749fef02f7cea8e0
runc version: 3f2f8b84a77f73d38244dd690525642a72156c64
init version: 949e6fa
Security Options:
 seccomp
  Profile: default
Kernel Version: 4.2.8
Operating System: QTS 4.3.5 (20180914)
OSType: linux
Architecture: armv7l
CPUs: 4
Total Memory: 7.908GiB
Name: xxx
ID: xxx
Docker Root Dir: /share/CACHEDEV1_DATA/.qpkg/container-station/system-docker
Debug Mode (client): false
Debug Mode (server): true
 File Descriptors: 19
 Goroutines: 29
 System Time: 2018-09-23T01:20:00.7914074+02:00
 EventsListeners: 1
Registry: https://index.docker.io/v1/
Experimental: false
Insecure Registries:
 127.0.0.0/8
Live Restore Enabled: false

WARNING: No kernel memory limit support

Всё пояснять не буду, остановимся на главном:

  • Server Version: 17.09.1-ce - Это версия установленного Docker сервера
  • Total Memory: 7.908GiB - Вся видимая демоном оперативка
  • Docker Root Dir: /share/CACHEDEV1_DATA/.qpkg/container-station/system-docker - Полный путь к директории в которую буду распоковываться образы, а так же храниться оверлеи

Важно: На ARM процессоре получится использовать контейнеры которые собраны специально под эту архитектуру, любые другие скорее всего работать не будут.

Как пользоваться

Прежде чем начать рекомендую обратить внимание на данный список репозиториев, это проект был создан специально для тех кто хочет использовать Docker на железках с ARM процессором (спойлер: по умолчанию контейнеры Docker собираются под amd64 системы).

Давайте теперь проверим работоспособность на каком-нибудь реальном примере, для этого предлагаю создать фай docker-compose.yml со следующим содержимым:

version: '3.4'

services:

  db:
    image: hypriot/rpi-mysql
    command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
    restart: unless-stopped
    ports:
      - 127.0.0.1:3306:3306
    volumes:
      - /share/CACHEDEV1_DATA/Docker-Volumes/nextcloud/mariadb:/var/lib/mysql
    env_file:
      - db.env

  app:  
    image: arm32v7/nextcloud:apache
    restart: unless-stopped
    volumes:
      - /share/CACHEDEV1_DATA/Docker-Volumes/nextcloud/data:/var/www/html/data
    environment:
      - MYSQL_HOST=db
    env_file:
      - db.env

  nginx:
    image: arm32v7/nginx
    ports:
      - 8888:80
    restart: unless-stopped

Сохраняем, далее запускаем контейнеры:

docker-compose up -d

Некоторое время пошуршав контейнеры запускаются и вы теперь можете подключиться к 8888-му порту на ваше NAS, там будет дефолтное сообщение от NGINX, вероятно вам портебуется настроит его, но это уже совсем другая история...

Послесловие

Как видно из статьи сложности возникли только в одном месте, а именно в настройке переменных окружения, всё остальное конфигурится примерно так же как и на любом другом сервере (с поправкой на ARM конечно же).

А на этом всё, напомню что в Discord есть сообщество программистов, в котором я принимаю активное участие, поэтому если у вас возникнут вопросы, обращайтесь, не стесняйтесь, ну или в Twitter @EvilFreelancer например.

Удачной настройки, котаны 😉