Kein Docker, kein Problem: Teil 1 – PHP-Website

Veröffentlicht am 10.06.2025

« Alle Vorträge ansehen Kontaktieren Sie uns
No Docker, No Problem: Part 1 - PHP Website

Einführung

Dies ist eine Fortsetzung von Erstellen Sie einen Container von Grund auf.

Dieses Mal laden wir tatsächlich eine PHP-Website in den Container.

Teil 2:Kein Docker? Kein Problem! Teil 2 – N-Tiered Application steht zur Verfügung für unsere zahlende Mitglieder.

Experiment

Terminal 1 - Root-Benutzer

Terminal 2 - Benutzer

HINWEIS: apparmor-restrict-unprivileged-userns

Für Terminal 2, aktuelle Versionen von Ubuntu (24.xx und höher?) eingeführt kernel.apparmor_restrict_unprivileged_userns wodurch nicht privilegierte Benutzer daran gehindert werden, Namespaces zu erstellen:hier vermerkt. Sie können entweder:

a) Verwenden Sie stattdessen einen Root-Benutzer für Terminal 2

ODER

b) Führen Sie diesen Befehl aus, um die Funktion vorübergehend zu deaktivieren:sysctl -w kernel.apparmor_restrict_unprivileged_userns=0. Oder Sie können dies tun, damit es beim Neustart bestehen bleibt (AUS SICHERHEITSGRÜNDEN NICHT EMPFOHLEN)

tee /etc/sysctl.d/99-unpriv-userns.conf <<EOF kernel.apparmor_restrict_unprivileged_userns=0 EOF sysctl --system

Sie können alle anderen Kernelparameter anzeigen, indem Sie Folgendes tun:

ls /proc/sys/kernel/ # lists all kernel parameters cat /proc/sys/kernel/{filename} # shows 1 for enabled or 0 for not enabled sysctl --all # lists ALL system parameters sysctl --all | grep kernel. # lists props in /proc/sys/kernel

Gehen Sie zum Terminal 1

Bridge-Netzwerk für später einrichten:

ip link add name br0 type bridge; ip addr add 172.16.2.11/24 brd + dev br0; ip link set br0 up; iptables -A FORWARD -i br0 -j ACCEPT; sysctl -w net.ipv4.ip_forward=1 iptables -t nat -A POSTROUTING -s 172.16.2.0/24 -j MASQUERADE

Richten Sie Kontrollgruppen ein:

mkdir /sys/fs/cgroup/container_cpu echo +cpu > /sys/fs/cgroup/cgroup.subtree_control echo '50000 100000' | sudo tee /sys/fs/cgroup/container_cpu/cpu.max

Behälter 1

Gehen Sie zu Terminal 2

Download alpin:

mkdir c1; cd c1; wget http://dl-cdn.alpinelinux.org/alpine/v3.19/releases/x86_64/alpine-minirootfs-3.19.1-x86_64.tar.gz; mkdir alpine; tar -xzf alpine-minirootfs-3.19.1-x86_64.tar.gz -C alpine;

Namespaces konfigurieren:

unshare -U -r /bin/bash unshare --uts /bin/bash hostname container1 unshare --pid --fork --mount-proc --ipc --net --cgroup /bin/bash tail -F pizza

Gehen Sie zum Terminal 1

Suchen Sie die PID, in diesem Fall ist es 1242:

root@evermight:~# ps auxf USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 939 0.0 0.1 17180 10788 ? Ss 21:34 0:00 \_ sshd: evermight [priv] evermig+ 1045 0.1 0.0 17312 8060 ? S 21:35 0:00 | \_ sshd: evermight@pts/0 evermig+ 1046 0.0 0.0 8868 5816 pts/0 Ss 21:35 0:00 | \_ -bash evermig+ 1164 0.0 0.0 8792 5524 pts/0 S 21:38 0:00 | \_ /bin/bash evermig+ 1184 0.0 0.0 8792 5512 pts/0 S 21:39 0:00 | \_ /bin/bash evermig+ 1241 0.0 0.0 5772 992 pts/0 S 21:39 0:00 | \_ unshare --pid --fork --mount-proc -- evermig+ 1242 0.0 0.0 8792 5584 pts/0 S 21:39 0:00 | \_ /bin/bash evermig+ 1281 0.0 0.0 5772 1012 pts/0 S+ 21:41 0:00 | \_ sleep tail -F pizza

Containernetzwerk konfigurieren:

pid=1242 ip link add veth0 type veth peer name ceth0 ip link set ceth0 netns /proc/$pid/ns/net; ip link set veth0 up; ip link set veth0 master br0; echo $pid | sudo tee /sys/fs/cgroup/container_cpu/cgroup.procs

Gehen Sie zu Terminal 2

Komplettes Netzwerk- und Dateisystem-Jail:

cip='172.16.2.20/24' ip link set lo up ip link set ceth0 up ip addr add $cip dev ceth0 ip route add default via 172.16.2.11 mount --bind alpine alpine cd alpine mkdir root_fs pivot_root . root_fs umount -l root_fs cd /

Aktualisieren Sie den Host, damit Sie alpine CDNs erreichen können, ersetzen Sie 1.1.1.1 mit allem, was gegeben ist durch nslookup dl-cdn.alpinelinux.org:

echo '1.1.1.1 dl-cdn.alpinelinux.org' >> /etc/hosts

Laden Sie eine PHP-Website herunter und stellen Sie sie bereit:

apk update apk add php curl echo '<?php echo "<h1>It is currently <span style=\"color: red;\">".date("Y-m-d H:i:s")."</span></h1>"; ' > index.php php -S 0.0.0.0:80 & curl http://localhost

Gehen Sie zum Terminal 1

curl http://172.16.2.20

Konfigurieren iptables für NAT, damit der Container öffentlich zugänglich ist:

iptables -A FORWARD -p tcp -d 172.16.2.20 --dport 80 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 80 -j DNAT --to-destination 172.16.2.20:80

Besuchen Sie jetzt Ihre http://your-server-ip.