
Introduction
Cette page contient les expériences utilisées dans le Construire des conteneurs à partir de zéro épisode.
Cet épisode fait partie de la série Linux Namespace.
La liste complète des épisodes peut être trouvée ici :
- Épisode 1 : Introduction aux espaces de noms Linux
- Épisode 2 : Espace de noms de montage
- Épisode 3 : Espace de noms PID
- Épisode 4 : Espace de noms réseau
- Épisode 5 : Espace de noms IPC
- Épisode 6 : Espace de noms UTS
- Épisode 7 : Espace de noms Cgroups
- Épisode 8 : Espace de noms utilisateur
- Épisode 9 : Créer un conteneur à partir de zéro (actuel)
Expérience
Terminal 1 - utilisateur root
Terminal 2 - utilisateur
Terminal 3 - utilisateur
Allez au Terminal 1
// Set up the bridge network for later
root@evermight:~# ip link add name br0 type bridge;
root@evermight:~# ip addr add 172.16.2.11/24 brd + dev br0;
root@evermight:~# ip link set br0 up;
root@evermight:~# iptables -A FORWARD -i br0 -j ACCEPT;
root@evermight:~# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1
root@evermight:~# iptables -t nat -A POSTROUTING -s 172.16.2.0/24 -j MASQUERADE
Conteneur 1
Allez au Terminal 2
////
//// Download alpine for later
evermight@evermight:~$ wget http://dl-cdn.alpinelinux.org/alpine/v3.10/releases/x86_64/alpine-minirootfs-3.10.1-x86_64.tar.gz
2025-02-14 21:38:11 (17.1 MB/s) - ‘alpine-minirootfs-3.10.1-x86_64.tar.gz’ saved [2711400/2711400]
evermight@evermight:~$ mkdir alpine;
evermight@evermight:~$ tar -xzf alpine-minirootfs-3.10.1-x86_64.tar.gz -C alpine;
////
//// Create user namespace
evermight@evermight:~$ id
uid=1000(evermight) gid=1000(evermight) groups=1000(evermight),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),110(lxd)
evermight@evermight:~$ unshare -U -r /bin/bash
nobody@evermight:~$ id
uid=0(root) gid=0(root)
////
//// Create uts namespace to change hostname
nobody@evermight:~$ unshare --uts /bin/bash
root@evermight:~# hostname container1
////
//// Create remaining namespaces
root@evermight:~# unshare --pid --fork --mount-proc --net --ipc --cgroup /bin/bash
root@container1:~# sleep 20
Allez au Terminal 1
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 20
////
//// Set up virtual ethernet pairs
root@evermight:~# ip link add veth0 type veth peer name ceth0
root@evermight:~# ip link set ceth0 netns /proc/1242/ns/net;
root@evermight:~# ip link set veth0 up;
root@evermight:~# ip link set veth0 master br0;
////
//// Apply 50% CPU max cgroups rule
root@localhost:~# mkdir /sys/fs/cgroup/container_cpu
root@localhost:~# echo +cpu > /sys/fs/cgroup/cgroup.subtree_control # if /sys/fs/cgroup/container_cpu/cpu.max doesn't exist
root@localhost:~# echo '50000 100000' | sudo tee /sys/fs/cgroup/container_cpu/cpu.max
50000 100000
root@localhost:~# echo 1242 | sudo tee /sys/fs/cgroup/container_cpu/cgroup.procs
Allez au Terminal 2
////
//// Set up virtual ethernet pairs
root@container1:~# ip link set lo up
root@container1:~# ip link set ceth0 up
root@container1:~# ip addr add 172.16.2.20/24 dev ceth0
root@container1:~# ip route add default via 172.16.2.11
////
//// Set up file system isolation
root@container1:~# mount --bind alpine alpine
root@container1:~# cd alpine
root@container1:~/alpine# mkdir root_fs
root@container1:~/alpine# pivot_root . root_fs
root@container1:~/alpine# umount -l root_fs
root@container1:~/alpine# cd /
Expériences pour le conteneur 1 :
//// Terminal 2 with internet access
Terminal 2: ping 8.8.8.8
Terminal 1: tcpdump -i veth0 # confirm traffic
Terminal 1: tcpdump -i eth0 # no traffic from namespace
////
////
root@container1:/# echo 'Hello from container 1' > /hello.txt # make sure it is not the parent's /hello.txt
////
////
root@container1:/# yes > /dev/null
Conteneur 2
Les mêmes étapes que le conteneur 1
Allez au Terminal 3
////
//// Make a new copy of alpine and clean up
evermight@evermight:~$ ls alpine
bin etc home media opt root run srv tmp var
dev hello.txt lib mnt proc root_fs sbin sys usr
evermight@evermight:~$ mkdir alpine2
evermight@evermight:~$ cp -r alpine/* alpine2/
evermight@evermight:~$ cd alpine2/
evermight@evermight:~/alpine2$ rm hello.txt
evermight@evermight:~/alpine2$ rmdir root_fs
evermight@evermight:~/alpine2$ cd ..
////
//// Make user namespace
evermight@evermight:~$ unshare -U -r /bin/bash
nobody@evermight:~$ id
uid=0(root) gid=0(root)
nobody@evermight:~$ unshare --uts /bin/bash
root@evermight:~# hostname container5
root@evermight:~# unshare --pid --fork --mount-proc --net --ipc --cgroup /bin/bash
root@container2:~# sleep 25
Allez au Terminal 1
root@evermight:~# ps auxf
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1304 0.0 0.1 17184 11064 ? Ss 21:46 0:00 \_ sshd: evermight [priv]
evermig+ 1361 0.1 0.1 17316 8144 ? S 21:46 0:00 \_ sshd: evermight@pts/3
evermig+ 1362 0.0 0.0 8992 5780 pts/3 Ss 21:46 0:00 \_ -bash
evermig+ 1396 0.0 0.0 8792 5492 pts/3 S 21:47 0:00 \_ /bin/bash
evermig+ 1410 0.0 0.0 8792 5572 pts/3 S 21:48 0:00 \_ /bin/bash
evermig+ 1417 0.0 0.0 5772 956 pts/3 S 21:48 0:00 \_ unshare --pid --fork --mount-proc --
evermig+ 1418 0.0 0.0 8792 5548 pts/3 S 21:48 0:00 \_ /bin/bash
evermig+ 1425 0.0 0.0 5772 1008 pts/3 S+ 21:48 0:00 \_ sleep 25
////
//// Set up virtual ethernet pairs
root@evermight:~# ip link add veth1 type veth peer name ceth1
root@evermight:~# ip link set ceth1 netns /proc/1418/ns/net;
root@evermight:~# ip link set veth1 up;
root@evermight:~# ip link set veth1 master br0;
////
//// Apply 50% cpu max rule
root@localhost:~# echo 1418 | sudo tee /sys/fs/cgroup/container_cpu/cgroup.procs
Allez au Terminal 3
////
//// Set up virtual ethernet pairs
root@container2:~# ip link set lo up;
root@container2:~# ip link set ceth1 up;
root@container2:~# ip addr add 172.16.2.21/24 dev ceth1
root@container2:~# ip route add default via 172.16.2.11
////
//// Set up file system isolation
root@container2:~# mount --bind alpine2 alpine2
root@container2:~# cd alpine2
root@container2:~/alpine2# mkdir root_fs
root@container2:~/alpine2# pivot_root . root_fs
root@container2:~/alpine2# umount -l root_fs
root@container2:~/alpine2# cd /
Expériences pour le conteneur 2 :
//// Terminal 3 with internet access
Terminal 3: ping 8.8.8.8
Terminal 1: tcpdump -i veth1 # confirm traffic
Terminal 1: tcpdump -i veth0 # no traffic from namespace
Terminal 1: tcpdump -i eth0 # no traffic from namespace
////
////
root@container2:/# echo 'Hello from container 2' > /hello.txt # make sure it is not the parent's /hello.txt
////
////
root@container2:/# yes > /dev/null