おじさんのITテクニック

プログラム挫折常連者がプログラムを完成させるまで

Dockerの利用

Dockerは難しくありませんでした

開発環境を準備するときPythonの環境準備のようにPCに直接環境を準備する方法もありますが、うまくできないことがあります。色々触っている間にPC自体がおかしくなってしまうこともあります。
おじさんはPCが汚れるのがあまり好きではありません。こういう人にはDockerがとても向いています。Dockerとは仮想環境を提供するものです。下記のようにPCの中にくじら(Docker)がいて、くじらが餌(image)を食べて、その餌を栄養にしてくじらの中で仮想環境(Container)が動くイメージです。

 

よくわからないと思うので、PCの中で仮想PCが動くと思えば良いです。

おじさん的Docker

本当はこれだと仮想PCの部類に入ってしまい、Dockerとは違うらしいのですが、ユーザの知識としてはおじさんはどっちでも良いと思います。

仮想環境に色々インストールして、もし壊れてしまったら、その仮想環境は削除すれば良いんです。勉強では色々と触りたいものですから、勉強にもってこいですね。

業務PCではもしかするとDockerのインストールはできないかもしれません。でももし、インストールできたら、業務PC自体には影響を与えずに、開発環境が準備できますので、良いと思います。

 

Dockerの実演を少々

動画で実演してみました。

www.youtube.com

イメージにはDockerが公式で準備しているものがあります。これをそのまま使用しても十分なのですが、何度もやり直しで同じ環境を作るなんてことがある場合、イメージをカスタマイズすると便利です。今回はDockerが準備しているイメージをカスタマイズしてイメージを作成してみました。

 

イメージをカスタマイズする場合、Dockerfileというものを作成します。

Dockerfileの例:

FROM python           #①

RUN pip install --upgrade pip   #②
RUN pip install pandas_datareader
RUN pip install mplfinance

Dockerfileを解説します

①FROMはベースとなるイメージを指定します

DockerのイメージはDocker Hubに置いてあります。pythonというのはこれです。

②RUNはイメージをカスタマイズする際に実行するコマンドを記載します
例では下記をインストールしています
pandas_datareader
mplfinance


Dockerfileの準備ができたら、docker build -t コンテナ名 Dockerfile保存場所コマンドを実行します

user@usernoMacBook-Pro Python % docker build -t python3 .
[+] Building 0.3s (8/8) FINISHED                                                                                                     
 => [internal] load build definition from Dockerfile   0.1s
 => => transferring dockerfile: 73B   0.0s
 => [internal] load .dockerignore   0.0s
 => => transferring context: 2B    0.0s
 => [internal] load metadata for docker.io/library/python:latest  0.0s
 => [1/4] FROM docker.io/library/python  0.0s
 => CACHED [2/4] RUN pip install --upgrade pip  0.0s
 => CACHED [3/4] RUN pip install pandas_datareader   0.0s
 => CACHED [4/4] RUN pip install mplfinance   0.0s
 => exporting to image   0.0s
 => => exporting layers   0.0s
 => => writing image sha256:9d1e9782a0e9ba734d2298245d4a3~   0.0s
 => => naming to docker.io/library/python3     0.0s
Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them

 

docker image lsコマンドでPCに保存されているイメージを確認します。
python3が保存されています

user@usernoMacBook-Pro Python % docker image ls
REPOSITORY          TAG       IMAGE ID       CREATED       SIZE
python3             latest    9d1e9782a0e9   3 days ago    1.24GB
python              latest    a8405b7e74cf   9 days ago    921MB
docker101tutorial   latest    6ef1a9b77478   6 weeks ago   47MB

 

docker run -it -d -p コンテナのポート番号:PCのポート番号 -v コンテナにアクセスさせるPCのフォルダ:コンテナのフォルダ --name コンテナ名 イメージ名コマンドで、作成したイメージからコンテナを起動します。

user@usernoMacBook-Pro Python % docker run -it -d -p 18080:8080 -v /Users/user/Documents/GitHub/Python/src:/mnt --name python-c python3
acfc9c09085575e5682321826c852cca48eccf89418a6dbd6e05e23260df36b8

 

docker ps -aコマンドでコンテナの状態を確認します。
python-cはUPしています

user@usernoMacBook-Pro Python % docker ps -a
CONTAINER ID   IMAGE     COMMAND     CREATED          STATUS          PORTS                     NAMES
acfc9c090855   python3   "python3"   23 seconds ago   Up 21 seconds   0.0.0.0:18080->8080/tcp   python-c

 

docker exec -it コンテナ名 指定シェル コマンドでコンテナにアクセスします

user@usernoMacBook-Pro Python % docker exec -it python-c bash
root@acfc9c090855:/# pwd
/
root@acfc9c090855:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@acfc9c090855:/# cd /mnt
root@acfc9c090855:/mnt# pwd
/mnt
root@acfc9c090855:/mnt# ls -l
total 4
-rw-r--r-- 1 root root 24 Mar 20 06:24 hello.py

 

フォルダに用意してあるhello.pyを実行します。

hello.py
print('hello python!!!')

root@acfc9c090855:/mnt# python hello.py 
hello python!!!

 

エディタでhello.pyを変更します。

hello.py
print('hello python') # ←!!!を削除

root@acfc9c090855:/mnt# python hello.py 
hello python

 

とても簡単にpythonの開発環境が準備できました。この環境はdocker run -it -d -p コンテナのポート番号:PCのポート番号 -v コンテナにアクセスさせるPCのフォルダ:コンテナのフォルダ --name コンテナ名 イメージ名コマンドのコンテナ名を変更すれば何個も作成することができます。色々試しておかしくなってしまったら、コンテナを削除すればまた環境をリセットすることができます。もし、使っていて必要なソフトウェアが発生した場合は、Dockerfileに記載して、イメージファイルを作り直すと、以降のリセット時に便利になります。

おじさんでもできましたので、Dockerは全く難しくありませんでした。

 

考え方を少し変えると、プログラムに挫折というものはなくなります。