クラウドデータサイエンティストになるための第一歩:「Dockerを使えるようになろう」
Pythonコードを実行しようとしたときや、ライブラリを更新した後に問題が発生したことはありませんか?または、他人が作成したPythonコードを試してみたものの、うまく動作しなかった経験はありませんか?
もしそうした経験で悩んでいるなら、Dockerやコンテナ技術を学ぶ時が来たのかもしれません!
Dockerやコンテナについて説明した記事は数多く存在するため、ここでは詳細な説明は行いませんが、データサイエンティストがDockerを利用するメリットとして一つ覚えておいていただきたいのは、「Pythonコードを実行するための環境を再現できる」という点です。
Dockerを使わない場合、どのようにして環境を再現できるか?
例えば、プロジェクトのチームメンバーがPythonコードの一部を共有してきて、それに新しい機能を追加してほしいと依頼されたとします。そのコードを実行してみたところ、なぜかうまく動作しない。メンバーは「コード自体には問題がない」と言っているので、原因は別の場所にあるはずです。
問題の原因として考えられるのは、実行環境のPythonのバージョンが異なること?または、使用しているライブラリのバージョンがあなたの環境と異なっていること?
原因を突き止めるために、ライブラリをアップデートまたはダウングレードして、コードが動作する環境に調整していく必要があるかもしれません。場合によっては、異なるPythonバージョンを使用するためにPython自体を再インストールする必要もあるかもしれません。
考えるだけでもとても面倒ですよね?
だからこそ、Dockerは開発者やデータサイエンティストの間で人気があるのです。Dockerを使えば、コードを実行するための正しい環境を再現することができます。
Dockerインストール
Dockerのインストール方法は他のサイトでも紹介されていますので、簡単にWindows環境でのインストール方法を紹介します。
Dockerアカウントを作成する。もしくはGoogleやGithubアカウント連携をする
Docker DesktopをDownload&インストールする。
Windows環境のWSL2を有効化する
Docker Desktopは、**Windows Subsystem for Linux 2(WSL 2)**に依存しているため、WSL 2を有効にする必要があります。今はDocker DesktopをインストールするタイミングでWSL2の有効化まで行ってくれますが、もしインストールできていない場合、以下の手順でインストールします。
Windowsの「機能の有効化または無効化」を開く
「スタートメニュー」を開き、「Windowsの機能の有効化または無効化」を検索して開きます。WSLと仮想化機能を有効にする
「仮想マシンプラットフォーム」
「Windows Subsystem for Linux」 の両方にチェックを入れます。
WSL 2のインストール
WSL 2をインストールするため、PowerShellを管理者権限で開き、以下のコマンドを実行します:
wsl --install
Docker Desktopのセットアップ
Docker Desktopを起動
インストールが完了したら、Docker Desktopを起動します。初期設定
初めてDocker Desktopを起動すると、セットアップウィザードが表示されることがあります。指示に従って設定を進めます。設定確認
Docker Desktopのメイン画面で、WSL 2を使用する設定になっていることを確認します。また、必要に応じて、Dockerのリソース(CPU、メモリ、ディスク)を調整することもできます。
動作確認
Dockerが正しくインストールされているか確認
PowerShellまたはコマンドプロンプトを開き、以下のコマンドを実行します:
docker --version
Dockerの動作確認
以下のコマンドで、Dockerが正常に動作していることを確認します:
docker run hello-world
このコマンドが正常に実行され、「Hello from Docker!」というメッセージが表示されれば、Dockerが正しく動作しています。
Dockerインストール後のチュートリアル
ここでは実際にDockerを使ってコンテナ環境を作成する手順を説明します。
まず、新しいDockerイメージを作成するところから始めましょう。このイメージは、作成する環境の仕様のようなものです。以下が手順です。
Docker Hubで配布されているベースイメージを元にDockerイメージをビルドします。
「Explore」をクリックします。
ページ上にリストが表示されます。以下のスクリプトをDockerFileに記述することで、ベースイメージからDockerイメージを作成できます。
FROM {BASE-IMAGE-NAME}:{VERSION}
以下のページに表示されている各項目のタイトルが「ベースイメージ名 (BASE-IMAGE-NAME)」です。
例えば、赤線で強調表示されている「tensorflow/tensorflow」がベースイメージ名です。
さらに、項目をクリックすると、詳細ページで「バージョン (VERSION)」を確認することができます。
ページをクリックすると、そのイメージの説明が表示されます。そこに「タグ (tag)」タブがあります。このタブで「バージョン (VERSION)」を確認することができます。
以下のページでは、2つのタグが表示されています。それぞれの名前が「バージョン (VERSION)」に該当するテキストです。
まとめると、以下の例のようにDockerイメージ (DockerImage) を定義することができます。
FROM tensorflow/tensorflow:nightly-jupyter
イメージをビルドする
イメージをビルドするには、docker build コマンドを使用します。Dockerfile があるフォルダに移動した後、ターミナルで次のコマンドを実行します。これにより、Dockerfile で定義された Docker イメージ (DockerImage) が作成されます。al. Then, DockerImage defined by the Dockerfile will be created.
docker build .
イメージに名前を付けたい場合は、-t 引数を使用してイメージ名を指定することができます。
docker build -t {base-image-name}:{version} .
次のコマンドを使用して、イメージを確認できます。イメージに名前を付けていれば、その名前が表示されます。名前を付けていない場合は、「none」と表示されます。
docker images
イメージを実行する
それでは、イメージを実行してみましょう。以下のコマンドを使用して、自分のイメージを実行することができます。
docker run -it {base-image-name}:{version}
その後、ターミナルウィンドウでコンテナ環境にアクセスする方法が表示されます。ただし、Dockerイメージが FROM 句を含むスクリプトを持っている場合、コンテナ環境にアクセスできないことがあります。この場合、イメージを正常に実行するには不完全な状態となります。
通常、Windowsユーザーは Ctrl + C を使用してコンテナを停止することができます。
コンテナが停止しているかどうかをチェックします
docker ps
Docker Hubからすぐに使えるイメージを基にイメージをビルドする
上記のコマンドは、Docker Hubで取得したベースイメージを元に自分のイメージをビルドするためのスタートポイントです。実際には、これらのイメージは修正なしでそのまま使用することができます。これを実現するには、docker pull コマンドを実行します。
イメージを使用したい場合、まず最初にDocker Hubで使用するイメージを見つける必要があります。イメージの詳細ページには、以下のようにイメージを引き込むためのコマンドが表示されています。
この場合、以下のように設定します。
docker pull tensorflow/tensorflow:nightly-jupyter
イメージをプルした後、上記と同様に「docker images」コマンドを使ってイメージを確認できます。さらに、このイメージは「docker run」コマンドを使って実行することもできます。
ちなみに、実際には、ポート番号やユーザーアクセス制御などの追加設定を変更する必要があるため、上記のようにただイメージを実行するだけでは問題が発生する可能性があります。その場合は以下のようにポート番号等の設定をする必要があります。
docker run -it -p 8888:8888 tensorflow/tensorflow:nightly-jupyter jupyter notebook --ip=0.0.0.0 --allow-root
これによって jupyter noteboook が立ち上がったはずです。
— docker run コマンドの --rm オプション
Dockerを使用する際に注意すべきことの一つは、ストレージの消費です。docker ps コマンドを実行すると、コンテナイメージのサイズ単位がギガバイトであることに気づくかもしれません。ローカルホストに複数のイメージがある場合、ストレージがすぐにいっぱいになってしまいます。その上、コンテナを起動するには追加のスペースが必要です。各コンテナインスタンスはDockerイメージを共有しますが、それでもスペースを節約することが重要です。そのため、docker run コマンドには --rm オプションを使用することが推奨されます。このコマンドは、コンテナを閉じた際に自動的にそのインスタンスを削除するため、インスタンスがシャットダウンしても占有しているスペースを節約するのに役立ちます。
docker run --rm ubuntu
もしDockerインスタンスを手動で停止させたい場合、rmコマンドで直接停止るすることもできます。
docker rm {container id}
# if you want to delete all the instances STOPPED
docker container prune
# if you want to delete ALL the instances
docker rm $(docker ps -a -q)
コンテナIDは以下のコマンドで一覧表示して検索することができます。
docker ps -a
イメージ自体を削除する
上記のコマンドはDockerコンテナインスタンスを削除するものです。しかし、イメージ自体を削除したい場合は、docker rmi コマンドを実行する必要があります。
docker rmi {image id}
イメージは「docker images」コマンドで確認できます。このコマンドを実行するには、そのイメージに基づいたインスタンスがないことが必要です。もしインスタンス(停止しているものも含む)が存在する場合、このコマンドは失敗します。
まとめ
この記事は、Dockerコンテナのライフサイクルを追うためのチュートリアルでした。次回は、Dockerfileの詳細な書き方について紹介します。