(初心者向け) Dockerをカスタマイズして使うシンプルな方法
はじめに
DockerはOSとライブラリーをパッケージして管理するためのソフトウェアです。
OSとライブラリーのパッケージはコンテナと呼ばれ、あるマシン上に複数のコンテナを構築しそれぞれ独立に管理することができます。
利点としては、ソフトウェアを複数のマシンで動かすための環境構築のしやすさがあります。
あるマシン上でコンテナを構築しておけば、別のマシンでも同じコンテナを動かすことができます。
別の利点としては、あるマシン上で複数のソフトウェアの運用のしやすさがあります。
例えば、1つのマシン上でソフトウェアAとソフトウェアBを運用しているとして、それらが共通のライブラリーを使っているとします。
ソフトウェアAがアップデートされ、それに伴いライブラリーもアップデートを行うと、ソフトウェアBの挙動が変わり、最悪、動かなくなることは起こりえます。
特に、データサイエンスのプロジェクトでは、複数のモデルを運用したい状況はよくあり、それぞれのモデルがlightgbm、TensorFlow、PyTouchなどことなるソフトウェアで構築されているとします。lightgbmの更新のタイミングでpandasやscipyなどのバージョンも更新され、TensorFlowまたはPyTouchの挙動がかわりモデルの予測性能も変わることが起こりえます。
このような状況でも、モデルごとに使うOSとライブラリーを別々のコンテナを作成することにより、ライブラリのバージョン管理に悩まされることなく効率よくモデルを運用することができます。
このようなことは、多くのブログ記事にかかれているのですが、初歩からコンテナを作成、カスタマイズして使う方法を解説した記事は見当たりませんでした。
ベースとなるOSを指定してインストールしたいライブラリーを記述したDockerfileと呼ばれるファイルを用意し、コマンド一発でコンテナを作成する方法を解説したブログ記事はあるのですが、目的とするライブラリーをインストールするための試行錯誤に多くの時間がかかります。
そこで、Dockerfileを使ってスマートにコンテナ構築する方法は他の解説に任せることにして、この記事ではOSのインストールからコンテナの作成をDockerfileに頼ることなく一歩一歩行うための方法を紹介します。
実行環境はmac上jにupyterlabをインストールしたコンテナを作成して使用することを想定しますが、ここで解説する方法は他のマシンやコンテナを作成するために役立つはずです。
Dockerのインストール
インストール用のdmgファイルが下のサイトからダウンロードできるので、それに従ってインストールします。
https://matsuand.github.io/docs.docker.jp.onthefly/desktop/mac/install/
ベースとなるコンテナイメージファイルのダウンロード
上記の方法でdockerをインストールすると、ターミナル上でdockerコマンドが使えるようになります。
dockerコマンドで、ubuntuのコンテナイメージファイルをダウンロードします。
ここではubuntuの最新バージョンを指定しています。
docker image pull ubuntu:latest
インストールに成功するとubuntuイメージファイルがダウンロードできたことが確認できます。
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest a6be1f66f70f 2 weeks ago 69.2MB
コンテナイメージファイルからコンテナの作成
次にubuntuイメージファイルからcreateコマンドを使ってコンテナを作成します。
docker create —name container-ubuntu ubuntu:latest
—nameでコンテナの名前を指定します。ここでは、container-ubuntuを指定しています。
docker container ls -a
でdockerにインストールされているcontainerが確認できます。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8494ead1635f ubuntu:latest "/bin/bash" 25 hours ago Exited (0) 16 hours ago container-ubuntu
コンテナの起動
次にstart, attachコマンドにてコンテナを起動します。
docker start container-ubuntu
docker attach container-ubuntu
これで、ubuntuが入ったコンテナが起動し、ubuntuのターミナルに入ります。
ライブラリのインストール
ubuntuのパッケージ管理コマンドaptにて必要なソフトをインストールします。
この例はjupyterlabをインストールすることが目的なので、以下のコマンドでライブラリーをインストールしていきます。
apt update
apt upgrade
apt install -y python3-pip
apt install curl
curl https://sh.rustup.rs -sSf | sh
source "$HOME/.cargo/env"
pip3 install --upgrade pip
pip install jupyterlab
pip install numpy
pip install scipy
このライブラリーのインストール作業がインタラクティブに行えることがDockerfileを使わない方法の利点です。インストール作業にはライブラリ間の依存関係を解消するために試行錯誤必要となります。Dockerfileを使うとこの作業に時間がかかることになります。
ここまでできたら、control+p, qでコンテナを抜けます。
exitコマンドでもコンテナから抜けることができますが、コンテナが停止してしまいます。この場合はstartで再起動します。
新しいイメージファイルの作成
commitコマンドを使ってライブラリをインストールしたコンテナ(container-ubuntu)からイメージファイル(container-ubuntu-img-ver1)を作成します。
docker commit container-ubuntu container-ubuntu-img-ver1
jupyterlabの起動
これでjupyterlabをコンテナ上で起動できるようになります。
docker run -it -p 8888:8888 --rm --mount type=bind,src=`pwd`,dst=/workdir container-ubuntu-img-ver1
ubuntuのターミナルが表示されるので、jupyterlabを起動します。
jupyter-lab --ip=0.0.0.0 --port=8888 --no-browser --allow-root --NotebookApp.token=""
最後にブラウザーから
http://localhost:8888/lab
にアクセスするとjupyterlabを使うことができます。
以下はdockerのおすすめ本です。初心者にもわかりやすい本でした。
dockerについてより詳しく知りたい方は以下の本が参考になります。