Dockerコンテナ上にPythonの基本的な科学計算環境を構築してみた

Dockerとは

一言で説明するとすれば軽量な仮想化環境という表現で説明できます。

また、その他の仮想化環境と比較して以下のような利点があります。

  • OS環境の変更自体を差分で管理できる
  • DockerHub等を利用することで他の物理マシンにOS環境を簡単に持ってくることができる
  • docker-composeなどでスケールできる

欠点を挙げるとすればLinux以外のOSではboot2docker等を経由して\
動かすしかないことぐらいでしょうか。


環境

OS: LinuxMint17.1(64bit) 3.13.0-37-generic

Dockerのインストール

aptのリポジトリはバージョンが古いので非公式のリポジトリを使用します。

sudo add-apt-repository ppa:docker-maint/testing
sudo apt-get update
sudo apt-get install docker.io
adduser owner docker

Dockerfileからのイメージのビルド

まずはイメージをpullしてきます。

sudo docker pull debian:latest

次にDockerfileを書きます。Dockerfileは以下の通りになります。

Dockerfile


FROM debian
ENV HOME /root

# - - -

RUN apt-get update
RUN echo "Asia/Tokyo" > /etc/timezone && dpkg-reconfigure --frontend noninteractive tzdata

# ユーザー作成

RUN apt-get install -y passwd
RUN apt-get install -y sudo

RUN useradd owner
RUN mkdir -p /home/owner
RUN chown owner:owner /home/owner
RUN echo "owner ALL=(ALL) ALL" >> /etc/sudoers.d/owner

# 設定ファイルのコピー

ADD .zshrc /home/owner/
ADD .vimrc /home/owner/
ADD requirements.txt /home/owner/

RUN apt-get install -y sqlite
RUN apt-get install -y libsqlite3-dev

# ビルドツール

RUN apt-get install -y software-properties-common
RUN apt-get install -y gcc
RUN apt-get install -y g++
RUN apt-get install -y build-essential
RUN apt-get install -y autoconf
RUN apt-get install -y pkg-config
RUN apt-get install -y libtool
RUN apt-get install -y make
RUN apt-get install -y llvm

RUN apt-get install -y curl
RUN apt-get install -y aptitude
RUN apt-get install -y git
RUN apt-get install -y mercurial

RUN apt-get install -y ntp
RUN apt-get install -y unzip
RUN apt-get install -y zsh
RUN apt-get install -y vim
RUN apt-get install -y procps
RUN apt-get install -y net-tools
RUN apt-get install -y xserver-xephyr

# python基本機能周りの依存パッケージ

RUN apt-get install -y openssl
RUN apt-get install -y libreadline-dev
RUN apt-get install -y ncurses-dev
RUN apt-get install -y bzip2
RUN apt-get install -y zlib1g-dev
RUN apt-get install -y libbz2-dev
RUN apt-get install -y libssl-dev

# scipy周りの依存パッケージ
# ココらへんを自前ビルドしたいが
# 今回は割愛

RUN apt-get install -y gfortran
RUN apt-get install -y libopenblas-dev
RUN apt-get install -y liblapack-dev

# matplotlib周りの依存パッケージ

RUN apt-get install -y libpng-dev
RUN apt-get install -y libfreetype6-dev


# Python基本環境セットアップ

RUN apt-get install -y python-setuptools
RUN easy_install pip
RUN pip install virtualenv
RUN pip install virtualenvwrapper

# pyenv設定

RUN git clone git://github.com/yyuu/pyenv.git /home/owner/.pyenv
RUN echo 'export PYENV_ROOT="${HOME}/.pyenv"' >> /home/owner/.zshrc
RUN echo 'if [ -d "${PYENV_ROOT}" ]; then' >> /home/owner/.zshrc
RUN echo '  export PATH=${PYENV_ROOT}/bin:$PATH' >> /home/owner/.zshrc
RUN echo '  eval "$(pyenv init -)"' >> /home/owner/.zshrc
RUN echo 'fi' >> /home/owner/.zshrc
RUN chown -R owner:owner /home/owner/.pyenv
RUN usermod -s /bin/zsh owner
RUN su owner -c "/home/owner/.pyenv/bin/pyenv install 3.4.0"
RUN su owner -c "/home/owner/.pyenv/bin/pyenv install 2.7.9"

# virtualenvwrapper設定

RUN echo 'if [ -f /usr/local/bin/virtualenvwrapper.sh ]; then' >> /home/owner/.zshrc
RUN echo '  export WORKON_HOME=$HOME/.virtualenvs' >> /home/owner/.zshrc
RUN echo '  export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python' >> /home/owner/.zshrc
RUN echo '  export VIRTUALENVWRAPPER_VIRTUALENV=`which virtualenv`' >> /home/owner/.zshrc
RUN echo '  source /usr/local/bin/virtualenvwrapper.sh' >> /home/owner/.zshrc
RUN echo 'fi' >> /home/owner/.zshrc

# - - -
# 言語設定

# RUN apt-get install language-pack-ja
RUN apt-get install locales
RUN locale-gen ja_JP.UTF-8  
ENV LANG=ja_JP.UTF-8  
ENV LANGUAGE=ja_JP:ja  
ENV LC_ALL=ja_JP.UTF-8

# pipインストール
USER owner
ENV HOME /home/owner

RUN /bin/zsh -c "source /home/owner/.zshrc \ 
  && source /usr/local/bin/virtualenvwrapper.sh \
  && mkvirtualenv --python=/home/owner/.pyenv/versions/3.4.0/bin/python3.4 test"

RUN /bin/zsh -c "source /usr/local/bin/virtualenvwrapper.sh \
  && workon test \
  && pip install cython \
  && pip install numpy==1.9.0 \
  && pip install -r /home/owner/requirements.txt"

# - - -
USER root 
RUN apt-get clean && rm -fr /var/lib/apt/lists/* /tmp/* /var/tmp/*

requirements.txt


ipython==2.2.0
nose==1.3.4
numpy==1.9.0
pyramid==1.5.1
scikit-learn==0.15.2
scipy==0.14.0
sympy==0.7.5

これにより基本的なpython開発環境、機械学習パッケージの\
インストールされたイメージを一撃で作ることができます。

このDockerfileのあるディレクトリ内(.zshrc, .vimrc,
requirements.txtも一緒に入れておく)で

sudo docker --dns 8.8.8.8 build -t hogehoge .

をコマンドするとイメージのビルドが始まります。\
(注意)dnsの設定をしてやらないとsqlite周りで落ちます。

(参考)コンテナが参照するDNSを変更

またDockerfileはデバックのためにapt-getを一つづつに分けて行っていますが\
一つ一つの更新に差分が取られるので推奨されていません。


環境設定

ここからはコンテナに入って設定します。 コンテナの起動は

sudo docker --dns 8.8.8.8 run -ti hogehoge /bin/zsh

で出来ます。

パスワードの設定

ビルドしたばかりのイメージはパスワードが設定されていないので設定しておきましょう。

コンテナのシステム言語の変更

dpkg-reconfigure locales

でja_JP.UTF-8に設定します。


コンテナの変更をイメージにコミットする

最後にコンテナに変更を加えたのでイメージにコミットしておきます。

sudo docker commit コンテナのID hogehoge

参考