Dockerは難しくありませんでした
開発環境を準備するときPythonの環境準備のようにPCに直接環境を準備する方法もありますが、うまくできないことがあります。色々触っている間にPC自体がおかしくなってしまうこともあります。
おじさんはPCが汚れるのがあまり好きではありません。こういう人にはDockerがとても向いています。Dockerとは仮想環境を提供するものです。下記のようにPCの中にくじら(Docker)がいて、くじらが餌(image)を食べて、その餌を栄養にしてくじらの中で仮想環境(Container)が動くイメージです。
よくわからないと思うので、PCの中で仮想PCが動くと思えば良いです。
本当はこれだと仮想PCの部類に入ってしまい、Dockerとは違うらしいのですが、ユーザの知識としてはおじさんはどっちでも良いと思います。
仮想環境に色々インストールして、もし壊れてしまったら、その仮想環境は削除すれば良いんです。勉強では色々と触りたいものですから、勉強にもってこいですね。
業務PCではもしかするとDockerのインストールはできないかもしれません。でももし、インストールできたら、業務PC自体には影響を与えずに、開発環境が準備できますので、良いと思います。
Dockerの実演を少々
動画で実演してみました。
イメージには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は全く難しくありませんでした。
考え方を少し変えると、プログラムに挫折というものはなくなります。