Address
304 North Cardinal St.
Dorchester Center, MA 02124
Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM
Address
304 North Cardinal St.
Dorchester Center, MA 02124
Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM
今回は世界最大級のデータサイエンスコンペティションKaggleのために、Docker Desktopを使って簡単なコンテナを作る方法を解説します。
Contents
正直なところ個人でPythonプログラミングを楽しんだり、Kaggleを楽しむだけならばDockerを使う必要はなく、Python仮想環境を自分のパソコンに構築するだけで十分でしょう。
しかし、
という場合に、それら複数のPCの間でフォルダ(またはディレクトリ)の構造、その名前、さらにはそこに存在するファイルなどについても全く同じにしたいとか、しかもそれらを自動的に行いたいときはDockerを使うほうが便利だったりします。
覚えるべきことは増えますが、Dockerの超基本的な使い方に慣れておくだけでも損はないと思いますので、今回はVSCodeを使ってKaggle用の簡単なDockerコンテナづくりを解説します。
なお、今回の記事で作ったフォルダやデータなどはこの画像のように、Githubリポジトリとして公開してあるのでそちらもご覧ください。次のリンクまたは上画像をクリックしてください。
→Github 1978Works:Docker-Container-For-Kaggle-Titanic-Project
次からの作業が面倒ならば、もうこのリポジトリ(ブランチはmaster)からクローンして使ってみてください。その場合は次のコマンドを実行してください。(GitやGithubの使い方の説明は省きます)
git clone --branch master git@github.com:1978works/Docker-Container-For-Kaggle-Titanic-Project.git
ではDocker DesktopとVisual Studio Code(以下VSCode)を起動させてから、以下の作業を順番に進めていきましょう。
今回は下記作業3で説明するように、Pythonのrequirements.txtを使ってモジュールなどを一括インストールする方法を使います。ですが必要なモジュールやライブラリはみなさんの事情によって異なるはずです。みなさんの環境にあわせてrequirementx.txtを用意してください。
なお、今回私が用意したrequirements.txtの中身は次のとおりです。
anyio==4.3.0
argon2-cffi==23.1.0
argon2-cffi-bindings==21.2.0
arrow==1.3.0
asttokens==2.4.1
async-lru==2.0.4
attrs==23.2.0
Babel==2.14.0
beautifulsoup4==4.12.3
bleach==6.1.0
certifi==2024.2.2
cffi==1.16.0
charset-normalizer==3.3.2
comm==0.2.1
contourpy==1.2.0
cycler==0.12.1
debugpy==1.8.1
decorator==5.1.1
defusedxml==0.7.1
executing==2.0.1
fastjsonschema==2.19.1
fonttools==4.49.0
fqdn==1.5.1
h11==0.14.0
httpcore==1.0.4
httpx==0.27.0
idna==3.6
ipykernel==6.29.3
ipython==8.22.2
ipywidgets==8.1.2
isoduration==20.11.0
jedi==0.19.1
Jinja2==3.1.3
joblib==1.3.2
json5==0.9.20
jsonpointer==2.4
jsonschema==4.21.1
jsonschema-specifications==2023.12.1
jupyter==1.0.0
jupyter-console==6.6.3
jupyter-events==0.9.0
jupyter-lsp==2.2.3
jupyter_client==8.6.0
jupyter_core==5.7.1
jupyter_server==2.13.0
jupyter_server_terminals==0.5.2
jupyterlab==4.1.2
jupyterlab_pygments==0.3.0
jupyterlab_server==2.25.3
jupyterlab_widgets==3.0.10
kiwisolver==1.4.5
MarkupSafe==2.1.5
matplotlib==3.8.3
matplotlib-inline==0.1.6
mistune==3.0.2
nbclient==0.9.0
nbconvert==7.16.1
nbformat==5.9.2
nest-asyncio==1.6.0
notebook==7.1.1
notebook_shim==0.2.4
numpy==1.26.4
overrides==7.7.0
packaging==23.2
pandas==2.2.1
pandocfilters==1.5.1
parso==0.8.3
pexpect==4.9.0
pillow==10.2.0
platformdirs==4.2.0
prometheus_client==0.20.0
prompt-toolkit==3.0.43
psutil==5.9.8
ptyprocess==0.7.0
pure-eval==0.2.2
pycparser==2.21
Pygments==2.17.2
pyparsing==3.1.1
python-dateutil==2.9.0.post0
python-json-logger==2.0.7
pytz==2024.1
PyYAML==6.0.1
pyzmq==25.1.2
qtconsole==5.5.1
QtPy==2.4.1
referencing==0.33.0
requests==2.31.0
rfc3339-validator==0.1.4
rfc3986-validator==0.1.1
rpds-py==0.18.0
scikit-learn==1.4.1.post1
scipy==1.12.0
seaborn==0.13.2
Send2Trash==1.8.2
setuptools==69.1.0
six==1.16.0
sniffio==1.3.1
soupsieve==2.5
stack-data==0.6.3
terminado==0.18.0
threadpoolctl==3.3.0
tinycss2==1.2.1
tornado==6.4
traitlets==5.14.1
types-python-dateutil==2.8.19.20240106
tzdata==2024.1
uri-template==1.3.0
urllib3==2.2.1
wcwidth==0.2.13
webcolors==1.13
webencodings==0.5.1
websocket-client==1.7.0
wheel==0.42.0
widgetsnbextension==4.0.10
などが含まれています。
さて、まず必要なフォルダ(MacやLinuxでいうとディレクトリ)を作っていきましょう。今回私は、次のようなフォルダ構成としました。
Kaggle>Docker-Container-For-Kaggle-Titanic-Project>.devcontainer>dataset
まずKaggleというフォルダを作り、その中にDocker-Container-For-Kaggle-Titanic-Project(タイタニックのデータ分析をするプロジェクト用)というフォルダを、さらにその中に、.devcontainer(最初のピリオドを忘れずに。この名前はそのままにしてください)というフォルダを作りました。
そして、そのフォルダ「.devcontainer」の中に、Kaggleで使うデータを入れたフォルダ「dataset」を作って、分析用データを入れています。今回はTitanic号のデータとして次の3つのCSVファイルを入れています。
これらのCSVファイルはKaggleのタイタニックのプロジェクト(コンペティション)からダウンロードしたものです。
さて今回の記事ではそのフォルダ「.devcontainer」の中身は最終的につぎの画像のようになります。
VSCodeにおいて新規ウインドウを作成します。次にそのウインドウにおいて、上の作業で作ったフォルダ「Docker-Container-For-Kaggle-Titanic-Project」を開きます。「.devcontainer」ではなく、その1つ上の階層のフォルダを開いてください。
Pythonのpipではすでにインストールしているモジュールやライブラリなどの一覧表をリストにして、外部ファイルに保存できる機能が備わっています。
その外部ファイルを違うPython環境のpipで使うことで、その環境にも一度にまとめて必要なモジュールなどをインストールできます。
これについては次の記事をご覧ください。
こうした作ったrequirements.txtをフォルダ「.devcontainer」の中にいれておきます。
のちの作業でここで作成したrequirements.txtを使い、普段使っているモジュールやライブラリなどを一気にインストールさせます。
なお、requirements.txtの中身が「モジュール==バージョン」という形式となる場合が多いでしょうが、その場合バージョンを指定していることになるため、モジュールやライブラリのバージョンと、Pythonのバージョンが適合せず、インストールするとエラーとなる可能性もあります。
その場合はバージョン情報を全て削除した内容とするか、あるいはそもそもrequirements.txtを使わない方向を考えましょう。
心配ならば、最初からrequirements.txtを使わずに、まずDockerコンテナを作ってから、その後に必要なモジュールなどを1つずつpip installを使ってインストールしていくとよいでしょう。
次にフォルダ「.devcontainer」内部に、次2つのファイルを作ります。どちらもこの時点では中身は空でかまいません。次の作業で記述していきます。
拡張子の有無やスペルミスに注意してください。
Dockerfileの記述は次のようになります。
FROM python:3.12
#説明:Dockerhubから、Python3.12のイメージをダウンロードしてコンテナにインストールする。バージョンを指定しないと自動的に最新版が設定される
WORKDIR /working_dir
#説明:devcontainer.jsonで設定されたバインドマウント用ディレクトリ「workspace」をカレントディレクトリ(作業ディレクトリ)として設定しておく(後述のrequirements.txtを利用するため)
COPY . .
#説明:.devcontainer内部のファイルを全て、/working_dirにコピー
RUN pip install --upgrade pip
#説明: pipそのものを最新にしておく
RUN pip install -r requirements.txt
#説明:コンテナ内のカレントディレクトリにあるrequirements.txtを使って必要なモジュールなどを一括インストール
このDockerfileのうち、
RUN pip3 install -r requirements.txt
この部分ですが、先述またはコメントアウトで書いてあるとおり、Pythonのバージョンによっては使えないモジュールやライブラリが出てきますので、そのあたりのエラーに悩みたくない場合は、
# RUN pip3 install -r requirements.txt
このように「#」を先頭につけてコメントアウトしておきましょう。こうすればこの部分は処理されません。このようにした場合は、コンテナを作成した後で、「pip install」をコンテナ内部で実行して必要なモジュールなどをいつものようにインストールしていきましょう。
devcontainer.jsonの記述は次の通りです。
{
// devcontainarとして表示される名前
"name": "Kaggle with Python3.12",
// Dockerfileを使うときは必須の設定
"build": {
// devcontainer.jsonとDockerfileは同じディクトリにあるので、今回はこのようなパス表記
"dockerfile": "Dockerfile"
},
// workspacespaceFolderの設定が必要。ホストPCの.devcontainerの1つ上のフォルダを、、コンテナの/vsc_workspaceへバインドマウント
"workspaceMount": "source=${localWorkspaceFolder},target=/workspace,type=bind,consistency=cached",
// workspaceMountの設定が必要
"workspaceFolder": "/workspace",
//
"customizations": {
// VSCode専用の設定
"vscode": {
// ワークスペースのウインドウの色とかを設定
"settings": {},
// 使いたいVSCode拡張機能のIDを指定
"extensions": [
"ms-python.python",
"ms-toolsai.jupyter",
"ms-azuretools.vscode-docker",
"eamodio.gitlens",
"mechatroner.rainbow-csv",
"njpwerner.autodocstring"
]
}
}
}
基本的にはコメントアウトで書いた通りですので、特に説明は不要かと思います。
ここで拡張機能のIDをどうやって取得するのか問題となりますが、以下の記事でその方法を解説しているのでご覧ください。
ではコンテナを作ってみましょう。つぎの画像をみてください。
VSCodeのこの丸印の部分をクリックします。
VSCodeの上部でメニューが展開され、そこに「Reopen in Container」という項目があるので、それをクリックします。自動的にDockerへの接続とコンテナの作成が始まります。数分程度の時間がかかると思います。クッキーでも食べながらのんびりしましょう。
問題なく完了すれば、VSCode上に新しいウインドウが現れ、上の画像のようにdevcontainer.jsonの項目nameで指定した名前が表示され、コンテナの作業ディレクトリとして指定したディレクトリ「workspace」が展開された形で表示されます。あくまでこの画面は、コンテナ内部にあるworkspaceというディレクトリの中身を表示しているという点に注意しましょう。
実際、そのウインドウにおけるターミナルを見てみましょう。
ここでもコンテナ内部のターミナルが表示されています。したがって、このターミナルで入力したコマンドなどはコンテナに対して実行されます。
次にDocker Desktopの画面をみてみましょう。コンテナ一覧のところに新しくできたコンテナが表示されているでしょう。
そのできあがったコンテナをクリックしてみましょう。次のような画面となります。
「File」という項目(画像中丸印)があるのでクリックすると、コンテナ内部のディレクトリ構造とファイルを見ることができます。
今回はその中に、Dockerfileで作業ディレクトリとして指定したディレクトリ「working_dir」と、DockerfileのCOPY命令によって同ディレクトリにコピーされたファイルが存在していることが確認できます。
さらに、devcontainer.jsonで設定したバインドマウント用のフォルダ「workspace」も存在していること、その中身が、ホストPC上でのファイルと同じものであるのも確認できるでしょう。
このDockerにおけるバインドマウントについては、次の記事をご覧ください。大雑把な説明ですがイメージは理解してもらえると思います。
では作ったコンテナについてのVSCodeのターミナルを使って動作確認などをしてみましょう。試しにコンテナにインストールされたPythonのバージョンを調べます。
python -V
と入力して実行すると、
ターミナルでのカレントディレクトリが、コンテナ内部の「workspace」というフォルダ(ディレクトリ)になっている点を確認してください。
このように、今回のDockerfileで指定したとおりの3.12系のPythonがインストールされていることがわかりました。あとはpip installを使って追加で必要なライブラリをインストールしたり、簡単なPythonのプログラムを作って動作を確かめてみてください。
また、上述のようにこの記事用のGithubのリポジトリを公開していますが、その中には、Jupyternotebook用のtest01.ipynbもあります。
→Github 1978Works:Docker-Container-For-Kaggle-Titanic-Project
今回のDockerコンテナ環境はJupyterが動くようにしてあるので、そのipynbファイルも動かしてみてください。次のように動作するはずです。
ただしカーネルを正しく設定できているかを確認してください。下の画像を参考にして、コンテナにインストールしたPythonのバージョンを選んでください。
矢印①の部分が「Select Kernel」となっていれば、ジュピターが動く適切な環境になっていません。その場合、その部分を押すと、適切なPython環境/バージョンを選ぶ項目(矢印②)がでてくるので、そこから適切な環境を選んでください。今回はコンテナにPython3.12をインストールしたので、それを選んでいます。
以上お疲れ様でした。このようにDocker環境を作っておくとパソコンの買い替えや、複数台の異なるOSのパソコンで同じ環境を作りたいときにとても便利です。このDockerの使い方を学べる次のような動画講座もあります。
世界最大の動画学習サイトUdemyのおすすめDocker講座【PR】
世界最大級のオンライン学習プラットホームUdemy(ユーデミー)では、Pythonやデータ分析の様々な講座が用意されています。大幅に割引されるセールもよく開催されています。