A Morita">">

<aside> 🚨 実行するコマンドがホスト側なのか、コンテナ側なのかよく着目してください。明示的に書いてあるものもありますが、書いていないものもあります。

</aside>

💡が演習の内容です。🍚は、おかわり課題なので 💡演習が早く終わった場合などにやってください。

📦 1. Container Basics

🏃1-1. Warm up

1-1-1. コンテナはプロセスであることを確認しよう

<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 👈 これをみつけよう

1-1-2. Capabilities の実験

<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

📛 1-2. Namespace 編

1-2-1. UTS Isolation

<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

1-2-2. Process Isolation

<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

1-2-3. Mount Isolation

<aside> 💡 Mount namespace と pivot_root を使って rootfs を変更しよう

</aside>