Blow Up by Black Swan

Dockerとは②〜基本編(dockerfileの使い方)〜

今回は、dockerfileについてまとめました。dockerの基本については、以前の記事を参考にして頂ければと思います。

1. dockerfileとは

dockerfileは、自分専用のimageを作成するための命令文書のようなものです。Dockerの基本的な記述のところでも触れていますが、dockerを作るときはその設計図となるimageからコンテナを構築していきます。このimageを自ら構築するものがdockerfileです。

dockerfileを構築する概要としては、CentOSやubuntuのようなベースとなるimageを入手し、その上に自身が必要となるパッケージをインストールしたり、作業用のディレクトリを作ったり、環境変数を通したりして、自身が必要となるような便利なコンテナを作るというような感じです。

1-1. dockerfileの記述方法

dockerfileの基本的な記述方法は、”命令文␣命令内容”というものです。dockerfileの名称は任意ですが、デフォルトでは”dockerfile”という名称のデータを認識するようになっているらしく、”dockerfile”という名称が無難だと思われます。

1-2. dockerfileの主な命令文

dockerfileの主な命令文は以下になります。

  • FROM <イメージ名>:<タグ(省略可)> -> ベースイメージの指定
  • ENV < path > -> dockerfileの環境変数を指定
  • RUN <[“実行コマンド”]> -> イメージ構築過程で実行されるコマンド。JSONを介しているため、ダブルクオーテーション(“)を使う。exec方式と言われるこの方法が推奨されている。
  • CMD <[“実行コマンド”]> -> 完成したイメージからコンテナが構築される時に実行されるコマンド。1つのファイルに1つのCMDのみ。exec方式が推奨されている。
  • WORKDIR < path > -> コンテナを起動した時の作業ディレクトリを指定する。
  • COPY <ホストOSの対象ファイル> <コンテナのpath>…ホストのファイルをコンテナにコピーする。コンテナのpathは絶対path
  • ADD < src >… < dest(path) > -> < src >で指定されたファイルorディレクトリを< dest >で指定したpathにコピーする

2. dockerfileの基本的な利用方法

次は、dockerfileを基本的な利用方法についてです。

2-1. dockerfileからコンテナを構築する手順

dockerfileからコンテナを構築する手順は以下になります。

1. dockerfileを作成

まずはimages作成用のdockerfileを作成します。

2. "build"コマンドを実行

$ docker buildコマンドを実行し、イメージを構築します。

3. コンテナの生成・起動

$ docker runコマンドを実行し、コンテナを生成・起動します。その後は、dockerの基本的な使い方と同じになります。dockerfileに記述する命令は、端的に言えばコンテナ内で自身で一つ一つコマンドを実行して構築できるものです。そのため、dockerfileを作成する際には、dockerで自分なりのコンテナの構築・設定を行なった上で、それをdockerfileに落とし込んでいくやり方がよいとあるサイトでは書いていました。

2-2. buildコマンド

dockerfileを実行コマンドの記載方法は下記になります。

$ docker build <-t イメージ名;タグ(省略可)> <dockerfileを格納するディレクトリのpath(省略可)>

“-t”オプションではイメージ名を記述することができます。

3. 実際にdockerfileからコンテナを構築してみる

今回も実際に自分で手を動かしてみます。構築するものは、jupyter notebookが使えるコンテナです。Dockerの基本編では、完成されたimageを利用しましたが、今回は自身で構築していきます。imageの構築方針は以下になります。

  1. centOSをOSとする
  2. jupyterを含むpythonパッケージanacondaをインストール
  3. yumからgit、gitからpyenv、pyenvからanacondaという流れでanaconda取得
  4. ボリューム用にホストとの接続用ディレクトリも作っておく(“workbook”と命名)

ちなみにCentOSはLinux系のOSと言われるものですが、Linux系OSには他にもUbuntuなどと呼ばれるものがあり、パッケージ管理コマンドなどに相違があります(yumとaptなど)。また、今回はgitとpyenvを利用することで、anacondaを取得していますが、”IUS Community project”のyumリポジトリと連結するやり方など、他にもやり方はあると思います。以下が実際のコンテナ構築までの流れです。

1. dockerfile格納ディレクトリの作成と移動

$ mkdir docker_test  #任意のディレクトリ名
$ cd docker_test  #ディレクトリの移動

2. dockerfileの作成

docker_test$ touch dockerfile

3. dockerfileへの記述

docker_test$ vim dockerfile

<記述内容>

FROM centos:latest  #ベースイメージ
  
RUN yum -y upgrade  #yumコマンドのアップグレード
RUN yum install -y gcc\  #関連パッケージの一括インストール。バックスラッシュで改行を反映しないようにしている
                   zlib-devel\
                 bzip2\
                   bzip2-devel\
                   readline\
                   readline-devel\
                   sqlite\
                   sqlite-devel\
                   openssl\
                   openssl-devel\
                   git
RUN git clone https://github.com/yyuu/pyenv.git ~/.pyenv  #gitからpyenv取得
RUN echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc  #環境変数の書き込み
RUN echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
RUN echo 'eval "$(pyenv init -)"' >> ~/.bashrc

ENV PATH $PATH:/root/.pyenv/bin  #環境変数の設定(pyenvコマンドを使えるようにするもの)

RUN pyenv install anaconda3-5.1.0  #anacondaのインストール
RUN pyenv global anaconda3-5.1.0  #anacondaをグローバル化
RUN pyenv rehash

RUN mkdir workbook  #ボリューム用のフォルダ作成
RUN mkdir ~/.jupyter   #jupyterの設定用フォルダとファイルを作成
RUN touch ~/.jupyter/jupyter_notebook_config.py

4. dockerfileのbuild

docker_test$ docker build -t original:latest /Users/hoge/docker_test

※このコマンドを実行することにより、dockerfileに沿ったイメージが構築されます。

5. dockerfileで構築したイメージからコンテナの作成

docker_test$ docker run -it  --name test_jupy -p 8888:8888 -v /Users/hoge/docker_test/test_folder:/workbook original:latest

自分で作ったオリジナルのイメージからコンテナを構築し、ボリューム用のディレクトリをホスト側のディレクトリと連結しています。

6. jupyterの設定

・jupyterのパスワードの設定

$ ipython  #ipythonの呼び出し

In [1]: from notebook.auth import passwd

In [2]: passwd()
Enter password:  #パスワードの入力
Verify password:  #パスワードを再度入力
Out[2]: 'sha1: ~~ ’ #波線部分にパスワードのハッシュ値が打ち出される

In [3]: exit() #ipythonから抜け出し

・設定ファイルへの書き込み

$ vim ~/.jupyter/jupyter_notebook_config.py #jupyterの設定を書き込み
#書き込み内容
c = get_config()
c.NotebookApp.ip = '*'
c.NotebookApp.open_browser = False
c.NotebookApp.port = 8888
c.NotebookApp.password = u'sha1: ~~ ’  #パスワードのハッシュ値を入力

7. jupyterの実行

$ jupyter notebook --allow-root

ブラウザで任意のIPアドレス(http://127.0.0.1:8888/など)を入力することでjupyterにアクセスできます。アクセスするとパスワード入力画面が表示されるので、そこに設定したパスワードを入力することでjupyterが使えるようになります。

―allow-rootは、ルートユーザーからjupyterノートブックを走らせるのを許可するコマンド

以上がdockerfileを利用して、一からjupyter notebookを使えるようにする流れです。jupyterの設定部分までを取り込んでしまうやり方などもあるのかなと思うので、まだまだ色々な改善はできるのかなと思います。次の記事では、docker composeについて記載していますので、参考にして頂ければと思います。