Python3でdocker apiを使ってみる

Python3から[Docker SDK for Python](https://docker-py.readthedocs.io/en/stable/)のapiを使用してdockerを操作してみる。

##試した環境
CentOS7
Python3.6
Dockerをインストールしておく

##イメージとコンテナの準備
[Docker Hub](https://hub.docker.com/)から適当な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> 
```
うまく取れましたね。
ただ、リストとはいえ、コンテナは１個しか起動していないので、寂しい感じですが、
このコンテナ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を操作出来ます。
自動化で使えそうかなー。