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
権限と承認 〜ユーザー信頼性に繋がる管理画面の根幹について〜
timakin
0
810
Go Backends for frontends with GraphQL and gRPC
timakin
6
4.2k
Design Pattern for Image and Text Composition in Go
timakin
5
6.8k
Golang API Testing the HARD way
timakin
13
7k
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
200
How Go cache
timakin
1
120
Other Decks in Technology
See All in Technology
プロダクトを触って語って理解する、チーム横断バグバッシュのすすめ / 20260411 Naoki Takahashi
shift_evolve
PRO
1
270
幾億の壁を超えて/Beyond Countless Walls(JP)
ikuodanaka
0
120
DIPS2.0データに基づく森林管理における無人航空機の利用状況
naokimuroki
1
200
非エンジニア職からZOZOへ 〜登壇がキャリアに与えた影響〜
penpeen
0
340
生成AI時代のエンジニア育成 変わる時代と変わらないコト
starfish719
0
640
Data Hubグループ 紹介資料
sansan33
PRO
0
2.9k
Digitization部 紹介資料
sansan33
PRO
1
7.2k
AIエージェントを構築して感じた、AI時代のCDKとの向き合い方
smt7174
1
190
すごいぞManaged Kubernetes
harukasakihara
1
390
え!?初参加で 300冊以上 も頒布!? これは大成功!そのはずなのに わいの財布は 赤字 の件
hellohazime
0
140
New CBs New Challenges
ysuzuki
1
180
【Findy FDE登壇_2026_04_14】— 現場課題を本気で解いてたら、FDEになってた話
miyatakoji
0
1k
Featured
See All Featured
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.8k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
1.9k
Into the Great Unknown - MozCon
thekraken
40
2.3k
How to Think Like a Performance Engineer
csswizardry
28
2.5k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
160
Java REST API Framework Comparison - PWX 2021
mraible
34
9.3k
The Curious Case for Waylosing
cassininazir
0
290
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.4k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.7k
The Pragmatic Product Professional
lauravandoore
37
7.2k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.4k
How to Ace a Technical Interview
jacobian
281
24k
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!