2018/11/07 - 07:27

解析環境をdockerに移しました。

:

:

:

eviry開発のtkです。
最近、色々なログを集計したり、弊社millviの利用状況を元に分析することが増えました。

ローカルのマシン以外に解析用のマシンもあるのですが、これまではそれぞれの環境に別々に実行環境を整えていたので「必要なライブラリがない」「OSが違っていて挙動が違う」といったことが多く発生していました。
そこで、環境を統一するための第一歩として、ローカルマシンの環境をdockerに吐き出し、コードで管理するようにしました。

今回、考えたのは以下のような点です。

  1. anacondaは使わない
  2. python 3.6を使う
  3. できたらR / Juliaも動かせるjupyter環境を作る

anacondaについては、非常に便利なツールではあるのですが、ライブラリの依存関係やバージョンをcondaでロックされるのが気になるので使いませんでした。
また、現在のPython3は3.7がすでにリリースされています。しかし、これがtensorflowの最新のバージョンと相性が良くないので、これを避けるためにPython 3.6を使用しています。
最後に、今のところ使う予定はないのですが、ついでなのでRとJuliaも動かせる環境を整えました。

さて、これらを考慮した結果、出来上がったDockerfileは次のようになります。

FROM python:3.6

RUN apt-get update && apt-get upgrade -y
# Packages for essentials
RUN apt-get install -y apt-utils vim less wget mecab libmecab-dev mecab-ipadic-utf8 pandoc texlive-xetex git ssh
RUN apt-get clean

# Set up jupyter env
RUN pip --no-cache-dir install tensorflow scikit-learn keras jupyter jupyterlab scipy simpy matplotlib numpy pandas plotly sympy mecab-python3 librosa pillow h5py wordcloud seaborn

RUN jupyter notebook --generate-config --allow-root

ENV JUPYTER_CONFIG /root/.jupyter/jupyter_notebook_config.py
RUN echo "c.NotebookApp.ip = '0.0.0.0'" >> ${JUPYTER_CONFIG}
RUN echo "c.NotebookApp.open_browser = False" >> ${JUPYTER_CONFIG}

# Install R and IRkernel to use on Jupyter
RUN apt-get install -y r-base libgit2-dev libssh2-1-dev libunwind-dev libcurl4-openssl-dev
RUN apt-get clean

RUN R -e 'install.packages(c("repr", "IRdisplay", "evaluate", "crayon", "pbdZMQ", "devtools", "uuid", "digest"), repos="http://cran.us.r-project.org");devtools::install_github("IRkernel/IRkernel");IRkernel::installspec()'

# Install and set up julia
ENV JULIA_VERSION=1.0.0

RUN mkdir /opt/julia-${JULIA_VERSION} && \
  cd /tmp && \
  wget -q https://julialang-s3.julialang.org/bin/linux/x64/`echo ${JULIA_VERSION} | cut -d. -f 1,2`/julia-${JULIA_VERSION}-linux-x86_64.tar.gz && \
  echo "bea4570d7358016d8ed29d2c15787dbefaea3e746c570763e7ad6040f17831f3 *julia-${JULIA_VERSION}-linux-x86_64.tar.gz" | sha256sum -c - && \
  tar xzf julia-${JULIA_VERSION}-linux-x86_64.tar.gz -C /opt/julia-${JULIA_VERSION} --strip-components=1 && \
  rm /tmp/julia-${JULIA_VERSION}-linux-x86_64.tar.gz
RUN ln -fs /opt/julia-*/bin/julia /usr/local/bin/julia

RUN mkdir /etc/julia

RUN julia -e 'import Pkg; Pkg.update()' && \
    julia -e 'import Pkg; Pkg.add("IJulia")' && \
    julia -e 'using IJulia'

# Common settings
EXPOSE 8888

VOLUME /workspace

WORKDIR "/workspace"
CMD ["jupyter", "lab", "--allow-root"]

GitHub - jupyter/docker-stacks: Ready-to-run Docker images containing Jupyter applications というプロジェクトを参考に作りました。
こちらもRやJuliaを含んだ解析環境を作るためのDockerfileがあります。ただ、これはanacondaに依存しているので、そのあたりを変更しました。

前述の通りPython 3.6を使いたかったので、これが入ったものをベースにしています。
上から順番に「必要なパッケージのインストール -> pythonで必要なもののインストール -> R環境の構築 -> Julia環境の構築 -> 共通設定」という形になっています。

Pythonはjupyterを含めてデータ解析関連でよく使われるものをインストールしています。
また、ホストマシンからアクセスすることを考えてjupyterの設定を作っていますが、セキュリティ面を考えるとip設定は細かく指定したほうが良いでしょう。
RとJuliaに関しては、まずは実行環境をインストールした後にそれぞれでjupyter上で実行するためのパッケージをインストールしています。

最後に共通設定ですが、主にJupyter notebook/labで使用することを想定しているので、8888のポートだけ開けています。
ホスト側とのファイル共有のための作業ディレクトリとして/workspaceも作りました。

これを使って、docker build -t <name> .を実行すればイメージが作れます。
このイメージは4.5GBほどの巨大なものになります。必要がなく容量を圧縮したければ、RやJuliaの環境設定は削除してください。

最後に起動確認。
docker run -it -p 8888:8888 -v <workdir>:/workspace <name>とすると、先程作ったイメージを元にコンテナが作成され、CMD で指定したとおり jupyter lab --allow-auth が内部で実行されます。(-pはホストとコンテナのポートのつながり、-vは同期するディレクトリの指定)
すると、tokenが表示されるので localhost:8888?token=<token>にブラウザからアクセスし、jupyter labの画面が表示されるか確認してみてください。
この時、RとJuliaのインストールもしていたらこれらも言語として選択できるようになっているはずです。

以上になります。