2
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-09-10

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

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0