Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Gohperに逆らうとどうなるのか
Search
Seiji Takahashi
April 23, 2016
Technology
4.3k
3
Share
Gohperに逆らうとどうなるのか
Go Conference Spring 2016
Seiji Takahashi
April 23, 2016
More Decks by Seiji Takahashi
See All by Seiji Takahashi
営業、広報、開発。 多面的なAIネイティブ化のための 基盤について
timakin
0
180
権限と承認 〜ユーザー信頼性に繋がる管理画面の根幹について〜
timakin
0
890
Go Backends for frontends with GraphQL and gRPC
timakin
6
4.2k
Design Pattern for Image and Text Composition in Go
timakin
5
6.9k
Golang API Testing the HARD way
timakin
13
7.1k
Head First Golang Image Package
timakin
2
10k
React Native Beyond Prototype
timakin
2
1.7k
Performance Optimization on Google AppEngine
timakin
5
6.6k
testcache.pdf
timakin
1
220
Other Decks in Technology
See All in Technology
Claude Codeですべての日常業務を爆速化しよう!
minorun365
PRO
17
16k
自称宇宙最速で不合格となったAIP-C01にリベンジを果たすべくAIで問題集アプリを作ってみた。
yama3133
0
260
long-running-tasks
cipepser
2
450
はじめてのDatadog
kairim0
0
250
サプライチェーンセキュリティの空白地帯 - 信頼できる”依存性”の未来を考える
rung
PRO
2
600
Gradle×GitHub_ActionsでCI時間を約50%短縮 ジョブ分割の設計と落とし穴 / Cutting CI Time by ~50% with Gradle and GitHub Actions: Job-Splitting Design and Pitfalls
takatty
0
560
地元にいないローカルオーガナイザーの立ち回り
uvb_76
1
410
PHP と TypeScript の型システム比較:AI 時代の「型」は誰のためにあるのか? #frontend_phpcon_do / frontend_phpcon_do_2026
shogogg
1
220
テストコードのないプロジェクトにテストを根付かせる
tttol
1
240
AI時代の私の技術インプットとアウトプット術
tonkotsuboy_com
15
8.1k
Spring AI × MCP 入門〜AIエージェントへのツール公開、境界設計から始める最小構成 〜
yuyamiyamoto
0
190
運用を見据えたAIエージェント設計実践
amacbee
0
630
Featured
See All Featured
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
118
120k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
180
SEO for Brand Visibility & Recognition
aleyda
0
4.6k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.9k
HDC tutorial
michielstock
2
680
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
The Cost Of JavaScript in 2023
addyosmani
55
10k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
130
Scaling GitHub
holman
464
140k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.5k
For a Future-Friendly Web
brad_frost
183
10k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Transcript
Gopherʹ ٯΒ͏ͱ Ͳ͏ͳΔͷ͔ timakin / @__timakin__ Go Conference 2016 Spring
ࣗݾհ • ߴڮೋ / ͪ·͖Μ • Github: timakin • Twitter:
@__timakin__ • Gmail:
[email protected]
• hatena: timakin.log • ϓϥΠϕʔτͰGoͰ࡞ͬͨCLIπʔϧ • timakin/ts - teckstack (ςοΫܥͷใऩूCLI) • timakin/octop - octopatrol (github tracking CLI)
ΞδΣϯμ • ʮgo-lxcΛ௨࣮ͯ͠ײͨ͠Golangͷྑ͞ʯ͕ ਖ਼ࣜͰ͢ɻ • LXCपΓͷ͠·͢ɻ • CLIπʔϧΛGoͰॻ͖ͨ͠ΒߴԽͨ͠ ͠Α͏ͱࢥ͚ͬͨͲ࣌ؒͳ͛͞ͳͷͰࠓ…
Կ͕ىͬͨ͜ͷ͔ • DockerΫϩʔϯΛ࡞ͬͯͨ • YAPC::Asia Tokyo 2015ͰʮGitͷ࡞Γํʯͱ͍͏ LTʹײԽ͞Εͯɺ”࣮͕ͦ͠͏ͩ” ͱࢥ͏ͷΛϓν࣮ͯ͠ΈΑ͏ͱߟ͑ͨɻ •
खݩͰͪΌΜͱதΘ͔ͬͯͦ͏Ͱ Θ͔ͬͯͳ͍πʔϧ… • DockerͩͶʂ
Կ͕ىͬͨ͜ͷ͔ • p8952/bockerͱ͍͏shell100ߦͷ࣮͕͋Δ • ͜ΕΛRubyͰͬͨΒՄಡੑ͕͍͋ͬͯ ͍ͷͰɻʢԿΑ͘ͳ͔ͬͨʣ • Dockerͱ͍͏͔LXCΛϥοϓͨ͠timakin/ Oceanusͱ͍͏ͷΛॻ͖·ͨ͠ɻ
LXC(Linux Containers)ͷ֓ཁ • ίϯςφԾԽʹඞཁͳchrootcgroupɺnamespaceͷׂΛ ѻ͏APIΛఏڙ͢Δٕज़Ͱ͢ɻ • ԾϚγϯΛ࡞ΔͷͰͳ͘ɺϗετOSͷϦιʔεΛׂɺཧ ͢Δ͜ͱͰִۭؒΛ࡞Γग़͠·͢ɻϋʔυΣΞͷγϛϡϨʔγϣ ϯ͕ඞཁͳ͍ͨΊɺԾԽʹΑΔΦʔόʔϔου͕গͳ͍Ͱ͢ɻ •
v0.8ҎલͷDockerLXCܦ༝ͰҰ෦ϦιʔεཧΛ͍ͯ͠·ͨ͠ɻ • DockerϦιʔεׂͦ͏Ͱ͕͢ɺΞϓϦέʔγϣϯͷσϓϩ ΠڥΠϝʔδͷόʔδϣχϯάʹओ؟Λஔ͍͍ͯΔͰɺࠩҟ ͕͋Δͷͩͱ͍͏ҹͰ͢ɻ
go-lxcͷ֓ཁ • Go Bindings for LXC (Linux Containers) • LXD
(REST APIΛఏڙ͢ΔσʔϞϯΛඋ͓͑ͯ ΓɺωοτϫʔΫܦ༝Ͱͷૢ࡞͕Մೳͳίϯ ςφٕज़ɻLXCͷਐԽ൛తͳͷ)ʹಋೖ͞ Ε͍ͯ·͢ɻ • ଞʹruby-lxcpython2-lxc͋Γ·͕͢ɺ ։ൃࢭ·ͬͯ·͢…
go-lxcͷAPIͷྫ • ίϯςφͷجຊૢ࡞ • ৽ن࡞ɿfunc NewContainer • ίϯςφىಈɿfunc (*Container) Start
• ίϯςφͰͷίϚϯυ࣮ߦɿfunc (*Container) Execute • ίϯςφഁغɿfunc (*Container) Destroy • ίϯςφఀࢭɿfunc (*Container) Shutdown • ίϯςφҰཡɿfunc Containers
go-lxcͷAPIͷྫ • ίϯςφ͝ͱͷಠࣗઃఆɺsnapshotɺϓϩη εͷσʔϞϯԽ • func (*Container) SetMemorySwapLimit • func
(*Container) CreateSnapshot • func (*Container) Daemonize
go-lxcͷίʔυϦʔσΟϯά // go-lxc/container.go func (c *Container) Start() error { if
err := c.makeSure(isNotRunning); err != nil { return err } c.mu.Lock() defer c.mu.Unlock() if !bool(C.go_lxc_start(c.container, 0, nil)) { return ErrStartFailed } return nil }
go-lxcͷίʔυϦʔσΟϯά // go-lxc/lxc-binding.c bool go_lxc_start(struct lxc_container *c, int useinit, char
* const argv[]) { return c->start(c, useinit, argv); }
go-lxcͷίʔυϦʔσΟϯά // lxc/src/lxc/lxccontainer.c struct lxc_container *lxc_container_new(const char *name, const char
*configpath) { struct lxc_container *c; ... c->start = lxcapi_start; ... } static bool lxcapi_start(struct lxc_container *c, int useinit, char * const argv[]) { bool ret; current_config = c ? c->lxc_conf : NULL; ret = do_lxcapi_start(c, useinit, argv); current_config = NULL; return ret; }
Dockerϓν࣮աఔɿֶश • cgroup, chroot, snapshot࡞पΓͷษڧɻ • Ծڥͱ͍͏ΑΓִۭؒΛ࡞ΔΠϝʔδΛ࣋ͭɻ • ॳظͷDockerLXCͬͯͨΑ͏ͳͷͰɺLXCͷษڧ …
• Docker HubͷAPIͷ༷ಡΉ… • ͪΖΜdockerͦͷͷͷ࣮ͱlxcͷίʔυಡ Ήɻ
Dockerϓν࣮աఔɿ࣮ • e.g. pull -> run, execͷྲྀΕ • Docker HubͷAPIΛୟ͖ɺimages
endpointΛୟ͍ͯɺඞཁͳsession tokenΛऔಘ͢Δ • session token͖ͰRegistry APIΛୟ͍ͯɺ֘λάͷimage_idΛऔಘ͢ Δ • Imageͷancestry(diffཤྺ)Λऔಘ͢Δ • layer(ImageͷόΠφϦσʔλ)Λऔಘ͠ɺಛఆσΟϨΫτϦԼʹల։͢Δ • ετϨʔδͷঢ়ଶͷࠩ(ancestry)ΛϨΠϠͱͯ͠ॏͶ߹ΘͤΔ͜ͱͰɺΠ ϝʔδΛܗ͢ΔɻʢϢχΦϯϑΝΠϧγεςϜʣ • snapshotΛҙͷσΟϨΫτϦʹอଘͭͭ͠ɺͦͷΠϝʔδΛݩʹLXCΛ ىಈɺίϚϯυ࣮ߦ
Dockerϓν࣮աఔɿ࣮ • e.g. pull -> run, execͷྲྀΕ • Docker HubͷAPIΛୟ͖ɺimages
endpointΛୟ͍ͯɺඞཁͳsession tokenΛऔಘ͢Δ • session token͖ͰRegistry APIΛୟ͍ͯɺ֘λάͷimage_idΛऔಘ͢ Δ • Imageͷancestry(diffཤྺ)Λऔಘ͢Δ • layer(ImageͷόΠφϦσʔλ)Λऔಘ͠ɺಛఆσΟϨΫτϦԼʹల։͢Δ • ετϨʔδͷঢ়ଶͷࠩ(ancestry)ΛϨΠϠͱͯ͠ॏͶ߹ΘͤΔ͜ͱͰɺΠ ϝʔδΛܗ͢ΔɻʢϢχΦϯϑΝΠϧγεςϜʣ • snapshotΛҙͷσΟϨΫτϦʹอଘͭͭ͠ɺͦͷΠϝʔδΛݩʹLXCΛ ىಈɺίϚϯυ࣮ߦʢ͕͜͜LXCΛ͏ॴʣ
Dockerϓν࣮աఔɿ࣮ • imageͷϩʔυͰ֎෦APIΛୟ͖ʹߦ͘ͷ ͷɺجຊతʹLXCͷػೳͰ݁͢Δɻ • bockerbtrfsʹΑΔsnapshot࡞ɺcgroupʹ ΑΔϦιʔεཧɺωοτϫʔΫઃఆɺ chrootͰϧʔτมߋΛϕλͰ࣮ɻ
݁ՌɺGolang͡Όͳ͔͔ͬͨΒ… • ·ͣɺવGoDocͳΜͯͳͷͳ͍ • ͨΓલͷ͜ͱͰ͕͢ɺ͜Ε͕ݪҼͰAPIͷ ༷ΛѲ͢ΔͨΊʹίʔυΛಡΉ͜ͱ ʹͳΓ·͢ɻ • ͦͷίʔυ͕LXCΛΧϓηϧԽͨ͠ɺ͔Γ ͍͢ίʔυͳΒ·ͩ͠ɺC֦ுͷίʔυ
ͳͷͰࢮɻ
ͨͱ͑container_start static VALUE container_start(int argc, VALUE *argv, VALUE self) {
int ret; VALUE rb_use_init, rb_daemonize, rb_close_fds, rb_args, rb_opts; struct start_without_gvl_args args; args.use_init = 0; args.daemonize = 1; args.close_fds = 0; args.args = NULL; rb_args = Qnil; rb_scan_args(argc, argv, "01", &rb_opts); if (!NIL_P(rb_opts)) { Check_Type(rb_opts, T_HASH); rb_use_init = rb_hash_aref(rb_opts, SYMBOL("use_init")); if (!NIL_P(rb_use_init)) ͓͏ɺͦ͏ͩͳɻ
݁ՌɺGolang͡Όͳ͔͔ͬͨΒ… • rubyͷ߹ɺGolangͷΑ͏ʹૉఢʹAPI͕ੜ ͍͑ͯΔΘ͚Ͱͳͯ͘ɺ͜͏ɻ • GoҎ֎ͷLXC࣮lxcΛݺͼग़͚ͩ͢Ͱɺ APIͱͯ͠ϦʔμϒϧͩͬͨΓɺརศੑΛߟྀ ͨ͠୯Ґʹϝιουׂ͕͞Εͯͳ͔ͬͨΓ ͠·͢ɻ require
'lxc/lxc'
݁ՌɺGolang͡Όͳ͔͔ͬͨΒ… • GolangͳΒ func (*Container) IPAddress func (*Container) CPUStatsͳͲɺ ίϯςφΛཧ͢Δʹͨͬͯݟ͍ͨใ͕
ࣗ༝ʹݟΕ·͢ɻ • Ұํlxc/lxc-ruby… ϝϞϦωοτϫʔΫཧconfigͷΈ… ͏ͪΐͬͱ࿑ಇͯ͠ʂ
͓લͳΜͰ RubyͰ ࣮͠Α͏ ͱࢥͬͨΜͩʁ
·ͱΊ • GoͷLXCपΓͷ࣮ॆ࣮ͯ͠·͢ɻ • APIͷ༷͕ࡉԽ͞ΕͯͯɺυΩϡϝϯτ ੜ͞ΕͯΔͷͰɺαοͱίϯςφԾԽͷ ίʔυΛಡΉ͜ͱ͕Ͱ͖·͢ɻͥͻɻ • GoͰ͔ͬ͠Γͨ͠API͕Ͱ͖͕͋ͬͯΔͱɺ ͦΕҎ֎ͷݴޠͰͷ࣮͕Γͳ͘ײ͡·͢ɻ
ٯΒ͏ͷΊ·͠ΐ͏ɻ
Thank you!