Docker Meetup Tokyo #2 でお話した時のスライドです.
参考 URI はクリックすると飛べるようになっていますが,Speakerdeck のスライドでは無理なようなので PDF をダウンロードしてください.
翌日行った勉強会の資料を少し省略して,少し Docker ユーザを意識した作りになっているので,翌日の勉強会資料も合わせてご覧いただくと良いかもしれません.
翌日の資料はこちら https://speakerdeck.com/tenforward/linuxkontenaru-men-kontenafalseji-chu-tozui-xin-qing-bao-2014-04-12
Linux Kernel ͷίϯςφػೳೖฤՃ౻ହจDocker Meetup Tokyo #22014-04-11
View Slide
Ճ౻ହจhttp://www.ten-forward.ws/@ten_forwardhttp://gplus.to/tenforwardhttps://github.com/tenforward····3/35
ۀϑΝʔεταʔόגࣜձࣾ ج൫։ൃ෦·αʔϏεͷ։ൃ৭ʑͳٕज़ͷௐ࣮ࠪίϯςφۀͰ΄΅ͬͯ·ͤΜ---Ҏલ Virtuozzo Λগ͠ࠓ Docker Λ͘͝؆୯ʹ--4/35
ۀ͡Όͳ͍׆ಈίϯςφؔ࿈ٕज़ͷௐࠪPlamo Linux ϝϯςφIP ిαʔϏεͷ։ൃΛͨ͠བྷΈͰຊ Asterisk Ϣʔβձ׆ಈΛҎલগ͠Jetspeed-2 υΩϡϝϯτ༁ʲվగ৽൛ʳ LinuxΤϯδχΞཆಡຊ (ٕज़ධࣾ)·αʔϏεͰ͑ͳ͍͔ͱ 2010 ͘Β͍ʹ cgroup ͷௐࠪΛ࢝Ίͨͷ͕͖͔͚ͬlxc man pages ༁--····5/35
ϒϩάͬͯ·͢http://d.hatena.ne.jp/defiant/·
ษڧձͬͯ·͢ͳΜͱ໌!!౦ژͰ·ͨΓ͍ͨͷͰΑΖ͓͘͠ئ͍க͠·͢ɽ7/35
ࠓͷ͓Docker ૉਓ͕ Docker ͕༻͍ͯ͠Δ Linux Χʔωϧͷίϯςφػೳʹ͍ͭͯগ͚͓ͩ͠͠·͢Docker ͷࢹ͔ΒݟΔʮίϯςφʯͱগ͠ҧ͏͔Ε·ͤΜ·ίϯςφͷجૅLinux ʹ͓͚ΔίϯςφͷΈLXC ʹ͍ͭͯ---·8/35
ίϯςφͷجૅ9/35
ίϯςφͱOS ϨϕϧͷԾԽΧʔωϧ͕࣋ͭػೳΧʔωϧͷػೳͰ (ෳͷ) ಠཱۭͨؒ͠Λ࡞Γग़͠ɼϦιʔεΛׂɾ͢ΔʮԾԽʯͱ͍͏ΑΓʮִԽʯ···ϓϩηεΛάϧʔϓԽͯ͠ଞͷάϧʔϓͱϦιʔεۭؒΛִάϧʔϓԽͨ͠ϓϩηεʹର͢ΔϦιʔε੍ݶ--·10/35
ίϯςφͷϝϦοτߴີԽ͕ՄೳΦʔόʔϔου͕খ͍͞ىಈ͕ૣ͍ඞͣ͠γεςϜΛಈ͔͢ඞཁͳ͍ (ΞϓϦέʔγϣϯίϯςφ)ԾϚγϯͷ্Ͱͳ͘ಈͥ͘!·ىಈ͍ͯ͠Δ OS (Χʔωϧ) Ұͭ-·ϋʔυΣΞͷԾԽ͕ෆཁ-·ԾϚγϯͷىಈͰͳ͘ɼϗετ OS ͔ΒݟͨΒ୯ʹϓϩηε͕ىಈ͍ͯ͠Δ͚ͩͳͷͰɼී௨ͷϓϩάϥϜ͕ىಈ͢Δͷͱ΄ͱΜͲมΘΒͳ͍-·ྫ͑ίϯςφͰ httpd ͷΈ͕ಈ͍͍ͯΔ-·࠷ۙ KVM ͷ্Ͱ KVM ಈ͍ͨΓ͢ΔͷͰίϯςφͳΒͰͱ͍͏Θ͚Ͱͳ͍-11/35
ίϯςφͷσϝϦοτҟͳΔ OS ͷγεςϜ / ϓϩάϥϜಈ͔ͤͳ͍ΧʔωϧʹؔΘΔૢ࡞Ͱ͖ͳ͍Χʔωϧͷ࣮ෳࡶʹͳΔ·୯ʹϗετ OS ্Ͱϓϩηε͕ىಈ͢Δ͚ͩͳͷͰͨΓલ-·ىಈ͍ͯ͠ΔΧʔωϧมΘΒͳ͍ͷͰίϯςφຖʹϩʔυ͢ΔϞδϡʔϧΛม͑ΔͳͲ--·શͯΧʔωϧͷػೳͱ࣮ͯ͠͞Ε͍ͯΔͷͰ-12/35
Linux ʹ͓͚Δίϯςφ࣮Χʔωϧͷػೳ (+ ύον) + ΧʔωϧͷػೳΛ͏ userspace πʔϧΧʔωϧ + ύον + userspace πʔϧΧʔωϧ + userspace πʔϧ (લճΑΓ૿͑ͨ! :-)·OpenVZ / Virtuozzo(༻)Linux VServer--·LXClibvirt (lxc υϥΠό)systemd(systemd-nspawn)vzctl for upstream kernellmctfydocker(libcontainer) 0.9 Ҏ߱------13/35
Linux ʹ͓͚ΔίϯςφͷΈ14/35
Linux Χʔωϧͷόʔδϣϯͱίϯςφ3.03.83.93.12ͨͩ͠ Cgroup ݱࡏ࠶ߏஙͷਅͬ࠷த!·setns() γεςϜίʔϧͷ࣮ (glibc 2.14 Ҏ߱)-·ίϯςφͷओཁػೳ͕Ұ௨Γἧͬͨόʔδϣϯ-·3.8 Ͱἧͬͨػೳ͕࣮༻ʹͳͬͨόʔδϣϯ (=XFSҎ֎ͷϑΝΠϧγεςϜʹ࣮͞Εͨ)-·XFS ͷ࣮͕ྃͨͩ͠ 3.12.8 Ҏલ LXC Λ͏্ͰҰ෦͕͋Δ--·Linux Χʔωϧͷͯ͢: cgroup ͷ࠶ઃܭ (linux.com)ػೳతʹࠓ͋ΔϞϊ͕े͑ΔϨϕϧ͕ͩɼࠓޙ͔ͳΓมԽ͍ͯ͘͠༧ఆͳͷͰҙ͕ඞཁɽ--15/35
Linux ͰίϯςφΛ࣮ݱ͢ΔͨΊͷػೳϓϩηεΛάϧʔϓԽͯ͠ଞͷάϧʔϓͱִάϧʔϓԽͨ͠ϓϩηεʹର͢ΔϦιʔε੍ݶchroot (pivot_root)ͦͷଞ·→ Namespace (໊લۭؒ)-·→ Cgroups (control groups)-··ωοτϫʔΫ (veth, macvlan)έʔύϏϦςΟCheckpoint/Restore (CRIU)ͳͲͳͲ...----16/35
Namespace ͷछྨ (1)Mount Namespace: 2.4.19UTS Namespace: 2.6.19PID Namespace: 2.6.24·ϓϩηε͔Βݟ͍͑ͯΔϚϯτͷू߹ɼૢ࡞Λ͢ΔɽNamespace ͷ mount, umount ଞͷ Namespace ʹӨڹ͠ͳ͍(ࢀߟ) Ϛϯτ໊લۭؒΛద༻͢Δ(IBM developerWorks)--·ϗετ໊ͳͲɼuname(2) ͕ฦ͢ͷू߹Λɽsetdomainname(2),sethostname(2) Ͱ Namespace ͷͷΈมߋͰ͖Δ-·PID ۭؒͷɽ৽͍͠ PID NamespaceͰ PID 1 ͔Β࢝·Δ PID ׂ͕ΓͯΒΕΔɽ͔Βࢠͷ PID Namespace ݟ͑Δ (ͷۭؒͷ PID Λ࣋ͭ)͕ɼࢠ͔Βݟ͑ͳ͍-17/35
Namespace ͷछྨ (2)IPC Namespace: 2.6.19User Namespace: 2.6.23 ~ 3.8Network Namespace: 2.6.26·SysV IPC ΦϒδΣΫτɼPOSIX ϝοηʔδΩϡʔͷִ-·ಠཱͨ͠ UID/GID ۭؒͱ֎෦ۭؒͷϚοϐϯά (ྫ͑ɼִۭؒͰuid/gid 0/0ɼ֎෦Ͱ 1000/1000 ͱ͔ՄೳʹͳΔ)-·ωοτϫʔΫϦιʔεͷִɽωοτϫʔΫσόΠεɼΞυϨεɼϧʔςΟϯάςʔϒϧɼιέοτɼϑΟϧλϦϯά-18/35
Namespace ͷૢ࡞clone(2) Ͱ৽͍͠ϓϩηε Λੜunshare(2) Ͱ৽͍͠ϓϩ ηεΛੜͤͣʹ࣮ߦίϯςΩετΛ੍ޚ͢Δsetns(2) ͰϓϩηεΛطଘ ͷNamespaceʹؔ࿈͚Δ··unshareͷ༻ྫ-·19/35
Cgroup (1)ϓϩηεΛάϧʔϓԽ͠ɼάϧʔϓʹରͯ͠Ϧιʔε੍ݶΛߦ͏ɽผʹίϯςφઐ༻ͷΈͰͳ͍ɽcpucpuacctcpuset·CFS(Completely Fair Scheduler) bandwidth controlɽ୯Ґ࣌ؒͷάϧʔϓͷλεΫ͕࣮ߦͰ͖Δ߹ܭ࣌ؒΛ੍ݶ͢Δ (3.2 Ͱ࣮)૬ରɽάϧʔϓؒͷ CPU ࣌ؒͷׂͷׂ߹Λࢦఆ͢Δɽྫ͑GroupA=100, GroupB=50 ͱ͢Δͱ A:B = 2:1-(ࢀߟ) Linux 3.2 ͷ CFS bandwidth control--·άϧʔϓͷ CPU ϦιʔεͷϨϙʔτ (CPU ࣌ؒ)-·ׂΓͯΔ CPU, ϝϞϦϊʔυͷׂ-20/35
Cgroup (2)devicefreezermemoryblkio (Block IO)·σόΠεͷΞΫηεڐՄɼ੍ݶͷࢦఆ-·άϧʔϓͷϓϩηεΛશͯҰ࣌ఀࢭ͢Δ-·ϝϞϦϦιʔεͷ੍ݶ (ϢʔβϝϞϦɼΧʔωϧϝϞϦ)-·I/O weight controller (2.6.33 Ҏ߱) άϧʔϓͷ༏ઌΛࢦఆ͢ΔI/O throttling (2.6.37 Ҏ߱) άϧʔϓͷϓϩηεͷσόΠεʹର͢Δbytes/second ͷ߹ܭͷࢦఆ--(ࢀߟ) Linux 2.6.37 ͷ৽ػೳ "I/O throttling"-21/35
Cgroup (3)hugetlbperf_eventnet_clsnet_prio·hugetlb ʹର͢Δ੍ݶ (3.6 Ҏ߱)mm/hugetlb: add new HugeTLB cgroup--·άϧʔϓ୯ҐͰ perf πʔϧͰϞχλϦϯά (ύϑΥʔϚϯεղੳ)-·ύέοτʹࣝผࢠΛ͚ͭɼτϥϑΟοΫίϯτϩʔϧ (tc) ͱ netfilter (3.14Ҏ߱) ͰίϯτϩʔϧՄೳʹ-·άϧʔϓؒͰͷωοτϫʔΫͷ༏ઌΛΠϯλʔϑΣʔεຖʹࢦఆ͢ΔLinux 3.3 ͷ৽ػೳ Network priority cgroupLinux 3.3 ͷ৽ػೳ Network priority cgroup (2)---22/35
Cgroup (4)Cgroup ίϯςφͱؔͳ͘༻Մೳcgroupfs ͱ͍͏ٙࣅϑΝΠϧγεςϜʹΑΔ࣮··# mount -t tmpfs cgroup_root /sys/fs/cgroup# mkdir /sys/fs/cgroup/memory# mount -t cgroup -o memory cgroup /sys/fs/cgroup/memory (ϝϞϦαϒγεςϜͷϚϯτ)# mkdir /sys/fs/cgroup/memory/test01 ("test01" ͱ͍͏άϧʔϓͷ࡞)# echo $$ > /sys/fs/cgroup/memory/test01/tasks (ϓϩηεΛάϧʔϓʹొ)# cat /sys/fs/cgroup/memory/test01/tasks (άϧʔϓͷϓϩηεͷ֬ೝ)28242837# echo 30M > /sys/fs/cgroup/memory/test01/memory.limit_in_bytes(άϧʔϓʹରͯ͠ϝϞϦ্ݶ 30M ͱ͍͏੍ݶΛઃఆ)# cat /sys/fs/cgroup/memory/test01/memory.limit_in_bytes (੍ݶͷ֬ೝ)31457280# cat /sys/fs/cgroup/memory/test01/memory.usage_in_bytes (ݱࡏͷ༻ྔͷ֬ೝ)56524823/35
LXC ࠷৽ಈ24/35
Docker ͱ LXCݩʑ Docker LXC ͱ aufs Λϕʔεʹͨ͠ιϑτΣΞͰͨ͠LXC·0.7 Ͱ aufs Ҏ֎͑ΔΑ͏ʹͳΓ0.9 Ͱ LXC ͳͯ͘ಈ͘Α͏ʹͳΓ (υϥΠό͕͋ΕଞͷίϯςφͰ)-CentOS ରԠͷͨΊ?--·2008 ࠒ͔Β Daniel Lezcano ࢯΛத৺ʹ։ൃελʔτ2013 9 ݄ʹϝϯςφ͕ Serge Hallyn ࢯ, Stéphane Graber ࢯʹަ2014 2 ݄ʹ 1.0.0 ϦϦʔε---25/35
LXC 1.0.0 (1)2014 2 ݄ 20 ϦϦʔε!!API ͷඋɽliblxc1 ͱͦΕΛͬͨίϚϯυϥΠϯπʔϧඇಛݖίϯςφɽҰൠϢʔβͰίϯςφΛ࣮ߦՄೳʹ (User Namespace)֤छݴޠͷ bindingsΫϩʔϯͱεφοϓγϣοτػೳίϚϯυϥΠϯπʔϧͷཧ (ෆཁͳͷͷআ)ϞχλϦϯάͷվྑ1.0 ܥ 5 αϙʔτ····lua (in tree)python3 (in tree)Go (out of tree)ruby (out of tree)----····26/35
LXC 1.0.0 (2)ίϯςφͷ rootfs ʹ༷ʑͳ backingstore Λར༻ՄೳʹυΩϡϝϯτͷߋ৽·σΟϨΫτϦ (ඪ४)btrfszfslvmloop deviceaufsoverlayfs-------·man pages ॆ࣮API υΩϡϝϯτ (liblxc)ຊޠ man pages ͷՃ (!)---27/35
LXC 1.0.0 (3)ςϯϓϨʔτͷॆ࣮ɽओཁσΟετϦϏϡʔγϣϯ͕Ұ௨Γἧͬͨײ͡·CentOS ͷՃ!!-lxc-alpine lxc-cirros lxc-openmandriva lxc-ubuntulxc-altlinux lxc-debian lxc-opensuse lxc-ubuntu-cloudlxc-archlinux lxc-download lxc-oraclelxc-busybox lxc-fedora lxc-plamolxc-centos lxc-gentoo lxc-sshdμϯϩʔυςϯϓϨʔτݱࡏͷ stable 1.0.3 (݁ߏසൟʹϦϦʔε͞Ε͍ͯ·͢)·ඇಛݖίϯςφΛ lxc-create ͢Δʹ৭ʑো͕͋ΔͷͰμϯϩʔυͰσΠϦʔͰओཁσΟετϦϏϡʔγϣϯͷ rootfs image ͕Ϗϧυ͞Ε͍ͯΔ--centos, debian, fedora, gentoo, oracle, plamo, ubuntu-·28/35
࠷ޙʹ29/35
·ͱΊLinux ͷίϯςφͷओͳཁૉ (ଞʹ͋Γ·͕͢)Namespace (໊લۭؒ)CgroupsChroot (pivot_root)···30/35
ϝʔϦϯάϦετ / ༁lxc JP άϧʔϓlxc man pages ༁linuxcontainers.org ༁·ίϯςφͷΛ·ͬͨΓ͍ͬͯ·͢ɽͨ·ʔʹ͔͠ϝʔϧདྷ·ͤΜɽlxc-jp ͱ͍͏໊લͰ͕͢ɼ LXC ʹݶΒͣԿͰ OK Ͱ͢ɽ-·ڠྗऀืू! (ಛʹࠪಡ!!)-·ڠྗऀืू-31/35
ίϯςφܕԾԽͷใަձࠓதʹ౦ژͰΓ͍ͨൃදऀืूத··32/35
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠33/35
Important contact information goes here.twitter @ten_forwardwww www.ten-forward.ws/github github.com/tenforward