Slide 1

Slide 1 text

ίϯςφ IBUFOBJOUFSO 

Slide 2

Slide 2 text

! Docker Docker Docker 

Slide 3

Slide 3 text

ؤ٤طػזי⛰ 

Slide 4

Slide 4 text

ؤ٤طػעꣴꦕ׈׿גوٞجت : ؤ٤طػꣴꦕ׈׿גوٞجتךעםַ 

Slide 5

Slide 5 text

ؤ٤طػْؕ٭ةמ׌׬י⻠ױ׿יַ׾ ˝ ؤ٭غ ˝ 㲔车ٓةٖ٭ٜ ˝ ٚ٤ذّؕ ˝ ❣㰆قشآ٭ة ˝ אס☽מبتطّ؛هةؘؠعֿ䑒釐כ׌׾ֵ׼׹׾نٜؒؕ 

Slide 6

Slide 6 text

企ׂי⺎䯈䓪ֵֿזי鬭ַ 擻杼ُب٤٬♞䘶ُب٤כ奂׬י ˝ 颯Ⳃ٬⢥塛ֿ企ַ ˝ ⺎䯈䓪ֵֿ׾ ˝ تآ٭ٚلٛطؔ ˝ ♞䘶ُب٤כ奂׬י⮵榫׌׾鞲嶎ֿ㵼םׂי鬭ַ 

Slide 7

Slide 7 text

ؤ٤طػ䤗软ע佅־׼ֵ׾ 2000 FreeBSD jails 2008 LXC (Linux Containers) 2013 Docker 2019 Podman 

Slide 8

Slide 8 text

ؤ٤طػ؅㲔杯׌׾䤗软 

Slide 9

Slide 9 text

ٛخ٭ت؅ꣴꦕ׌׾☼磝ײ ٛخ٭تסꣴꦕ ؤ٤طػ┕ךⳂׂوٞجتֿյٌتع┕ס☽סوٞجتמ㵚׊י 䏅ꮶ؅┙ֻםַ׆כ Namespace seccomp, AppArmor, SELinux 

Slide 10

Slide 10 text

Namespace Namespace User, Cgroup, IPC, Network, Mount, PID, Time, UTS 

Slide 11

Slide 11 text

Namespace PID ID pid ubuntu@utm:~$ ps PID TTY TIME CMD 1889 pts/0 00:00:00 bash 2711 pts/0 00:00:00 ps ubuntu@utm:~$ sudo unshare !"fork !"pid !"mount-proc ps PID TTY TIME CMD 1 pts/0 00:00:00 ps 

Slide 12

Slide 12 text

Namespace User UID/GID NameSpace UID root 

Slide 13

Slide 13 text

Namespace Time uptime: 

Slide 14

Slide 14 text

Namespace Network IP IP 

Slide 15

Slide 15 text

Namespace Mount chroot pivot_root 

Slide 16

Slide 16 text

Namespace > Mount chroot chroot pivot_root : / 

Slide 17

Slide 17 text

Namespace Cgroup CPU docker top 

Slide 18

Slide 18 text

آ٭قلٛطؔ root OS docker (!"cap-add) (!"cap-drop) pscap 

Slide 19

Slide 19 text

آ٭قلٛطؔ Linux manual capabilities ❆ CAP_SYS_BOOT CAP_SYS_CHROOT CAP_KILL 

Slide 20

Slide 20 text

seccomp strict read, write, _exit, sigreturn lter bpf Docker perf_event_open, pivot_root, process_vm_readv, process_vm_writev, ptrace 

Slide 21

Slide 21 text

seccomp ❆ seccomp.json { "defaultAction": "SCMP_ACT_ALLOW", "syscalls": [ { "name": "kill", "action": "SCMP_ACT_ERRNO" } ] } Docker noy72@noy72 $ docker run !"name ubuntu_bash \ !"rm -it !"security-opt seccomp=seccomp.json ubuntu bash root@f9d4b6ac2a8a:/# sleep 100 & [1] 10 root@f9d4b6ac2a8a:/# kill 10 bash: kill: (10) - Operation not permitted 

Slide 22

Slide 22 text

ؤ٤طػס斻玮䓪 1 OS 㱦⪒䓪 ⺎䯈䓪 

Slide 23

Slide 23 text

