Upgrade to Pro — share decks privately, control downloads, hide ads and more …

コンテナの歴史を追いながらいまいちどコンテナについておさらいしてみる / Infra Stud...

tenforward
June 11, 2021

コンテナの歴史を追いながらいまいちどコンテナについておさらいしてみる / Infra Study 2nd #2

Infra Study 2nd #2「クラウドネイティブを支えるインフラ技術」の講演資料です。
参考となる情報にはPDF中からリンクをしていますが、資料中のリンクは Speaker Deck 上ではクリックできないので PDF をダウンロードしてご覧ください。

tenforward

June 11, 2021
Tweet

More Decks by tenforward

Other Decks in Science

Transcript

  1. ࣗݾ঺հʢ3ʣʙOSS ׆ಈ ʢLXC 〣 Contributors らがでʣ ɹ ɹ झຯ〜ぢアふべ〹〘〛〳『ɻぢアふべ〣ओ〠じがぼ゚पล〣࣮ ૷〠ڵຯ⿿⿴〿〳『ɻ

    • LXC 〜ֶ〫ぢアふべೖ໳ ʵܰྔԾ૝Խ؀ڥぇ࣮ݱ『぀ٕ ज़ (gihyo.jp, 2014 ೥ʙ) • Plamo Linux ゐアふべそ゚がゆ • 20 ੈل⿾〾ଓ。ࠃ࢈ぶくとぷ゙もゔがてゖア • lxc-jp ゆ゜でこぜぷ • LXC/LXD ํ໘〣຋༁׆ಈ • ぢアふべܕԾ૝Խ〣৘ใަ׵ձʢ2013 ೥ʙʣ • ぢアふべٕज़〠ؔ『぀ษڧձ • ࣍ճɺ೥಺〠։࠵༧ఆ 8/24
  2. ຊ೔〣಺༰ ぜ゘げへぼぐふくゅ〟〴〟《え〤 kubernetes ぇ௨「〛ぢアふべぇ࢖〘〛⿶぀ํ〷ଟ⿶〜「〼⿸ɻ 〜〷ぎゆ゙たがてゖア〣 Deployment 〹 Pod 〣ىಈ〤ҙࣝ「〛〷ɺPod 〣த〣ぢアふべ〣ىಈ〹ɺ〒〣

    ぢアふべ⿿〞〣〽⿸〟ػೳぇ࢖〘〛࣮ߦ《ぁ〛⿶぀〣⿾ʁ 〳〜ҙࣝ『぀ਓ〤〟⿾〟⿾⿶〟⿶〣〜〤〟⿶〜 「〼⿸⿾ʁ 〒〈〜ɺ〈〣なひてゖア〜〤ʮぢアふべʯ⿿⿶⿾〠ଟ。〣ػೳぇ࢖༻「〛ىಈ「〛。぀〣⿾ぇ؆୯〠঺հ「 〔⿶〝ࢥ⿶〳『ɻ • શ෦ྺ࢙ぇ௥〘〛঺հ「〛⿶぀〝࣌ؒ⿿⿴〿〳【え〣〜ɺదٓࢀߟ〠〟぀へずゔゐアぷ〟〞〭〣゙ア ぜぇష〿〳『 • ࠓ೔〤આ໌〤「〟⿶〷〣〣ɺॏཁ〟ٕज़〠ؔ「〛〤આ໌〣と゘ぐへ〕々ೖぁ〛⿴〿〳『 • 〷⿸গ「ৄ「⿶ぢアふべ〣ྺ࢙〤 CloudNative Days Tokyo 2019/KOF 2019 〣ൃදࢿྉ〠⿴〿 〳『 • ࢲ〣 asciinema 〠ɺぢろアへぇ࢖〘〛ぢアふべぇ࡞぀ぶゑ⿿〔。《え⿴〿〳『〣〜ɺ〷「〉ڵຯ⿿ ⿴ぁ〥】〧〉ཡ。〕《⿶ˠ https://asciinema.org/ tenforward 9/24
  3. Ծ૝ろてア〣⿼⿼》〘〦『、぀ྺ࢙ Ծ૝ろてア: • ゐぐアや゛がわ〣ੈք〜〤 1970 ೥୅ং൫⿾〾⿴぀ٕज़ • PC 〣ੈք〜〤 1999

    ೥〠 VMware ⿿ొ৔「〛Ҏདྷ〣ൃల Ұํ〜ܰྔ〟ʮԾ૝؀ڥʯ〝「〛〣ぢアふべ〷ݹ。⿾〾ଘࡏ「〛⿶぀ • chroot: ゆ゜なと〠ର「〛೚ҙ〣ぶく゛ぜぷ゙ぇ゚がぷ〝「〛ࢦఆ『぀ • 1979 ೥ UNIX Version 7 〜ɺ1982 ೥ BSD 〭ಋೖ • 2000 ೥୅ॳظ〠 FreeBSD jail, VirtuozzoʢLinux ޲々঎༻ぢアふべぬやぷʣ ɺLinux VServer • りとふくアそۀऀ〟〞〜ܰྔ〟ʮԾ૝ろてアʯ〝「〛ར༻ʢ゙ぬがとফඅ⿿গ〟。ूੵ౓ぇ্〆〾ぁ぀〝⿶⿸ ࢹ఺ʣ • てとふわ〝「〛ぢアふべぇಈ⿾『⿶い〻぀ʮてとふわぢアふべʯ 10/24
  4. ぢアふべ ぢアふべ〝〤ʁ • ゆ゜なと • ଞ〣ゆ゜なと⿾〾ִ཭《ぁ〔Ծ૝త〟ۭؒ〜ゆ゜なと⿿ ಈ。 Linux 〜〤じがぼ゚಺〣ػೳ •

    Namespaceʢִ཭ػೳʣ • cgroupʢ゙ぬがと੍ݶʣ • 〒〣ଞଟ਺〣ػೳ 〜ʮぢアふべʯぇ࡞〿〳『ɻʮίϯςφʯͱ͍͏୯Ұͷػ ೳ͸͋Γ·ͤΜ ˠゆ゜なと〟〣〜ී௨〠 OS ্〜ゆ゜なとぇىಈ『぀〣〝ಉ౳ 〣とゃがへ〜؀ڥ⿿ىಈ「〛。぀ ˠඞཁ〟ػೳ〝ઃఆぇ૊〴߹い【〛ʮぢアふべʯぇ࡞੒〜 ぀ 11/24
  5. やきぐ゚てとふわܥ〣ػೳ〣࣮૷ظ ⿾〟〿ݹ。⿾〾ぢアふべؔ࿈〣ػೳ〣࣮૷〤࢝〳〿〳『ʢpivot_root 〤ぢアふべ༻〣ػೳ〜〤〟⿶〜『 ⿿ɺࠓ〤ぢアふべ〠࢖いぁ〛⿶〳『ʣ ɻ〳』〤やきぐ゚てとふわํ໘〣ػೳ⿾〾ɻ • pivot_rootʢ2.3.41/2000 ೥ʣˠぢアふべઐ༻〣ಠཱ「〔やきぐ゚てとふわ • bind

    mountʢ2.4.0/2001 ೥ʣˠ೚ҙ〣ぶく゛ぜぷ゙ぇ゚がぷ〠 pivot_root 『぀〣〠ඞཁ • mount namespaceʢ2.4.19/2002 ೥ʣˠぢアふべؒ〜ろげアぷૢ࡞ぇ෼཭〜 ぀ ͜ͷ̏ͭͷػೳͰϚ΢ϯτૢ࡞Λಠཱͤͨ͞ίϯςφઐ༻ͷϑΝΠϧγεςϜ͕࡞Ε·͢ɻ 〈〣ػೳ〕々ぇ࢖〘〛やきぐ゚てとふわ〝ろげアぷぇִ཭「〔ぢアふべぇ࡞぀ぶゑ: https://asciinema.org/a/258206 ろげアぷपล〣ৄ「⿶ࢿྉ ろげアぷゆ゜むだがてゖア 12/24
  6. pivot_root ぇ࢖〘〔ಠཱ「〔やきぐ゚てとふわび゙が • root ϑΝΠϧγεςϜࣗମΛऔΓସ͑Δʢൈ々぀〝⿶⿸֓೦⿿〟⿶ʣ • chroot 〠ൺ〮〛 pivot_root 〜 ぀৚݅〤ݫ「⿶

    pivot_root લ pivot_root ޙ • ʮ৽「⿶ root やきぐ゚てとふわʯ⿾〾〤ൈ々ग़【〟⿶ • Docker 〹 LXC/LXD 〟〞〤 pivot_root ぇ࢖༻「〛⿶぀ 13/24
  7. ぢアふべ〣࡞੒ྫʢ〔〕「ろげアぷؔ࿈〣〴ִ཭「〔ぢアふべɺઆ໌〟「ʣ   # cat /proc/self/mounts ʢりとぷ〣ろげアぷ৘ใぇ֬ೝɺ〔。《え〣やきぐ゚てとふわ⿿ろげアぷ《ぁ〛⿶぀ʣ : (snip) udev

    /dev devtmpfs rw,nosuid,noexec,relatime,size=974296k,nr_inodes=243574,mode=755 0 0 devpts /dev/pts devpts rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 0 0 : (snip) # touch /HOST_ROOT ʢりとぷ〣゚がぷ/〠 HOST_ROOT 〝⿶⿸やきぐ゚ぇஔ。ʣ # touch /var/container/CONTAINER_ROOT ʢぢアふべぐゐがで〣゚がぷ/var/container 〠 CONTAINER_ROOT 〝⿶⿸やきぐ゚ぇஔ。ɻ〈〣഑Լ〠〤ぢアふべぐゐがで⿿ల։《 ぁ〛⿶぀〝「〳『ʣ # unshare --mount --fork -- /bin/bash ʢmount namespace ぇ࡞぀ʣ # mount --make-rprivate / ʢろげアぷૢ࡞⿿ namespace ぇ〳〔⿶〜൓ө《ぁ〟⿶〽⿸〠『぀⿼〳」〟⿶ʣ # mkdir /var/newroot ʢ৽〔〠ぢアふべぇ࡞੒『぀ぶく゛ぜぷ゙〣࡞੒ʣ # mount --bind /var/container /var/newroot ʢぢアふべぐゐがでぇ/var/newroot 〠 bind mountʣ # cd /var/newroot # ls ʢ/var/newroot 〠ぢアふべぐゐがで⿿ bind mount 《ぁ〛⿶぀ʣ bin dev home media opt root sbin sys usr CONTAINER_ROOT etc lib mnt proc run srv tmp var # mount -t proc -o rw,nosuid,nodev,noexec,relatime proc proc ʢ/var/newroot/proc 〠 proc やきぐ゚てとふわぇろげアぷʣ # mkdir old ʢpivot_root 〜Ҏલ〣゚がぷぇろげアぷ『぀ぶく゛ぜぷ゙ぇ࡞੒ʣ # pivot_root . old ʢݱࡏ〣ぶく゛ぜぷ゙ (/var/newroot) ぇ゚がぷ〠ɺҎલ〣゚がぷぇ/old 〠ろげアぷ「〛 pivot_rootʣ # ls / ʢݱࡏ〣ぶく゛ぜ゙⿿゚がぷ〠〟〘〛⿶぀ʣ CONTAINER_ROOT lib proc sys : (snip) # ls /old ʢ/old 〠〤Ҏલ〣゚がぷʢ〙〳〿りとぷ〣゚がぷʣ⿿ろげアぷ《ぁ〛⿶぀ʣ HOST_ROOT initrd.img.old proc tmp # umount -l /old ʢ/old 〤ෆཁ〟〣〜ぎアろげアぷʣ # ls /old ʢ/old ҎԼ〤ۭ〠ʣ # cat /proc/self/mounts ʢろげアぷ৘ใぇݟ぀〝ぢアふべ〣゚がぷ〝 proc 〕々⿿ろげアぷ《ぁ〛⿶぀ʣ /dev/sda1 / ext4 rw,relatime,errors=remount-ro 0 0 proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0   14/24
  8. Linux ぢアふべ׬੒ظୈҰظ 2006ʙ2008 ೥〠⿾々〛⿾〟〿〣ػೳ⿿௥Ճ《ぁɺNamespace 〤ओཁ〟〷〣⿿ଗ〘〔: • ぢアふべ〉〝〠: • ಠࣗ〣りとぷ໊⿿෇々〾ぁ぀〽⿸〠〟〘〔ˠ UTS

    Namespaceʢ2.6.19/2006 ೥ʣ • ゆ゜なとؒ௨৴ぇִ཭〜 ぀〽⿸〠〟〘〔ˠ IPC Namespaceʢ2.6.19/2006 ೥ʣ • ಠཱ「〔 PID ⿿෇々〾ぁ぀〽⿸〠〟〘〔ˠ PID Namespaceʢ2.6.24/2008 ೥ʣ • ಠཱ「〔ぼひぷゞがぜ I/Fɺぎへ゛とɺれがぷɺ゚がふくアそɺやく゚の゙アそ⿿࣋〛぀〽⿸〠〟〘〔ˠ Network Namespaceʢ2.6.24/2008 ೥ʣ • ぢアふべ༻〣Ծ૝ぐアのがやこがと⿿࣋〛぀〽⿸〠〟〘〔ˠ vethʢ2.6.24/2008 ೥ʣ ɺmacvlan ʢ2.6.23/2007 ೥ʣ • CPU 〣゙ぬがと੍ݶ⿿⿾々〾ぁ぀〽⿸〠〟〘〔ˠ cgroup cpu, cpuacct, cpuset ぢアぷ゜が゘が ʢ2.6.24/2008 ೥ʣ • LXC 〣஀ੜʢ2008 ೥ʣ • じがぼ゚〠ػೳ⿿ॆ࣮「〛 〔〷〣〣〒ぁぇ։ൃऀ⿿ࢼ『؀ڥ⿿〟⿶〣〜஀ੜ • 0.8 。〾⿶〳〜〤 Cɺてこ゚ɺPython ゆ゜そ゘わ〣د【ू〶ʢぐろぐば࢖⿶〚〾⿶ʣ 15/24
  9. ぢアふべ〣స׵ظ 2010 ೥〉あ⿾〾〣ྲྀぁ • ぐアや゘〣ぢがへԽ〣ྲྀぁ • DevOpsɺCI/CD 〣〽⿸〟։ൃɺぶゆ゜ぐɺӡ༻〣とゃがへぎひゆ • PaaS,

    SaaS 〣୆಄ ˠとゃがへʴԾ૝ろてアత〟れがのも゙ふくʴなずゔぎʢろ゚ばふべアぷʣ〟ಠཱ؀ڥ⿿ॏཁ • とゃがへ໘〠ண໨「〔ぢアふべ〣࠾༻ʢैདྷ〣゙ぬがとফඅ〠ண໨「〔ར༻⿾〾〣స׵ʣ • ゆ゜なとぇىಈ『぀〕々〟〣〜଎⿶ • ⿾〟〾』「〷Ծ૝ろてア〣〽⿸〠てとふわ〝「〛ىಈ「〟。〛〷ྑ⿶〝⿶⿸ゐ゙ひぷ ˠぎゆ゙たがてゖアぢアふべ • ಠཱ「〔やきぐ゚てとふわぇ࢖〘〛れがのも゙ふくぇ֬อ「〟⿿〾ىಈ〜 ぀ • ಠཱ「〔ִ཭ۭؒ 〝⿶⿸ゐ゙ひぷぇ׆⿾「〟⿿〾ぢアふべぇ׆༻『぀ྲྀぁ⿿ੜ〳ぁ぀ 18/24
  10. ぢアふべػೳ〣ॆ࣮〣 Docker 〣ొ৔ 2009ʙ2013 ೥〉あ • ぢアふべ〉〝〠: • ゐゑ゙が੍ݶ⿿⿾々〾ぁ぀〽⿸〠〟〘〔ʢ2.6.29/2009 ೥ʣ

    • I/O ੍ݶ⿿⿾々〾ぁ぀〽⿸〠〟〘〔ʢ2.6.33/2010 ೥ʣ • ೚ҙ〣てとふわぢが゚〣やく゚の゙アそ⿿〜 ぀〽⿸〠〟〘〔ʢ3.5/2012 ೥ɺseccompɺޙड़ʣ • ぢアふべ֎⿾〾ぢアふべ಺〠ೖ〘〛ぢろアへ࣮ߦ〜 ぀〽⿸〠〟〘〔ˠ setns てとふわぢが゚ ʢ2011ʙ2013 ೥ʣ ぢアふべ〜てとふわ〹ぎゆ゙たがてゖアぇಈ⿾『ओཁ〟ػೳ⿿Ұ௨〿〒あ〘〔 • LXC ぇ࠾༻「〔 PaaSɺSaaS 〣ొ৔ɻ「⿾「⿶〳⿶〖ぐた〛〟⿶ LXC • ʢ౰࣌〣ʣLXC 〣ぐた〛〟⿶〝〈あぇ゘ひゆ『぀ Docker 〣ొ৔ʢॳظ Docker 〤ཪଆ〜 LXC ぇ ࢖༻ʣ • ぐろぐば࢖⿶〚〾⿶ CLI ぇ docker ぢろアへ〜゘ひゆ • ぐゐがでよがとʴゕぺざアやきぐ゚てとふわ࢖༻〜ぢアふべぐゐがで࡞੒ˠىಈ〣とゃがへぎひゆ • ぼひぷゞがぜܦ༝〣ぢアふべ؅ཧ • Docker ొ৔ޙ〤ʮぢアふべʯ˺ʮぎゆ゙たがてゖアぢアふべʯ Ұ༂ʮίϯςφʯ͕࿩୊ͷٕज़ʹ!! 19/24
  11. cgroup v2 Docker 〣ొ৔〠〽぀ʮぢアふべʯ〣੝〿্⿿〿〜ɺじがぼ゚〠ぢアふべؔ࿈ػೳ⿿ೖ〿〹『⿶؀ڥ〠 〟〘〔 • cgroup v1 • ぢアふべ⿿ゐでをが〜〟⿶࣌ظ〠ಋೖ⿿ਐえ〕〣〜ɺ߇⿺〶〠ԕྀ⿿〖〠ػೳ⿿࣮૷《ぁ぀

    • ˠぢアふべར༻〣֦େ〝〝〷〠໰୊఺⿿໌〾⿾〠 • ৄ「。〤 LXC 〜ֶ〫ぢアふべೖ໳ ୈ 37 ճぇ〉ཡ。〕《⿶ • cgroup v2ʢ4.5/2016 ೥ʣ • v1 〝〣ぐアのがやこがと〣ޓ׵ੑぇ⿴぀ఔ౓อ〘〛ɺcgroup ぇ⿴぀〮 ࢟〠࣮૷「〟⿼「〔 • ぐアのがやこがと⿿શ。มい〘〛⿶぀ػೳ〷⿴぀ʢeBPF ぇ࢖〘〛੍ݶぇ⿾々぀ぢアぷ゜が゘が〝⿾ʣ • ݱ࣮త〟゙ぬがと੍ݶ⿿⿾⿾぀〽⿸〠〟〘〔 • PSIʢ4.20/2018 ೥ʣ • CPU, Memory, IO 〣ෛՙ⿿૿େ「゙ぬがと⿿ෆ଍「〛⿶぀ঢ়گぇ؍ଌՄೳ 20/24
  12. なずゔ゙ふくػೳ ୯〟぀りとぷ্〜ىಈ『぀ゆ゜なと〜⿴぀ぢアふべぇ҆શ〠࢖⿸〠〤༷ʑ〟なずゔ゙ふくػೳ〣ॿ々⿿ඞཁ • seccomp • てとふわぢが゚⿿やく゚の゙アそ〜 ぀ػೳɻࠓ〣ぢアふべ〜〤౰〔〿લ〠࢖いぁ〛⿶぀ػೳʢࠓ⿼〷〠࢖い ぁ〛⿶぀ػೳ〤 3.5 〜ಋೖ〣 mode

    2ʣ • Introduction to Seccomp ʢ@mrtc0 《えʣˡجૅ⿾〾ਂ૚〳〜୹࣌ؒ〜ֶ〮぀ඇৗ〠『〉⿶ࢿྉʢಈը 〷ݟぁ〳『ʣ • seccomp notifyʢ5.0/2019 ೥ʣˠてとふわぢが゚〣࣮ߦՄ൱ぇゕがづがۭؒ〣ゆ゜そ゘わଆ〜൑அ〜 ぀ • seccomp 〕々ぇふがろ〠ษڧձぇ「〳「〔ʢಈըࢹௌՄʣ • capability • ࠓ〣ぢアふべ〜〤౰〔〿લ〠࢖いぁ〛⿶぀ • root ⿿࣋〙ಛݖぇࡉ෼Խ「〛ඞཁ〠Ԡ」〛ゆ゜なと〠ݖݶぇ෇༩〜 ぀ • ぢアふべ〉〝〠ݖݶぇࡉ⿾。༩⿺〔〿ണୣ「〔〿〜 ぀ • ࿈ࡌୈ 42 ճɺୈ 43 ճɺୈ 44 ճ〣ʮLinux じがぼ゚〣たがむも゙ふくʯ • User Namespaceʢ3.8/2013 ೥ʣ • ぢアふべ಺֎〣 UID/GID ぇろひゃアそ『぀ɻぢアふべ಺〜〤 rootɺりとぷ্〜〤Ұൠゕがづが〝⿶⿸〈〝 ⿿Մೳˠぢアふべ಺〜 root ݖݶ⿿ඞཁ〜⿴〘〛〷҆શ〠ぢアふべぇ࣮ߦՄೳ • Docker 〣 rootless ゑがへɺuserns-remap ػೳ • LXD 〜〤〈〣ػೳぇ࢖⿸〣⿿ぶやさ゚ぷ • LSMʢSELinux, AppArmor,...ʣ 21/24
  13. 〒〣ޙ〣৽ػೳɺվྑ ぢアふべ〝〤௚઀ؔ܎〟《〒⿸〟ػೳ〷ぢアふべ〠〝〘〛〤ॏཁ⿾〷ʢぢアふべؔ܎〣։ൃऀ⿿ख⿿々〛⿶ 〔〿『぀ʣ • OverlayFSʢ3.18/2014 ೥ʣ • ゕぺざアやきぐ゚てとふわʢ〒ぁ〳〜〣むひばద༻〣 aufs 〠औ〘〛୅い぀ඪ४ػೳʣ

    • cgroup 〣 pids ぢアぷ゜が゘がʢ4.3/2015 ೥ʣ • ぢアふべ಺〣ゆ゜なと਺〣੍ݶ • pidfdʢ5.3/2019 ೥ʣ • PID 〣॥؀໰୊〣ղܾʢ໨త〝ҧ⿸ゆ゜なと〠てそべ゚ૹ〘〛「〳⿸ةݥੑʣ • Time Namespaceʢ5.6/2020 ೥ʣ • ಠཱ「〔 uptimeʢCLOCK_MONOTONIC/CLOCK_BOOTTIMEʣ • clone3 てとふわぢが゚ぇ࢖〘〔ぢアふべゆ゜なとੜ੒〣ぢとぷ௿ݮʢ5.7/2020 ೥ʣ • ਌ゆ゜なと〝ҟ〟぀ cgroup 〠ゆ゜なとぇੜ੒〜 ぀ʢ〈ぁ〳〜〤਌ゆ゜なと〝ಉҰ cgroup 〠ੜ੒《ぁ぀ 〣〜Ҡಈ⿿ඞཁ〕〘〔ʣ • ID mapped Mountʢ5.12/2021 ೥ʣ • ぢアふべぐゐがでぇろげアぷ『぀ࡍɺぢアふべぐゐがで಺〣やきぐ゚〣ॴ༗ݖぇ೚ҙ〠มߋ〜 ぀ʢUser Namespace ぇ࢖〘〔ぢアふべ〣৔߹〠ぢアふべぐゐがで಺ぇ࠶ؼత〠 chown 『぀ඞཁ⿿〟⿶ʣ 22/24