Temat: Docker w OpenWrt
Docker... technologia która od kilku lat podbija świat IT, pozwalająca na uruchamianie różnych serwisów w izolowanych środowiskach, która jednocześnie nie jest emulatorem całego komputera. Trudno napisać w jednym zdaniu czym jest docker, jeżeli ktoś jeszcze nie spotkał się tym tematem (co by było dość dziwne), to polecam google oraz masę poradników np. na YouTube.
W OpenWrt możemy uruchomić bez problemu dockera, tylko musimy pamiętać o spełnieniu kilku wymagań:
- musi być to maszyna x86 lub ARM (to są najpopularniejsze architektury na które dostępne są obrazy, o ile korzystamy z publicznych źródeł i nie tworzymy obrazów samodzielenie)
- musi mieć sporo wolnej przestrzeni dyskowej (naprawdę sporo - kontener wraz z zależnościami może zajmować kilka gigabajtów - wynika to ze sposobu tworzenia kontenerów, ale także jakie obrazy już mamy)
- dość sporo pamięci RAM - ponieważ uruchamiamy wiele procesów.
W praktyce więc możemy od razu odrzucić popularne routery ze 64/128MB ramu, potrzebujemy raczej routera zrobionego z PC lub np. Raspberry PI. Jeżeli będziemy korzystać z publicznego repozytorium to musimy też pamiętać że nie są dostępne obrazy na wszystkie możliwe architektury, najczęściej będzie to x86/64 lub ARM/v7 czy ARM/v8.
Co możemy uruchomić w dokerze? W obecnych czasach praktycznie... wszystko. Od bazy danych do serwera www, od serwisu typu aria2c do nextcluda, od własnego programu w pythonie do hadoop'a czy innych programów w javie. Polecam przejrzenie publicznego repozytorium: https://hub.docker.com/ i poszukanie rzeczy którą potrzebujemy.
Ten poradnik będzie bardzo prosty - skupimy się na instalacji dockera, jego zarządzaniu i uruchomimy przykładowe obrazy. Po więcej informacji zapraszam do odwiedzenia google i setek stron poświęconych temu projektowi. Całość opisana na podstawie OpenWrt 22.03.
Instalacja
opkg update
opkg install docker dockerd
Zarządzać dockerem możemy w linii poleceń (konsoli), jeżeli ktoś używa LuCI to polecam doinstalować odpowiedni pakiet:
opkg install luci-app-dockerman luci-i18n-dockerman-pl
Dzięki czemu można zarządzać dockerem bezpośrednio z luci i nie trzeba instalować aplikacji typu portainer.
Domyślnie docker w openwrt swoje pliki wrzuca do /opt/docker - jest to do zmiany w pliku /etc/config/dockerd lub przez luci. W związku z tym musimy mieć dużo przestrzeni dyskowej (zrobić extroota lub podmontować zewnętrzny dysk). Należy jeszcze trochę podrasować konfigurację:
uci set network.@device[-1].bridge_empty='1'
uci -q del network.docker.auto
uci add firewall forwarding
uci set firewall.@forwarding[-1].src=docker
uci set firewall.@forwarding[-1].dest=lan
uci add firewall forwarding
uci set firewall.@forwarding[-1].dest=docker
uci set firewall.@forwarding[-1].src=lan
uci commit
Restartujemy router i... mamy dockera! Proste...
Zarządzenie
Polecenie docker Twoim przyjacielem
root@OpenWrt:~# docker version
Client:
Version: 20.10.18
API version: 1.41
Go version: go1.18.4
Git commit: b40c2f6
Built: Thu Nov 10 07:37:16 2022
OS/Arch: linux/amd64
Context: default
Experimental: true
Server:
Engine:
Version: 20.10.18
API version: 1.41 (minimum version 1.12)
Go version: go1.18.4
Git commit: e42327a
Built: Tue Nov 8 13:15:51 2022
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.8
GitCommit:
runc:
Version: 1.1.4
GitCommit:
docker-init:
Version: 0.19.0
GitCommit: de40ad0
Jak ktoś lubi konsolę to odnajdzie się bez problemu, jak ktoś woli luci, proszę bardzo:
To tylko przegląd, bo osobno można zarządzać obrazami, woluminami, sieciami itd. Można także dodawać i usuwać obrazy. Do podstawowych rzeczy wystarczy tyle ile mamy dostępne w LuCI.
Obrazy, kontenery i cała reszta
Teraz do rzeczy - uruchamiamy gotowe projekty z repozytorium. Powiedzmy że potrzebujemy np. speedtesta. Odpowiedni obraz jest w repozytorium, można poszukać, przeczytać jak go uruchomić, więc to robimy:
root@OpenWrt:~# docker run --restart=unless-stopped --name openspeedtest -d -p 3000:3000 -p 3001:3001 openspeedtest/latest
Unable to find image 'openspeedtest/latest:latest' locally
latest: Pulling from openspeedtest/latest
213ec9aee27d: Pull complete
c589aa91d168: Pull complete
c1ad9ebac4a7: Pull complete
b8bb7f719704: Pull complete
a22122b8d79a: Pull complete
91492f978c76: Pull complete
66804b4484ed: Pull complete
9d2fd9029ae1: Pull complete
daa32a7f5b00: Pull complete
f3ac76760cdd: Pull complete
ee71529f3c7d: Pull complete
f4cdfc19565a: Pull complete
ab0f5dd6a522: Pull complete
4d522e947bc8: Pull complete
b7aa60f060b4: Pull complete
407c9b680f77: Pull complete
Digest: sha256:2af93b7894443d5759161238b91dabdc08b299543d1d60dbd5b18e07ddbdf897
Status: Downloaded newer image for openspeedtest/latest:latest
6f983b04c63c6e8a951efc5300e9ce4d2501b375c220b3b5c5d2ad5cfbc61d04
[ 1415.302861] docker0: port 2(veth9caeb44) entered blocking state
[ 1415.308124] docker0: port 2(veth9caeb44) entered disabled state
[ 1415.309320] device veth9caeb44 entered promiscuous mode
I tyle. Obrazy pobrane i rozpakowane, kontener został uruchomiony:
root@OpenWrt:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6f983b04c63c openspeedtest/latest "/docker-entrypoint.…" About a minute ago Up 46 seconds 0.0.0.0:3000-3001->3000-3001/tcp, :::3000-3001->3000-3001/tcp, 8080/tcp openspeedtest
Więc teraz otwieramy przeglądarkę, wpisujemy http://192.168.1.1:3000 i mamy własny serwer speedtesta. Proste, prawda?
Inny przykład z forum - ktoś potrzebował nextclouda - własną chmurę do zarządzenia plikami itd. Normalnie trzeba instalować apache, php, konfigurować, dodawać pliki projektu itd. A tak:
root@OpenWrt:~# ddocker run -d -p 8888:80 --restart=unless-stopped -v nextcloud:/opt/docker/nextcloud/var/www/html -v apps://opt/docker/nextcloudvar/www/html/custom_apps -v config:/opt/docker/nextcloud/var/www/html/config -v data:/opt/docker/nextcloud/var/www/html/data nextcloud:latest
Przechodzimy na http://192.168.1.1:8888 i okazuje się że nextcloud już jest, działa, wystarczy skonfigurować i tyle.
Oczywiście docker jest sporo bardziej rozbudowany - sieci, woluminy, zabawa z composerem itd - ale to już zostawiam czytelnikowi. Celem tego poradnika było pokazanie że na OpenWrt też to się da.