ؤ٤طػסج؞ٖٛطؔ㱦⪒䓪 Container Breakout root seccomp Docker Rootless gVisor Kata Containers 

Slide 24

Slide 24 text

Docker 

Slide 25

Slide 25 text

Docker Docker Docker םלֿך׀׾وٚشعنؚ٭ّ 

Slide 26

Slide 26 text

Docker 

Slide 27

Slide 27 text

Docker CLI Docker command line https://docs.docker.com/compose/completion/ 

Slide 28

Slide 28 text

Docker CLI ˝ ٝةتعٛ־׼ْؕ٭ة؅رؗ٤ٞ٭غ $ docker pull ˝ 二גמؤ٤طػ؅㲔车׌׾ $ docker run !"rm -ti ˝ 颯Ⳃ׊יַ׾ؤ٤طػ⫂ךؤُ٤غ؅㲔车׌׾ $ docker exec -ti 

Slide 29

Slide 29 text

Docker CLI ˝ ⛼䡗յ⹦䐂׊גْؕ٭ة؅澬鏀׌׾ $ docker images ˝ ⛼䡗׊גؤ٤طػ؅澬鏀׌׾ $ docker container ls -a $ docker ps -a ˝ ؤ٤طػ⫂סنٜؒؕ؅ٌتعמؤم٭ $ docker cp 

Slide 30

Slide 30 text

Docker 

Slide 31

Slide 31 text

Docker Docker le DockerHub 

Slide 32

Slide 32 text

Docker le # syntax = docker/dockerfile:experimental FROM golang:1.18-alpine AS builder RUN apk !"update add make WORKDIR /services/blog COPY go.mod go.sum ./ RUN go mod download COPY . . RUN !"mount=type=cache,target=/root/.cache/go-build \ make build FROM alpine COPY !"from=builder /services/blog/bin/server \ /services/blog/bin/server RUN adduser -D -u 1000 app USER 1000 ENTRYPOINT ["/services/blog/bin/server"] ⶡ硾םط؞تعي٭تס تؠٛوعنٜؒؕ Docker docker build ךْؕ٭ة؅لٜغ 

Slide 33

Slide 33 text

Docker le - FROM # syntax = docker/dockerfile:experimental FROM golang:1.18-alpine AS builder RUN apk !"update add make WORKDIR /services/blog COPY go.mod go.sum ./ RUN go mod download COPY . . RUN !"mount=type=cache,target=/root/.cache/go-build \ make build FROM alpine COPY !"from=builder /services/blog/bin/server \ /services/blog/bin/server RUN adduser -D -u 1000 app USER 1000 ENTRYPOINT ["/services/blog/bin/server"] Docker le FROM AS 

Slide 34

Slide 34 text

Docker le - RUN # syntax = docker/dockerfile:experimental FROM golang:1.18-alpine AS builder RUN apk !"update add make WORKDIR /services/blog COPY go.mod go.sum ./ RUN go mod download COPY . . RUN !"mount=type=cache,target=/root/.cache/go-build \ make build FROM alpine COPY !"from=builder /services/blog/bin/server \ /services/blog/bin/server RUN adduser -D -u 1000 app USER 1000 ENTRYPOINT ["/services/blog/bin/server"] !"mount 

Slide 35

Slide 35 text

Docker le - COPY # syntax = docker/dockerfile:experimental FROM golang:1.18-alpine AS builder RUN apk !"update add make WORKDIR /services/blog COPY go.mod go.sum ./ RUN go mod download COPY . . RUN !"mount=type=cache,target=/root/.cache/go-build \ make build FROM alpine COPY !"from=builder /services/blog/bin/server \ /services/blog/bin/server RUN adduser -D -u 1000 app USER 1000 ENTRYPOINT ["/services/blog/bin/server"] !"from 

Slide 36

Slide 36 text

Docker le - USER # syntax = docker/dockerfile:experimental FROM golang:1.18-alpine AS builder RUN apk !"update add make WORKDIR /services/blog COPY go.mod go.sum ./ RUN go mod download COPY . . RUN !"mount=type=cache,target=/root/.cache/go-build \ make build FROM alpine COPY !"from=builder /services/blog/bin/server \ /services/blog/bin/server RUN adduser -D -u 1000 app USER 1000 ENTRYPOINT ["/services/blog/bin/server"] root 

Slide 37

Slide 37 text

