概要
TensoorflowのGPU環境構築にあたってはインストールに関する情報も多く、インストーラも心持ちユーザフレンドリーになっているし、何より自前で環境構築するのに慣れてしまったこともあり、イライラすることはほぼなくなった。
昔は知識不足でGPU環境を構築することが困難だったのでTensorFlow Docker imageを使うことがままあった。その時はホスト環境のブラウザからコンテナに接続してJupyter notebookで開発することがもっぱらであった。
仕事でDockerを使う機会があり自分のDocker情報も更新されたので環境構築について備忘録に残す。
なお、(有料な)Docker desktopは使用しない。
- 実施期間: 2023年3月
- 環境:Host: Ubuntu20.04.2 LTS, Container: Ubuntu20.04.5 LTS
1. Docker engineインストール
オフィシャルの手順に沿うだけで完了する。
インストール後、Linux のインストール後を忘れずに実行すること。
2. Ubuntu imageのコンテナ化
Host OSと同じUbuntu20.04のイメージでコンテナ作成する。
コンテナのUbuntuにはPythonが入っていないので、一度にPython環境まで整えるためにコンテナ作成にはDockerfileをbuildする。
ソースコードはHost OSでも確認できるようにバインドマウントする。
FROM ubuntu:20.04
RUN mkdir /usr/local/src/python_src
RUN apt-get update
RUN apt-get install -y python3.8 python3.8-dev python3-pip
RUN pip3 install numpy pandas matplotlib
VOLUME /usr/local/src/python_src
Dockerfileをおいたディレクトリでイメージ(ubuntu:py38)とコンテナ(test_1)を作成する。
docker build -t ubuntu:py38 .
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu py38 8f2cd82f8cb3 19 seconds ago 662MB
docker run --name test_1 -it ubuntu:py38 bash
起動したコンテナのterminalでUbuntuのバージョンくらい見ておく。
cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.5 LTS"
Host OSで別terminalを起動し、run中のコンテナ情報を抜き出してコンテナの/usr/local/src/python_srcがHost OSのどこにマウントされたか確認する。そこに簡単なpyファイルを作成する。
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
91fa06d195c2 ubuntu:py38 "bash" About a minute ago Up About a minute test_1
docker inspect 91fa06d195c2 > test_1.JSON
cat test_1.JSON | jq ".[].Mounts[].Source"
"/var/lib/docker/volumes/a0020fa7a6ed93819b9099e7a7bdc311248891a5e86534137528bd415559d828/_data"
cd /var/lib/docker/volumes/a0020fa7a6ed93819b9099e7a7bdc311248891a5e86534137528bd415559d828/_data
sudo touch test.py
sudo vim test.py
vimで"hello world!"を出力するコード(割愛)を書いておく。
コンテナのterminalでそれが参照できるか確認する。
cd /usr/local/src/python_src
ls
test.py
Dockerの仕様上、マウント元(Host OS)のディレクトリを指定することはできず、Dockerが自動的にマウント元を作成する。つまり複数コンテナからHost OS上のひとつのディレクトリを参照することはできない(という理解)。
3. VSCode
下記サイトを参考にさせていただいた。
VSCodeの機能拡張にDev Containersをインストールしておく。これが起動中のコンテナに環境を接続してくれる。
表示されているコンテナはdocker ps -a
で表示されるコンテナたちで、実行中のものには再生マークがついている。ここではコンテナtest_1を選択する。同時にPythonのインタプリタがコンテナ中の環境に切り替わる。起動していないコンテナを選択すると起動して接続してくれる。
接続すると、pythonのインタプリタが切り替わる。
編集するpyファイルを指定するため、コンテナ内のディレクトリを指定する。
OKを押すと、その中の全ファイルが表示されるので所望のものを選択する。
このままではデバッグモードにならない。
Host OSでもVSCodeを初めてインストールしたときと同じように、コンテナの環境でもVSCodeの実行が初めてとなるため機能拡張をインストールする。
これで開発環境の準備は終わり。
VSCodeで編集した内容はもちろんマウント元であるHost OSのディレクトリにそのまま反映される。
runで起動したコンテナのterminalはexit
するだけでコンテナがstopする。
4. 開発を再開するとき
VSCodeを起動すると前回の環境がコンテナだったことを記憶しているためか、下図が表示される。
"Start Container"を選択すると、勝手にdocker start
してくれる。VSCodeを閉じてもこのコンテナはstart状態なので、terminalから必要に応じてdocker stop
させなければならない。
terminalを起動したければコンテナはあるのでstartしてterminalをアタッチする。
docker start --name test_1
docker exec -it text_1 bash
start状態にexecでアタッチしたので、このterminalをexecしてもコンテナはstart状態のまま。
番外(Docker Hubの全Tagの確認)
Docker Hubに置かれているオフィシャルのtagはStack Overflowによると下記で確認可能。
curl -s -S 'https://registry.hub.docker.com/v2/repositories/library/ubuntu/tags/' | jq '."results"[]["name"]' |sort
"focal"
"focal-20230301"
"jammy"
"jammy-20230301"
"kinetic"
"kinetic-20230217"
"latest"
"lunar"
"lunar-20230301"
"rolling"
docker run -it ubuntu:focal bash
タグはバージョン番号ではなくコードネームになっている。コンテナを作ってみたけど、最小構成で心もとなかったので使用していない。
以上