<aside> 🚨 実行するコマンドがホスト側なのか、コンテナ側なのかよく着目してください。明示的に書いてあるものもありますが、書いていないものもあります。
</aside>
💡が演習の内容です。🍚は、おかわり課題なので 💡演習が早く終わった場合などにやってください。
<aside> 💡 コンテナで実行した sleep コマンドはどのようなプロセスツリーになっていますか?
</aside>
$ docker run --rm -it ubuntu:latest sh
container# sleep 100
$ ps auxf
...
/usr/bin/containerd
\\_ containerd-shim -namespace moby -workdir /var/lib/containerd/io.containerd.runtime.v1.linux/moby/8c9e9014b37131248e4fd927f74b61ff88efdcfdfe4fc9e79e3b3ac2c98bb332 -address /run/containerd/containerd.sock -containerd-binary /usr/bin/containerd -runtime-root /var/run/docker/runtime-runc
\\_ sh
\\_ sleep 100 👈 これをみつけよう
<aside>
💡 --cap-drop net_raw
の場合の bash の capability の違いを見つけよう。また、ping が実行できないことを確認しよう
</aside>
$ docker run --rm -it ubuntu:latest bash
root@4e89e243ccee:/# apt-get -qq update ; apt-get -qq -y install iputils-ping
root@4e89e243ccee:/# ps
root@4e89e243ccee:/# getpcaps 1
1: = cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap+eip
root@4e89e243ccee:/# ping -c 1 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=113 time=17.9 ms
$ docker run --cap-drop net_raw --rm -it ubuntu:latest bash
root@31bb88ca04f8:/# apt-get -qq update ; apt-get -qq -y install iputils-ping
root@31bb88ca04f8:/# ps
root@31bb88ca04f8:/# getpcaps 1
1: = cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap+eiproot@31bb88ca04f8:/# ping 8.8.8.8
root@4e89e243ccee:/# ping 8.8.8.8
bash: /usr/bin/ping: Operation not permitted
<aside> 💡 UTS namespace を分離して名前空間内とホストで異なるホスト名を設定できることを確認しよう
</aside>
$ docker run --rm -it ubuntu:latest sh
/ # hostname
4f5078fcfc49
$ sudo unshare --uts sh
# hostname
sandbox
# hostname this-is-container
# hostname
this-is-container
# exit
$ hostname
sandbox
<aside> 💡 PID namespace と chroot を使って名前空間内からホストのプロセスが見えないことを確認しよう
</aside>
$ mkdir alpine/
$ cd alpine/
alpine$ wget <http://dl-cdn.alpinelinux.org/alpine/v3.12/releases/x86_64/alpine-minirootfs-3.12.1-x86_64.tar.gz>
alpine$ tar xvf alpine-minirootfs-3.12.1-x86_64.tar.gz
alpine$ rm alpine-minirootfs-3.12.1-x86_64.tar.gz
alpine$ cd ../
$ sudo unshare --pid --fork chroot alpine sh
/ # mount -t proc proc /proc
/ # ps aux
PID USER TIME COMMAND
1 root 0:00 sh
4 root 0:00 ps aux
<aside> 💡 Mount namespace と pivot_root を使って rootfs を変更しよう
</aside>