◇DockerにPython常駐プログラム
m(_ _)m 緊急メモ:書きかけです。
Dockerで常駐型Pythonプログラム
Dockerのコンテナに次のPythonプログラムを入れ、実行します。
#!/usr/bin/python3 import time def main(): _n:int=0; while True: _n = _n+1 print("hello world "+str(_n)) time.sleep(2) if __name__ == "__main__": main()
単純な無限ループになっており、2秒毎に"hello world カウント"表示をします。
Dockerの設定として、次のDockerfileを用います。
FROM ubuntu:20.04 RUN apt-get -y install python3 COPY ./hello.py /hello.py ENTRYPOINT [ "/hello.py" ]
基本OSとしてubuntuを使い、python3をインストールしています。
ここでFROMはDockerHUB(基本イメージなどが置かれている)からubuntu:20.04のイメージを取り込むことを示しています。
COPYはソースに置いてあるhello.pyをDockerコンテナ内の/フォルダにコピーしています。
注意!:hello.pyには実行フラグを立てておく必要があります。
ENTRYPOINTはコピーされた/hellp.py起動ポイントであると宣言しています。
フォルダ構成は次のようになっています。
my_imageフォルダにPythonプログラムとDockerfileを置いてあります。
.shは手続きをスクリプトとしたものです。メモと思っても構いません。
$ tree . . |-- my_image | |-- Dockerfile | `-- hello.py `-- shell_set |-- A00_configure.sh |-- A01_buildImage.sh |-- A02_createContainer.sh |-- A03_startConatiner.sh |-- A04_stopContainer.sh |-- A05_rmContainer.sh |-- A11_exec.sh |-- AXX_installDocker.sh |-- B01_startBG.sh |-- B02_runImage.sh `-- B99_clean.sh
手続き(非バックグラウンド実行)
Dockerでimageからコンテナを作り実行するまでの手続きを載せます。
それぞれ1行の単純な手続きですが、メモを兼ねたシェルスクリプトも作成してあります。
Dockerのインストール
Dockerのインストール手順の例を挙げます。他の方法もとれますが、snapを使ったインストールを行うとdocker buildで
lstat /var/lib/snapd/void/Dockerfile: no such file or directory
という訳の分からないエラーが発生します。対処法は不明です。
$ sudo apt install docker.io $ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose $ sudo chmod +x /usr/local/bin/docker-compose ------- #AXX_installDocker.sh #!/bin/bash # UTF-8 LF sudo apt install docker.io sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose
途中の長いコマンドの行を折ったものを載せます。
sudo curl -L \ "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)"\ -o /usr/local/bin/docker-compose
imageのビルド
my_image/フォルダに置いたプログラム(hello.py)と設定(Dockerfile)でimageと呼ばれるものを作ります。
$ sudo docker build -t my_image:v1 ./my_image
-------
#A01_buildImage.sh
#!/bin/bash
# UTF-8 LF
source ./A00_configure.sh
echo sudo docker build -t ${IMAGE}:${TAG} ./${IMAGE}
sudo docker build -t ${IMAGE}:${TAG} ./${IMAGE}
if [ $? -ne 0 ]; then echo "*** SOME ERROR OCCURED ***";exit 1; fi
echo "DONE"
--
#A00_configure.sh
#!/bin/bash
# UTF-8 LF
BASE_DIR=$(cd $(dirname ${BASH_SOURCE:-$0}); pwd)
IMAGE=my_image
TAG=v1
CONTAINER=my_container
コンテナの生成
作成したイメージからコンテナを名前付きで生成します。
-itオプションはstartで対話モードが可能となる指定です。
$ sudo docker container create -it --name my_container my_image:v1
-------
#A02_createContainer.sh
#!/bin/bash
# UTF-8 LF
source ./A00_configure.sh
echo sudo docker container create -it --name ${CONTAINER} ${IMAGE}:${TAG}
sudo docker container create -it --name ${CONTAINER} ${IMAGE}:${TAG}
if [ $? -ne 0 ]; then echo "*** SOME ERROR OCCURED ***";exit 1; fi
echo "DONE"
コンテナの対話モードstart
コンテナを対話モードでstartさせます。-aは対話モード指定です。対話モードでstartさせるのは標準出力を確認するためです。
最終的には非対話モードでstartまたはrunさせます。
$ sudo docker container start -a my_container
-------
#A03_startConatiner.sh
#!/bin/bash
# UTF-8 LF
source ./A00_configure.sh
echo sudo docker container start -a ${CONTAINER}
sudo docker container start -a ${CONTAINER}
if [ $? -ne 0 ]; then echo "*** SOME ERROR OCCURED ***";exit 1; fi
コンテナのstop
対話モードでも必ずしもint割り込みで停止できるとは限りません。次のコマンドで停止させることができます。停止まで10秒程かかります。
$ sudo docker stop my_container
-------
#A04_stopContainer.sh
#!/bin/bash
# UTF-8 LF
source ./A00_configure.sh
echo sudo docker stop ${CONTAINER}
sudo docker stop ${CONTAINER}
if [ $? -ne 0 ]; then echo "*** SOME ERROR OCCURED ***";exit 1; fi
echo "DONE"
コンテナの削除
コンテナは次のようにして削除します。
$ echo sudo docker rm my_container
-------
#A05_rmContainer.sh
#!/bin/bash
# UTF-8 LF
source ./A00_configure.sh
echo sudo docker rm ${CONTAINER}
sudo docker rm ${CONTAINER}
if [ $? -ne 0 ]; then echo "*** SOME ERROR OCCURED ***";exit 1; fi
echo "DONE"
バックグラウンド実行
コンテナのバックグラウンドstart
start時にオプションを付けなければバックグラウンド実行となります。
$ sudo docker container start my_container
-------
#B01_startBG.sh
#!/bin/bash
# UTF-8 LF
source ./A00_configure.sh
echo sudo docker container start ${CONTAINER}
sudo docker container start ${CONTAINER}
if [ $? -ne 0 ]; then echo "*** SOME ERROR OCCURED ***";exit 1; fi
imageのrun
コンテナを作成する手順を踏まずimageを指定してrunさせることができます。
こちらの手順がstart手順よりオプション指定も多く、一般的です。
run手順でコンテナが作成されるため、コンテナの取り扱いで混乱が生じることが多いようです。
$ sudo docker container run -b my_image:v1
-------
#B02_runImage.sh
#!/bin/bash
# UTF-8 LF
# バックグラウンド実行
source ./A00_configure.sh
echo sudo docker container run -d ${IMAGE}:${TAG}
sudo docker container run -d ${IMAGE}:${TAG}
実行すると、コンテナのIDが表示されます。このIDを記録しておく必要があります。
Dockerのシェルを動かすことやその他でこのIDが必要となります。
$ ./B02_runImage.sh 947bfef7804c5b5f56538191ac5c8529a7ce5ee20e8a280d5d062da96d3bd872
Dockerシェル(コンテナ内シェル)
コンテナ内はホストPCとは別環境となっています。
例えばコンテナ内でlsやpsを実行するにはコンテナを指定しDocker execを実行し、シェル環境に入ります。
startでコンテナを指定してある場合はそのコンテナ名を指定してexecを実行します。
$ ./B01_startBG.sh
my_container
$ sudo docker exec -it my_container /bin/bash
root@1cb17c9a7157:/# ls
bin boot dev etc hello.py home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
root@1cb17c9a7157:/# ps
PID TTY TIME CMD
8 pts/1 00:00:00 bash
17 pts/1 00:00:00 ps
root@1cb17c9a7157:/#
-------
#A11_exec.sh
#!/bin/bash
# UTF-8 LF
source ./A00_configure.sh
echo sudo docker exec -it ${CONTAINER} /bin/bash
sudo docker exec -it ${CONTAINER} /bin/bash
if [ $? -ne 0 ]; then echo "*** SOME ERROR OCCURED ***";exit 1; fi
runでコンテナを指定せず起動した場合は、出力されたコンテナID(先頭12文字以上)を指定します。
$ ./B02_runImage.sh
947bfef7804c5b5f56538191ac5c8529a7ce5ee20e8a280d5d062da96d3bd872
$ sudo docker exec -it 947bfef7804c /bin/bash
root@947bfef7804c:/# ls
bin boot dev etc hello.py home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
root@947bfef7804c:/# ps
PID TTY TIME CMD
14 pts/0 00:00:00 bash
24 pts/0 00:00:00 ps
root@947bfef7804c:/#exit
ゴミ処理
runを使う場合、毎回新たなコンテナが作成されますので、システムはゴミだらけになります。次の手順で使用しなくなってた資源を開放できます。
$ sudo docker system prune -a
-------
#B99_clean.sh
#!/bin/bash
# UTF-8 LF
echo sudo docker system prune -a
sudo docker system prune -a
ダウンロード
ファイルはhellopython.tar.gzからダウンロードできます。
| 固定リンク