#概要
研究室で作っているDockerコンテナを軽量化しようとalpineのコンテナを使用したい。そして、最近はやっている(先輩は反対しているが)Go言語を用いてウェブからのリクエストを処理したいと思ってやった。
いろいろ問題が発生したので、やったことと学んだことのメモ
#やりたいこと
ウェブページから投げられたリクエストをDockerのコンテナが受け取って、いい感じに処理して結果を返すと言った内容。そして、コンテナの容量はできるかぎり小さくすることが目的。個人的に勝手に立てた目標としては、100MB以下にすることです!徹底的に贅肉を減らしたい!
#方法
悩んだ原因をはじめ、解決したところまでゆっくりと書いていきます。
##開発環境
使用した端末:MacBook Air(Early 2015)
OS: OS X Capitan (バージョン 10.11.6)
メモリ: 8GB
Dockerの利用方法:Docker for mac(Version 1.12.3 Channel: Stable)
##間違っていたときの方法
Mac OS上でGoファイルを下記のコマンドでビルドする。
$go build hoge.go
実行ファイルが完成!
ひとまず実行してみて、いい感じに動作する。
次にDockerコンテナで実行できるか試してみた。Dockerfileは下記のようにした。
さてうまくいくのか!?
FROM alpine:3.4
WORKDIR /app
COPY hoge /app
EXPOSE 8000
CMD ["./hoge"]
安心してください。
必ずエラーになります!
###エラーの原因
ビルドで生成されたファイルは、Mac OSのためのバイナリーファイル。
したがって、alpine(Linux)では動作できません。
##Golangが使えるDocker alpineを利用してみる
結論から言えば、回り道をしていますが、実際にやったことなので書きます。
当時の私は、実行できない原因が理解できていなかったので、ひとまずGolangが使えるコンテナに逃げました。
Docker fileは下記の感じに作成
FROM golang:alpine
WORKDIR /app
COPY hoge.go /app
EXPOSE 8000
CMD ["go","run","hoge.go"]
実行も上手くできました。
まあ、goが使えるコンテナですからね。go runが利用できないことはないはず(ソースコードが正しければ)
###デメリット
単純に容量が大きい!
単にalpineのコンテナだと5MB程度に対して、golang:alpineは240MBほどある!
およそ50倍ですよ!
まあ、goが入っているので、重くなるのはしょうがない
しかし、100MB以下に抑える目標に反するので、別の方法にしましょう!
$docker images
golang alpine 016944b25311 5 days ago 241.1 MB
alpine 3.4 baa5d63471ea 7 weeks ago 4.803 MB
##ちなみにメリット
goが入っている=OSやアーキテクチャに関係なく使用できる
ビルドする場合は、利用する環境に応じてビルドする必要がある。
しかし、goが備わっているコンテナのため、go run で起動できるので、融通が効くのがGood
ハード面で複数のOSやアーキテクチャを利用している場合は、こっちのほうが良いかもね!
##きちんとビルドしてコンテナで利用
きちんとビルドする=利用するOS、アーキテクチャに合わせてビルドする事です
シンプルな解答ですが、何故か私はこのことを忘れていました。
まずは、正しいビルドを下記に示しておきます。
$ GOOS=linux GOARCH=amd64 go build hoge.go
OSとアーキテクチャをきちんとしましょう!
確認ですが、alpineは言わずと知れたLinuxです。
そして、私のPCのアーキテクチャはx86_64です。
したがって、GOOSとGOARCHの変数に、あのように書けばきちんとビルドしてくれます。(なんと便利!!)
指定している GOOSやGOARCHについては、公式サイトを参考にしてください。
次にコンテナに載せるためのDockerfileは、次のように書いて
FROM alpine:3.4
WORKDIR /app
COPY hoge /app
EXPOSE 8000
CMD ["./hoge"]
きちんと動作してくれました!
コンテナの容量も、ビルドしたバイナリーファイル(2MB程度)が増えただけなので、目標の100MB以下を達成
このコンテナの注意点として、コンテナを動作する環境(アーキテクチャ)を確認しないと動作しない可能性があります。
ハードの交換を行う際は、きちんと確認してから運用するように研究室の運用マニュアルに記載しておきます。