
Introduction
Ceci fait suite à Construire un conteneur à partir de zéro.
Cette fois, nous allons réellement charger un site Web PHP à l'intérieur du conteneur.
Partie 2 :Pas de Docker ? Pas de problème ! Partie 2 : Application multiniveau est disponible pour notre membres payants.
Expérience
Terminal 1 - utilisateur root
Terminal 2 - utilisateur
REMARQUE : apparmor-restrict-unprivileged-users
Pour Terminal 2, versions récentes d'Ubuntu (24.xx et plus ?) introduites kernel.apparmor_restrict_unprivileged_userns
qui empêche les utilisateurs non privilégiés de créer des espaces de noms :noté ici. Vous pouvez soit :
a) Utilisez plutôt un utilisateur root pour le Terminal 2
OU
b) Exécutez cette commande pour désactiver temporairement la fonctionnalité :sysctl -w kernel.apparmor_restrict_unprivileged_userns=0
. Ou vous pouvez faire ceci pour le faire persister au redémarrage (NON RECOMMANDÉ POUR DES RAISONS DE SÉCURITÉ)
tee /etc/sysctl.d/99-unpriv-userns.conf <<EOF
kernel.apparmor_restrict_unprivileged_userns=0
EOF
sysctl --system
Vous pouvez voir tous les autres paramètres du noyau en faisant :
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
Allez au Terminal 1
Configurer le réseau de pont pour plus tard :
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
Configurer les cgroups :
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
Conteneur 1
Allez au Terminal 2
Télécharger 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;
Configurer les espaces de noms :
unshare -U -r /bin/bash
unshare --uts /bin/bash
hostname container1
unshare --pid --fork --mount-proc --ipc --net --cgroup /bin/bash
tail -F pizza
Allez au Terminal 1
Trouvez le PID, dans ce cas ce sera 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
Configurer le réseau de conteneurs :
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
Allez au Terminal 2
Prison complète du réseau et du système de fichiers :
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 /
Mettre à jour l'hôte pour pouvoir accéder aux CDN alpins, remplacer 1.1.1.1
avec tout ce qui est donné par nslookup dl-cdn.alpinelinux.org
:
echo '1.1.1.1 dl-cdn.alpinelinux.org' >> /etc/hosts
Téléchargez et diffusez un site Web PHP :
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
Allez au Terminal 1
curl http://172.16.2.20
Configure iptables
pour NAT afin que le conteneur soit accessible au public :
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
Visitez maintenant votre http://your-server-ip
.