dockerを学び始めた時の私
「とりあえずコンテナ?を立ち上げてそのコンテナでなんやかんやしたい!でもpullとかrunとか意味わからん!」
だったので今回はシンプルにdockerコンテナ内でpython環境を整えて
dockerコンテナでpythonを実行して遊ぶまでを書きます
とりあえずおもむろに以下を叩く
$ docker images
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
何もimageが入ってない。ここにpython imageをpullして入れる
$ docker pull python
docker hubからpython imageがpullされます。
pullされたか確認
$ docker images
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
python latest 4f9baf941f8e 2 days ago 921MB
pullできた!
次にpython imageをもとにコンテナを立ち上げ&入ります。
(python:latestをImage IDにしてもOK)
$ docker run -it python:latest /bin/bash
$ docker run -it python:latest /bin/bash
root@1972389330e5:/#
コンテナに入れました。
ではpythonをインタラクティブモードにしましょう。
$ python
root@1972389330e5:/# python
Python 3.10.7 (main, Sep 7 2022, 21:55:45) [GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> print('Hello docker.')
Hello docker.
>>>
ちゃんと動いてますね。
ちなみに今pythonライブラリは何が入っているのだろう。
確認してみましょう。
# pip list
root@1972389330e5:/# pip list
Package Version
---------- -------
pip 22.2.2
setuptools 63.2.0
wheel 0.37.1
root@1972389330e5:/#
どうやらデフォルトのライブラリ以外何も入っていないようです。
ではおもむろにtqdmでも入れますか。
まずpip自体のupgradeをしてtqdmをinstall。
# pip install --upgrade pip && pip install tqdm
root@1972389330e5:/# pip install --upgrade pip && pip install tqdm
# pip list
root@1972389330e5:/# pip list
Package Version
---------- -------
pip 22.2.2
setuptools 63.2.0
tqdm 4.64.1
wheel 0.37.1
root@1972389330e5:/#
ちゃんとinstallされました。
じゃあvimで適当にpython書きますか・・・
しかし、このコンテナにはvimがinstallされていないので以下でvimをinstall
# apt-get update && apt-get install -y vim
installされたら
# vim test.py
で書き込んでいきます。
import time
from tqdm import tqdm
for _ in tqdm(range(0, 100)):
time.sleep(0.05)
python記述し終えたらvimをESCして「:wq」 で保存して閉じて(writeしてquitして)
python実行。
# python test.py
root@1972389330e5:/# python test.py
100%|█████████████████████████████████████████| 100/100 [00:05<00:00, 18.90it/s]
root@1972389330e5:/#
うん、それっぽい。()
ではコンテナから抜けます。
# exit
root@1972389330e5:/# exit
exit
$
ホスト側に戻りました。
さて、今入っていたコンテナはどうなっているのでしょう。
以下コマンドで確認します。
$ docker ps -a
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1972389330e5 python:latest "/bin/bash" 20 minutes ago Exited (0) 36 seconds ago hopeful_chebyshev
ちゃんとありましたね。ここから後始末です。
コンテナを削除します。
docker rm (container ID)で削除できます。
$ docker rm 1972389330e5
コンテナが削除されたか確認。
$ docker ps -a
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
$
消え去りました。
ではdocker imageも削除しちゃいましょう。
$ docker rmi python
$ docker images
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
こちらも消え去りました。
ここまでが
「コンテナに入ってコンテナ内でpythonを実行する」
でした。
以下長いおまけです。
imageとは
->コンテナの設計図です。今回はpython環境を作るため、dokcer hubからその設計書をpullしました。
runとは
->image(設計図)をもとにコンテナを立ち上げて、そのコンテナに入ります。
docker run -it ◯◯ /bin/bashとは
->-itはホストからコンテナへの標準入力を繋げます
->/bin/bashはコンテナ内のbashを使ってコンテナ内を操作するぜ〜! です。
(コンテナに入って # which bash をすればわかりやすいかと思います。)
なぜapt-getなのか
->python imageのOSがLinuxOSで、ディストリビューションがdebianだからです。
(コンテナに入って # cat /etc/debian_version をすればわかりやすいかと思います。)
docker ps -aとは
->停止中のコンテナも表示します。psだけだと実行中のコンテナのみ表示されます。
慣れてきたら-vオプションでホスト間とコンテナ間をマウントすることができますのでどうぞお試しください。
例えばホスト側(ご自身が今操作しているマシン。MacとかWinとか。)のカレントディレクトリに
既に作成したtest.pyがあるとします。
そして以下を実行
$ docker run -it -v $(pwd):/home python:latest /bin/bash
$ docker run -it -v $(pwd):/home python:latest /bin/bash
root@5ee00c14b407:/# cd home
root@5ee00c14b407:/home# ls
test.py
$(pwd)でカレントディレクトリを指定して、:/home でコンテナ側の/homeディレクトリをマウントしました。
上記lsで確認したように、コンテナ側にもtest.pyがあります。これがホストとコンテナ間をマウントするということです。
例えばコンテナ側でtest.pyを編集したらホスト側のtest.pyも編集されます。
これで好きなエディターでpythonをホスト側で書いてコンテナ側でpython実行できますね!
長いおまけ以上です。。
少しでも参考になりましたでしょうか・・・
ここまで試された方は「毎回コンテナ作る度にapt-getとかpip installするの面倒だな。。」
と感じられるかたがいらっしゃるかもしれません。
それはDockerfileとか、docker commit等さまざまな方法で解決できます。ぜひお調べくださいませ。
そして結局「コンテナって何?」と思われる方もいらっしゃるかもしれません。
私のこの理解は
「それぞれのコンテナにそれぞれの環境を構築できる」
としております。(他にも解釈の仕方はあると思います。異論はめちゃくちゃ認めます)
もう長くなりすぎたのでとりあえず切り上げます。
最後までご閲覧ありがとうございましたmm