読者です 読者をやめる 読者になる 読者になる

uyamazakのブログ

仕事中の問題と解決メモ。PythonとGoogle Cloudがメイン。bizoceanで新規事業の企画と開発担当。 BigQueryを使ったビッグデータ収集・解析・リアルタイム処理プロジェクト進行中 https://github.com/uyamazak/oceanus

dockerのベースイメージをubuntuからalpineにして起きた問題と良かったこと

開発中にattachでいろいろやるときは、慣れたubuntuが良かったけど、最近は大きくいじることもなくなったので、軽さ重視でalpineに変更してみたところ、細かいけど幾つか問題があった

問題

ホスト名が使えなくなった

ウェブサーバーからredisサーバーにつなげる際、ホスト側の/etc/hostsで指定しているホスト名を使っていたけど、alpineにしてから使えなくなった。
IPに変更したら問題なかった。

本番環境(GKE)ではそもそもIPなので問題なし。

cythonが入らなかった

API用のフレームワークfalconに必要なcythonが下記のようなエラーが出てビルドできなかった。

Step 3 : RUN pip3 install --upgrade -q cython falcon gunicorn bigquery-python google-api-python-client cerberus redis user-agents
 ---> Running in 2fe69e75b707
Command "/usr/local/bin/python3.5 -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-sdk00hrc/cython/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-773lkfk3-record/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /tmp/pip-build-sdk00hrc/cython/
The command '/bin/sh -c pip3 install --upgrade -q cython falcon gunicorn bigquery-python google-api-python-client cerberus redis user-agents' returned a non-zero code: 1

検索したら下記のようなnumpyでコケてる問題があったので一部を拝借

stackoverflow.com

Dockerfileに下記を追加したら無事インストールできた。

RUN apk add --force --update build-base

bashなど普段使ってるコマンドが使えない

alpineにはbashが入っていないので、起動中のコンテナに入って、コマンド操作するdocker exec -it {imageID} bashなどが使えない。
その他にもいろいろと普段debianubuntuなどで使っているコマンドが使えない。
代わりにshを使う。

ファイルの確認ぐらいだったらshやcatで問題無いと思うので、そもそもイメージの中に入っていろいろする段階なら、debian系のままで進めて、必要なくなってからalpineに移行した方がいいと思う。


良かったこと

イメージサイズの大幅削減

Ubuntu:16.04で作ったイメージは214.7 MBだったけど、python:3.5-alpineを元にしたものは、32.9MBとなり、約85%サイズが小さくなった。

ディスク使用量が減らせるだけでなく、GCPへのアップロードも高速になって開発スピードもアップした。

使用メモリの削減

Google Container Engine上で、kubectl top podで見られるメモリ使用量が54MB前後から27MB前後と約半分になったものもあった。
複数台起動しているウェブサーバーでは、43MBから39MBと1割程度。

動いてるプロセスにもよるけど、メモリもここまで減るとは思わなかった。


before

% kc top pod
NAME                             CPU(cores)   MEMORY(bytes)
arms-2550130212-o7hsv            22m          43Mi
arms-2550130212-8l016            22m          43Mi
arms-2550130212-5cebl            21m          43Mi

after

% kc top pod                                                                                                                                 (git)-[master]
NAME                             CPU(cores)   MEMORY(bytes)
arms-3073894556-ebjj7            25m          39Mi
arms-3073894556-xl6xx            24m          39Mi
arms-3073894556-yw5c7            23m          38Mi

まだ、本番運用を始めたばかりなので、何か起こるかもしれないけど、やる価値は十分あると思う。

Docker実戦活用ガイド

Docker実戦活用ガイド