Na jednym z przedmiotów jakie mam okazję uczyć w technikum informatycznym przybliżam przyszłym informatykom Linuxa. Do tej pory pracowali oni na wirtualnych maszynach odpalanych w VirtualBoxie. W celu samorozwoju (i nie tylko, ale o tym za chwilę) uruchomiłem serwer, na którym utworzyłem kontenery Dockerowe dla uczniów z systemem Ubuntu. Wykorzystałem tę dystrybucję, ponieważ akurat na niej zdają swój pierwszy egzamin na technika. W tym celu przygotowałem dockerfile, na podstawie którego utworzyłem spersonalizowany pod nich obraz, a następnie utworzyłem skrypty bashowe, do automatycznego tworzenie i kasowania kontenerów.
Jaka z tego korzyść dla techników? Przećwiczą wykorzystanie SSH do zarządzania serwerami (zdalnymi, VPS, dedykami,…) oraz prace z portami.
DockerFile, na podstawie którego został utworzony odpowiedni obraz:
FROM ubuntu:latest
LABEL maintainer=”WOJST”
RUN apt update && apt upgrade -y \
&& yes| unminimize \
&& apt install -y nano ssh \
&& echo 'root:root’ | chpasswd \
&& sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/g’ /etc/ssh/sshd_config \
&& sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/g’ /etc/ssh/sshd_config \
&& sed -i 's/#PermitEmptyPasswords no/PermitEmptyPasswords no/g’ /etc/ssh/sshd_config \
&& apt-get install -y systemd systemd-sysv dbus dbus-user-session
ENTRYPOINT [„/sbin/init”]
Szybka analiza powyższego pliku:
– wykorzystujemy najnowszą wersję Ubuntu
– poleceniem RUN wykonujemy: aktualizacje systemu, wyłączenie minimalnej wersji serwerowej, instalacje edytora plików nano (na którym pracują) oraz ssh. Następnie ustawiamy hasło dla konta root i modyfikujemy plik ssh, aby dopuszczał logowanie bezpośrednio na roota (PRAKTYKOWANE JEDYNIE W ŚRODOWISKU TESTOWYM !). Na samym końcu instalujemy i uruchamiany systemctl, dzięki któremu zarządzają usługami
Po utworzeniu odpowiedniego obrazu nadszedł czas na utworzenie kontenerów. W tym celu został wyrzeźbiony skrypt w bashu create_containers.sh:
#!/bin/bash
for i in {1..30}
do
portssh=$((2000+$i))
porthttp=$((8000+$i))
docker container run –privileged -h 3ti-$i -itd -p $portssh:22 -p $porthttp:80 –name 3ti_$i wojst_technikum /bin/bash
done
Szybka analiza powyższego pliku:
Wykonywana jest zwykła pętla for, która inkrementuje po numerach z dziennika. Wewnątrz niej zdefiniowałem dwie zmienne (numery portów dla SSH oraz WWW) i tworzenie samego kontenera. Każdy kontener jako hostname oraz nazwe samego kontenera przyjmuje 3ti_numer z dziennika, przekierowane ma również dwa porty na te zdefiniowane w zmiennych.
Do szybkiego usuwania (tak, wiem że można przez portainera np. 😉) drugi skrypt remove_containers.sh:
#!/bin/bash
for i in {1..30}
do
docker container rm -f 3ti_$i
done
W tym przypadku chyba nie ma co opowiadać – pętla for na takiej samej zasadzie jak powyżej.
Podczas wdrażania tego rozwiązania pojawił się problem przedstawiony na poniższym zrzucie. Spowodowany był jednoczesnym uruchomieniem 30 kontenerów. W celu rozwiązania go konieczne było zmodyfikowanie parametru kernela poleceniem: sysctl -w fs.inotify.max_user_instances=8192 >> /etc/sysctl.conf
Pierwszym testem kontenerów była instalacja WordPressa, o której wspomniałem w innym wpisie.
Kolejnym krokiem będzie kontynuacja nauki Ansible 😉