Docker le - ENTRYPOINT # syntax = docker/dockerfile:experimental FROM golang:1.18-alpine AS builder RUN apk !"update add make WORKDIR /services/blog COPY go.mod go.sum ./ RUN go mod download COPY . . RUN !"mount=type=cache,target=/root/.cache/go-build \ make build FROM alpine COPY !"from=builder /services/blog/bin/server \ /services/blog/bin/server RUN adduser -D -u 1000 app USER 1000 ENTRYPOINT ["/services/blog/bin/server"] CMD 

Slide 38

Slide 38 text

Multi-stage builds # syntax = docker/dockerfile:experimental # Ϗϧυ͢ΔΠϝʔδ FROM golang:1.18-alpine AS builder RUN apk !"update add make WORKDIR /services/blog COPY go.mod go.sum ./ RUN go mod download COPY . . RUN !"mount=type=cache,target=/root/.cache/go-build \ make build # ੒Ռ෺Λ࣋ͭΠϝʔδ FROM alpine COPY !"from=builder /services/blog/bin/server \ /services/blog/bin/server RUN adduser -D -u 1000 app USER 1000 ENTRYPOINT ["/services/blog/bin/server"] docker build !"target stage 

Slide 39

Slide 39 text

Docker Dockerfile FROM ubuntu RUN echo "hoge" > hoge.txt RUN rm hoge.txt ⛼䡗׊גْؕ٭ة؅⭳ⱱ׊י鉮⬲ $ docker save $CID > image.tar $ tar xf image.tar 

Slide 40

Slide 40 text

ْؕ٭ةע邾丗סٕٝؕ٭־׼ם׾ . ├── 3fe352f27d6d9b899da69b9799728c4492690186797a106cbfa029264b6ebcf7 │ ├── VERSION │ ├── json │ └── layer.tar ├── aa8c0471e58774435617a2efb80b963d0288bdbdfdd7ded778776c3051664569.json ├── af197d5ca08b03ffdfd8c1285260360fbbc237328d421b73c2abc3f07bb054d9 │ ├── VERSION │ ├── json │ └── layer.tar ├── b3ea71bd7712c8534c4e3440a02a2217d0049fc8acacac191cf875bc21ab9f6a │ ├── VERSION │ ├── json │ └── layer.tar └── manifest.json 

Slide 41

Slide 41 text

layer.tar b3ea71bd7712c8534c4e3!!" layer.tar % tar xf layer.tar % ls VERSION hoge.txt json layer.tar % cat hoge.txt hoge הםײמ RUN rm hoge.txt .wh.hoge.txt 

Slide 42

Slide 42 text

history docker history ❆ $ docker history aa8c0471e587 IMAGE CREATED CREATED BY SIZE COMMENT aa8c0471e587 16 seconds ago /bin/sh -c rm hoge.txt 0B ec48e0efeb2e 16 seconds ago /bin/sh -c echo "hoge" > hoge.txt 5B bad148f8963f 30 hours ago /bin/sh -c !"nop) CMD ["bash"] 0B 30 hours ago /bin/sh -c !"nop) ADD file:3db67543ea64bf672… 69.2MB 

Slide 43

Slide 43 text

! 1. RUN !!" !!" 2. RUN !!" > secret.txt !!" RUN rm secret.txt 

Slide 44

Slide 44 text

嚀㳡䗯㕔؅䣽ֹ亠嫎 multi-stage build RUN !"mount=type=secret RUN !!# > secret.txt !$ !!# !$ rm secret.txt 

Slide 45

Slide 45 text

نٜؒؕמ傴׀鱮׳כ׀לֹ׌׾ Copy On Write (COW) OverlayFS Docker COW 

Slide 46

Slide 46 text

ٕٝؕ؞ٔشبٖ # syntax = docker/dockerfile:experimental FROM golang:1.18-alpine AS builder RUN apk !"update add make WORKDIR /services/blog <͕͜͜มߋ͞Εͨ৔߹͸↓ͷ෦෼Λ࠶࣮ߦ> COPY go.mod go.sum ./ RUN go mod download COPY . . RUN !"mount=type=cache,target=/root/.cache/go-build \ make build ˝ 㚺催ֵֿזג车♓꡸ס ⽜♐ֿ⫋㲔车׈׿׾ ˝ 㚺催׈׿׷׌ַ鼧⮆ע儕㶾 מ 

Slide 47

Slide 47 text

