はじめまして
どうも、あっきーと申します
ちょっと、ネットワークネタになるのですが、
私の師匠がnakという名称を使っていたので、
お、俺もっ!!みたいな憧れをずっと持っており (パクり) あだ名をもじってを組み合わせましたw
こ、これでちょっとGeek感でてきた!(すいません)
ということで、初投稿なので良しなにしていただけるとorz
また今後も小ネタも含めて書いていけたらと思います。
では早速、OpsなエンジニアがDockerを使ってて、
先人のありがたい技術要素を取り入れつつ、普段私がDockerfileを書く上で思ったところをちょっとまとめてみました。
(技術要素も内容もちょっと薄いですが...w)
Containerは軽量化...だけどっ!
Alpineを使うのがもうデファクトになっているかと思います。
ただ、BusyBoxベースのおかげか必要なCのライブラリが足りないという場面が多く、Alpine化できねぇ...(泣)なんてときも
そういったときは大人しくubuntuに変えると、一瞬で解決したり
(先日はそれで助けられましたorz)
あと、軽量化といったら、&&などで1ライナー化する...といった感じでしょうか。
Alpineですと、--no-cache
は、入れておくと軽量化できます
最近はubuntu使ってないですが、rm -rf /var/lib/apt/lists/*
を入れる感じでしょうか
Sample Dockerfile
FROM alpine:latest
RUN apk update \
&& apk --no-cache add python py-pip \
&& pip install flask
COPY hello.py /opt/app/hello.py
WORKDIR /opt/app/
EXPOSE 5000
CMD ["python", "/opt/app/hello.py"]
サンプルFlask
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "Hello Container ;)"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
$ docker build -t hogehoge .
$ docker run -p 5000:5000 -it <Container image ID>
ブラウザで http://localhost:5000
を叩くと、なんか出てきます
DockerHubのContainerに頼りすぎない
軽量化でかつ欲しいフレームワークが載っているContainerをみつけるとホイホイと、FROM <Repository/SUGOI_HITO>
と書いてしまいがち...
(slimとかとっても便利でしてw)
既にいろんな方が書かれている通り、悪意のあるイメージもあるので、なるべくオフィシャルのイメージスキャン済なやつを使って安全に
Docker for Macに一緒にインストールされているKinematicが割と便利です
監視などなど
私は主にクラウド環境でContainerを使うシーンが多いのですが、不正アクセスを検知するには監視もちゃんとやる
過去に、コンテナが突然SIGTERMされて死ぬということが起き、無事に沼へorz
(DataDogのdd-agentや、使ったことがないのですがはてなのMackerelさん辺りができるのかな?)
Supervisordに頼りすぎない
1Containerだけで色々とやらせすぎないこと
Supervisord使うと割となんでもできちゃうので、便利...
なんですが、せっかくのコンテナ使ってマイクロサービス化したい!
みたいなことを考えるちょっともったいない使い方なのかなと
サイドカー的な感じで別けるなどすると良いかなと、私は心が得ております
あとは、Rootユーザでやらないなど、まだまだありますね
まとめ
コンテナーといっても、LinuxOSでサーバを構築しているのに非常に近いと思いますので、昔エクセルに書きまくっていた設定調書がDockerfileになるという感じでしょうか
上記以外でも、色々と気をつけなきゃいけない部分はあると思いますので、
実際に運用していく中で新しい発見などあれば展開していきたいと思います:)