LoginSignup
1
4

More than 3 years have passed since last update.

Python3でdocker apiを使ってみる

Posted at

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実行。

docker_test.py
#!/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'

docker_test.py
# イメージを取得
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']

お、上手く取れた様です。
以下をやると沢山情報が取れましたが多すぎるのでここでの記載は割愛。

docker_test.py
print(target_image.attrs)

コンテナを操作する

まずはコンテナの一覧を取得してみる。

docker_test.py
# dockerコンテナリストの取得 
for docker_containers_list in docker_client.containers.list():
    print(docker_containers_list)
    # <Container: 4cddfb299d> 

うまく取れましたね。
ただ、リストとはいえ、コンテナは1個しか起動していないので、寂しい感じですが、
このコンテナidを使ってコンテナを操作してみましょう。

4cddfb299d

docker_test.py
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

他にはコンテナのプロセスを確認したり、ログを取得したりも出来る。
ログはなんだか空っぽです(雰囲気だけこんな感じ)。

docker_test.py
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]で取り出す。

docker_test.py
print(target_container.attrs['Image'])
# sha256:8ef27e80b3366abcb6df9bf618daa53304dc69436dc0ce8792ed27bf582866c7

コンテナを止めてみる。

docker_test.py
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を操作出来ます。
自動化で使えそうかなー。

1
4
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
1
4