とりあえずdockerコンテナに入ってなんやかんやしたい人へ

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```
で書き込んでいきます。

```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