Python3からDocker SDK for Pythonのapiを使用してdockerを操作してみる。
試した環境
CentOS7
Python3.6
Dockerをインストールしておく
イメージとコンテナの準備
Docker Hubから適当なImageをpullしてコンテナを作成しておく
◼︎イメージ
[root@os3-375-20617 python3]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
prairielearn/centos7-python latest 8ef27e80b336 3 days ago 1.12GB
selenium/standalone-chrome latest 3c0c9ce75c25 3 weeks ago 860MB
◼︎コンテナ
[root@os3-375-20617 python3]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4cddfb299d8e prairielearn/centos7-python "/bin/bash" 2 minutes ago Up 2 minutes amazing_lamport
pipでdockerをインストール
pip install docker
docker 4.0.2ってやつだね。
これでpythonからdockerの操作が出来る様になるハズだ。
[root@os3-375-20617 python3]# pip list
Package Version
--------------------- ----------
appdirs 1.4.3
atomicwrites 1.3.0
attrs 19.1.0
beautifulsoup4 4.7.1
brython 3.7.1
certifi 2018.11.29
chardet 3.0.4
chromedriver 2.24.1
cssselect 1.0.3
Django 2.1.7
docker 4.0.2
html5lib 1.0.1
イメージを操作する
まずはイメージの一覧を取得してみる。
※一般ユーザーでやるとPermissionErrorで怒られたのでroot実行。
# !/usr/bin/python3
import docker
# dockerインスタンス作成
docker_client = docker.from_env()
# dockerイメージリストの取得
for docker_image_list in docker_client.images.list():
print(docker_image_list)
# <Image: 'prairielearn/centos7-python:latest'>
# <Image: 'selenium/standalone-chrome:latest'>
うまく取れましたね。
せっかくなので以下のイメージを使用して少し操作してみる。
Image: 'prairielearn/centos7-python:latest'
# イメージを取得
target_image = docker_client.images.get('prairielearn/centos7-python:latest')
print(target_image.id) # イメージのidを取得
print(target_image.labels) # イメージのlabelsを取得
print(target_image.tags) # イメージのtagsを取得
# sha256:8ef27e80b3366abcb6df9bf618daa53304dc69436dc0ce8792ed27bf582866c7
# {'org.label-schema.build-date': '20190305', 'org.label-schema.license': 'GPLv2', 'org.label-schema.name': 'CentOS Base Image', 'org.label-schema.schema-version': '1.0', 'org.label-schema.vendor': 'CentOS'}
# ['prairielearn/centos7-python:latest']
お、上手く取れた様です。
以下をやると沢山情報が取れましたが多すぎるのでここでの記載は割愛。
print(target_image.attrs)
コンテナを操作する
まずはコンテナの一覧を取得してみる。
# dockerコンテナリストの取得
for docker_containers_list in docker_client.containers.list():
print(docker_containers_list)
# <Container: 4cddfb299d>
うまく取れましたね。
ただ、リストとはいえ、コンテナは1個しか起動していないので、寂しい感じですが、
このコンテナidを使ってコンテナを操作してみましょう。
4cddfb299d
target_container = docker_client.containers.get('4cddfb299d')
print(target_container.id) # コンテナid
print(target_container.image) # コンテナのイメージ名
print(target_container.status) # コンテナのステータス
# 4cddfb299d8e1458fd4144931d56c3b8393cb69f00f1b27f1a523beb2d0060f4
# <Image: 'prairielearn/centos7-python:latest'>
# running
上手く取れましたね。
ステータスは稼働中なので「running」です。
dockerコマンドで現在の稼働状態を見てみると一緒ですね。
[root@os3-375-20617 python3]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4cddfb299d8e prairielearn/centos7-python "/bin/bash" 21 minutes ago Up 21 minutes amazing_lamport
他にはコンテナのプロセスを確認したり、ログを取得したりも出来る。
ログはなんだか空っぽです(雰囲気だけこんな感じ)。
print(target_container.logs(timestamps=True, tail=20)) # logの取得
print(target_container.top(ps_args='aux')) # psコマンド
# b''
# {'Processes': [['root', '4004', '0.0', '0.1', '11820', '1772', 'pts/0', 'Ss+', '00:52', '0:00', '/bin/bash']], 'Titles': ['USER', 'PID', '%CPU', '%MEM', 'VSZ', 'RSS', 'TTY', 'STAT', 'START', 'TIME', 'COMMAND']}
attrsには辞書形式で沢山の情報が入っているので、
例えばコンテナからイメージidを取得するにはattrs[key]で取り出す。
print(target_container.attrs['Image'])
# sha256:8ef27e80b3366abcb6df9bf618daa53304dc69436dc0ce8792ed27bf582866c7
コンテナを止めてみる。
print(target_container.stop())
dockerコマンドで現在の稼働状態を見てみると停止してますね。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4cddfb299d8e prairielearn/centos7-python "/bin/bash" About an hour ago Exited (137) 4 minutes ago amazing_lamport
まとめ
これで全てではないですが、こんな雰囲気でPython3からdockerを操作出来ます。
自動化で使えそうかなー。