Docker Anaconda で汎用開発コンテナーを構築


こんにちは、切口太郎です。

前回までは、VS Code の Remote Container 拡張機能から、Docker Desktop for Windows で動作するPython Docker Image をビルドしてサンプルアプリケーションを実行してみました。

今回は汎用的な開発環境として利用できる Docker Image を構築して VS Code を使用して実際の開発ができる環境を作っていきます。

Docker は コンテナー 内部に永続化データをもたせるようにできていません。
コンテナー内部にデータやソースを記述しても、新しい Docker Image が配布された時点で消去されてしまいます。

この仕様は複数人数でも同じ環境を維持できる素晴らしい仕組みなのですが、開発中のソースやデータベースに設定した試験用データもなくなるのでは、開発になりません。

そこで、Docker は、イメージとは別に永続化の機能を持っています。

volume
dockerから docker の管理エリアの任意に領域を volume として保持する。
Docker Image とは独立している。
bind
ホストのディレクトリーを docker のボリュームとして利用する。
tmpfs
コンテナー専用の一時ファイル
コンテナーが停止するとデータは消滅する。

このうち、tempfs は、永続化できないので、利用する場合には、volume か OS ファイルの bind を利用することになります。

1 汎用Python開発環境の構築


今回は、ノマドワーカーPCで Python の環境を構築するのが目的なので、以下のデザインで開発環境を構築します。



プログラムソースを格納するディレクトリーは、Docker の Volume で作成します。
ソースはGITで出し入れを行います。

データベースのテーブルなど、データの格納にはホストOS上のディレクトリーをマウントして利用します。
データベースのテーブルは、外部のHDなどを使用したい場合が多いと思うのでこのようにしました。
また、この方法だと複数のデータベーステーブルを用意してマウントでデータベースを切り替えることができます。
再現テストの時にデータベースを切り替えられると便利です。

ベースにする Docker image は、コミュニティ版の Annaconda3 を Docker Hub から取得して利用します。

この方法で開発に必要なリソースをDocker 内部に収める事ができます。

また、開発中のソースファイルと開発環境は、クラウド上に置くことにより、クライアントマシンに不具合があったときにも迅速に環境を復元することができ、
最新のソースと開発環境を、開発チーム全体で同期することができます。

今回はこのデザインで環境を構築し、VS Code のリモートコンテナーで接続して利用します。


2 ベースコンテナーの選定


ベースの Docker イメージを Docker Hub から取得します。

汎用的といえば Python では もちろんAnaconda ですので、Anaconda の Docker イメージをベースとして使用します。


Anaconda の Docker イメージはここから取得します。


3 永続化用ボリューム


GIT管理をするソース用のボリュームとデータベースなどのデータを管理するためのボリュームを割り当てます。

GITでソース管理するボリュームは、コンテナー管理のボリュームにするので、コンテナーのコマンドを利用してボリュームを生成します。
Windows の「コマンドプロンプト」から volume 作成のコマンドを入力します。

C:\>docker volume create --name source
source

C:\>docker volume ls
DRIVER              VOLUME NAME
local               source

source といボリュームが作成できています。

なんか、コマンドプロンプトが新鮮です。


次に、Docker Hub から Comminuty 版の Anaconda3 のイメージを Pull して Docker に落とします。

C:\>docker run continuumio/anaconda3
Unable to find image 'continuumio/anaconda3:latest' locally
latest: Pulling from continuumio/anaconda3
c5e155d5a1d1: Pull complete
86534c0d13b7: Pull complete
5764e90b1fae: Pull complete
ba67f7304613: Pull complete
Digest: sha256:2342379103968c3a45c8f49517ab2dff7638dd6a3842cb9cff9792acd92fa928
Status: Downloaded newer image for continuumio/anaconda3:latest

Anaconda3のフルセットが格納された イメージなので、Pull にはかなりの時間がかかります。

今回は C:/database というディレクトリーを作成しました。
このディレクトリーを Docker のボリュームとしてマウントします。

C:\>docker run --name anaconda3 -v source:/opt/source -v /c/database:/opt/database  -it continuumio/anaconda3 /bin/bash
(base) root@78b69b0876b4:/# 

コンテナーの中に入りました。プロンプトが、Python の (base) になっています。

ボリュームがマウントされているか確認します。
太字の部分がマウントされているボリュームです。 /opt/source と /opt/database がマウントされていますね。

(base) root@78b69b0876b4:/# df
Filesystem     1K-blocks     Used Available Use% Mounted on
overlay        122774448  7016864 109491256   7% /
tmpfs              65536        0     65536   0% /dev
tmpfs            2524632        0   2524632   0% /sys/fs/cgroup
/dev/sda1      122774448  7016864 109491256   7% /opt/source
//10.0.75.1/C  313940988 96970632 216970356  31% /opt/database
shm                65536        0     65536   0% /dev/shm
tmpfs            2524632        0   2524632   0% /proc/acpi
tmpfs            2524632        0   2524632   0% /sys/firmware
(base) root@78b69b0876b4:/#
(base) root@78b69b0876b4:/# python
Python 3.7.3 (default, Mar 27 2019, 22:11:17)
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas as pd
>>> quit()
(base) root@78b69b0876b4:/#

4 VS Code で Docker Container に接続


VS Code を起動して、Control + Shift + P でコマンドパレットを開きます。
Remote container と入力すると候補が出てきます。