؞ٔشبٖס✳؂׿亠ֿ樟ם׾❆ # syntax = docker/dockerfile:experimental FROM golang:1.18-alpine AS builder RUN apk !"update add make WORKDIR /services/blog COPY go.mod go.sum ./ RUN go mod download COPY . . RUN !"mount=type=cache,target=/root/.cache/go-build \ make build # syntax = docker/dockerfile:experimental FROM golang:1.18-alpine AS builder RUN apk !"update add make WORKDIR /services/blog COPY . . RUN go mod download RUN !"mount=type=cache,target=/root/.cache/go-build \ make build 

Slide 48

Slide 48 text

؞ٔشبٖס✳؂׿亠ֿ樟ם׾❆ # syntax = docker/dockerfile:experimental FROM golang:1.18-alpine AS builder RUN apk !"update add make WORKDIR /services/blog COPY go.mod go.sum ./ RUN go mod download COPY . . RUN !"mount=type=cache,target=/root/.cache/go-build \ make build # syntax = docker/dockerfile:experimental FROM golang:1.18-alpine AS builder RUN apk !"update add make WORKDIR /services/blog COPY . . RUN go mod download RUN !"mount=type=cache,target=/root/.cache/go-build \ make build 

Slide 49

Slide 49 text

ؤ٤طػס錃銶 

Slide 50

Slide 50 text

1 1 ˝ ⶡ┉ס嚀耆כ׊י⮆ꦕ׊י姡䇖تآ٭ٜ׊׷׌ׂ׌׾ ˝ ⫋⮵榫䓪յ鵀伺䓪 ˝ ❣㰆꞊➟؅峎׼׌ 

Slide 51

Slide 51 text

ؤ٤طػ؛٭آتعٝ٭ب٘٤ docker-compose, Amazon ECS, Kubernetes 

Slide 52

Slide 52 text

ْؕ٭ةע鬭ꄈמ׌׾ docker .dockerignore 

Slide 53

Slide 53 text

تط٭عٝتךِٖؕ٭ذهٜמ׌׾ stdout/stderr 

Slide 54

Slide 54 text

錃㲊؅梪㗞㚺丗מ劲硯׌׾ docker build Docker 

Slide 55

Slide 55 text

ؤ٤طػت؞ٔ٤ 

Slide 56

Slide 56 text

ْؕ٭ةמ耗䍏䓪ֿםַ־زؘشؠ Trivy Clair Anchore AWS ECR DockerHub docker scan 

Slide 57

Slide 57 text

Trivy https://github.com/aquasecurity/trivy Docker git $ trivy image !"severity HIGH hatena/apply-for-internship-2020:latest 2020-08-05T08:44:37.496+0900 WARN You should avoid using the :latest tag as it is cached. You need to specify '!"clear-cache' option when :latest image is changed 2020-08-05T08:44:40.616+0900 INFO Detecting Debian vulnerabilities!!# hatena/apply-for-internship-2020:latest (debian 10.4) ===================================================== Total: 1 (HIGH: 1) +-----------+------------------+----------+-------------------+------------------+--------------------------------+ | LIBRARY | VULNERABILITY ID | SEVERITY | INSTALLED VERSION | FIXED VERSION | TITLE | +-----------+------------------+----------+-------------------+------------------+--------------------------------+ | perl-base | CVE-2020-10878 | HIGH | 5.28.1-6 | 5.28.1-6+deb10u1 | perl: corruption of | | | | | | | intermediate language state | | | | | | | of compiled regular expression | | | | | | | due to!!# | +-----------+------------------+----------+-------------------+------------------+--------------------------------+ 

Slide 58

Slide 58 text

ױכ״ 1 Namespace secomp Docker 1 1 

Slide 59

Slide 59 text

ֽ׊ױַ 

Slide 60

Slide 60 text

Docker Quiz $ docker run !"rm -i hatena/intern-2020-docker-quiz ! " docker run !"rm -i hatena/intern-2020- docker-quiz -hint 

Slide 61

Slide 61 text

ENTRYPOINT CMD ❆ CMD ["8.8.8.8"] ENTRYPOINT ["ping"] docker run ping 8.8.8.8 docker run 127.0.0.1 ping 127.0.0.1 docker run !"entrypoint date date Docker le CMD ENTRYPOINT ( / ) - CMD ENTRYPOINT 