Anaconda3 の Docker Container は、稼働中ですので、Rmote-Contiainers: Attach to Running container... を選択します。


稼働しているコンテナーの一覧を表示します。
/anaconda3 を選択します。



新しい VS Code のウインドウが開きます。

右下の通知バーに [installing dev container ......] と表示されますので、終了するまで待ちます。
稼働中のコンテナーへ接続すので、それほど時間はかかりません。
(待っていると長く感じますが・・・・)

控えめの表示ですが、無事接続できました。

/opt/source フォルダーを開いてみます。

接続できました。何も入っていないので、表示がのっぺらぼうです。



次に、ターミナルを開いてみます。

Control + Shift + @ で開きます。

Anaconda の basse 環境でターミナルが開きました。
ユーザーは root になっています。

普通はすぐにこの画面になりますが、たまにプロンプトが表示されないときがあります。
その時は、白矢印の選択ボックスを切り替えると表示されます。


5 Git から永続化ボリュームにソースをクローン


ソースフォルダーに GIT から Python プログラムをクローンしてみます。

できましたね。



ファイルもエクスプローラーパネルから参照できています。



さて、肝心のボリュームデータですが、コンテナーを終了して再起動してもGITのファイルは消えないで残っているのでしょうか?
試してみます。

6 再起動して永続化ボリュームを確認


VS Code を終了して、Anaconda Container を終了します。
終了したか確認してみます。
終わっています。

(base) root@78b69b0876b4:/# exit
exit

C:\>docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES


一応、残骸も確認しておきます。
残骸があったので、まっさらな状態で起動するように、残骸を削除しておきます。

C:\>docker ps -a
CONTAINER ID        IMAGE                                                           COMMAND                  CREATED             STATUS                        PORTS               NAMES
8c76ea6783e0        continuumio/anaconda3                                           "/usr/bin/tini -- /b…"   36 seconds ago      Created                                           anaconda3
7484bf645580        vsc-vscode-remote-try-python-0b0fc253a90a1ad39d632b7c09cf69b1   "/bin/sh -c 'echo Co…"   25 minutes ago      Exited (137) 19 minutes ago                       agitated_volhard
cd18ab96fd58        busybox                                                         "sh"                     22 hours ago        Exited (0) 22 hours ago                           volume-manager

C:\>docker rm 8c76ea6783e0
8c76ea6783e0

C:\>docker rm 7484bf645580
7484bf645580

C:\>docker rm cd18ab96fd58
cd18ab96fd58

C:\>docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

いろいろテストしていたので残骸だらけでした。
全部消してスッキリしました。


anaconda3 コンテナーを起動します。
無事起動できたので、マウントを調べました。

C:\>docker run --name anaconda3 -v source:/opt/source -v /c/database:/opt/database  -it continuumio/anaconda3 /bin/bash
(base) root@0a320850e2cb:/# df
Filesystem     1K-blocks     Used Available Use% Mounted on
overlay        122774448  7183076 109325044   7% /
tmpfs              65536        0     65536   0% /dev
tmpfs            2524632        0   2524632   0% /sys/fs/cgroup
/dev/sda1      122774448  7183076 109325044   7% /opt/source
//10.0.75.1/C  313940988 97282632 216658356  31% /opt/database
shm                65536        0     65536   0% /dev/shm
tmpfs            2524632        0   2524632   0% /proc/acpi
tmpfs            2524632        0   2524632   0% /sys/firmware

マウントできていたので、ソースディレクトリーを確認します。
/opt/source に master ディレクトリーがいらっしゃいました。どうやらソースの永続化はできているようです。

(base) root@0a320850e2cb:/# cd /opt/source
(base) root@0a320850e2cb:/opt/source# ls
master
(base) root@0a320850e2cb:/opt/source#

VS Code の Remote Container で接続してみます。ソース・ファイルが見られれば成功です。
前回の接続を一旦終了させて、新しい接続をします。(残骸ごと削除しましたからね)

Control + Shift + P でコマンドパレットを表示します。
残骸削除したので、anaconda3 の接続が表示されます。ここを選択して接続します。



大丈夫、きちんと永続化できていました。


7 まとめ


これで、汎用開発環境のベースは出来上がりました。

使った感じですが、Docker Desktop for Windows は、やはりメモリーがそこそこ無いと動作が遅くなります。

Anaconda を利用する場合、4G程度は Docker に渡せるようにしたほうがいいようです。
Hyper-V も起動していますし、ベースの Windows Enterprise の動作メモリーもあります。

Office で仕様書見ながら、VS Code でプログラムを作っていくと、やはり8Gバイトのメモリーでは足りませんね。
本格的な開発をするようであれば、Jenkins などの Docker コンテナー分もメモリーを考慮する必要があります。

やっぱ16Gバイトのメモリーは欲しいですね。(最近のノートPCはわりと増設できるのが多いようです)
DELL か mouse コンピューターを虎視眈々と狙っています。

HP のノートは今の会社で使っているので、それ以外にします。ノマド感が湧きませんから。

MACが一番ノマド感を醸し出せていいのですが、ありゃぁ、相当高額でっせ! 
Windows10 を愛していこうと思います。

これで、ノマド計画がよりリアルになってきました!

コメント

このブログの人気の投稿

Hyper-V で Docker Desktop for Windows を使う(その2)

VS Code で Hyper-V + Docker Desktop for Windows

Python のオブジェクトとクラス