Docker を Python から操作できる docker パッケージ

Docker を Python から操作できる docker パッケージ

Docker

Docker はエンジニアにとって非常に便利なツールとして知られています。
多くのエンジニアは Docker Desktop でイメージやコンテナの確認を行っていると思います。今回、ローカルで利用する Docker イメージの自動更新が必要になり、日次バッチで対応できないか検討していたところ、 Python から Docker を操作することができるパッケージがあったので、備忘録としてその利用方法を書き留めておきたいと思います。

PyPI – docker

Docker パッケージのインストール

Docker パッケージは pip でインストールすることができます。
pip install docker


操作方法

Dockerクライアント取得

Docker を操作するには、クライアントの取得が必要になります。処理の最初に必ず入れるようにしましょう。
しかし Docker が起動していない状態の場合エラーになりますので、事前に Docker Desktop を起動するなどしておきましょう。
client = docker.from_env()


イメージの操作

Docker にはイメージがないと何もできないので、イメージ周りの操作から説明します。
まずはローカルにあるイメージを取得には、次のようにします。
# ローカルにあるイメージを取得
images = client.images.list()
print(images)

client.images.list() はイメージを配列で返してくれます。詳しく見たい場合は、 images をループで回せばいいでしょう。できれば「IN USE」のイメージを取得したかったですが、そのようなプロパティがなかったので私はコンテナのステータスと組み合わせて「IN USE」のイメージを判定したりしています。

ときにはイメージを取得したいときもあるでしょう。 docker コマンドでいうと、 docker pull ですね。それもこのパッケージでは可能です。
# イメージを取得する
client.images.pull('{image_name}')

{image_name} にイメージ名を入力するとイメージをダウンロードしてくれます。具体的に記述すると次のようになります。
client.images.pull('python')

この場合、 python の latest タグがついているイメージを取得できます。もちろんダウンロードには時間がかかるので、 pull が完了したら次の処理に移るようになっています。
タグを指定する必要がある場合は、次のように指定します。
# 特定のタグのイメージを取得する
client.images.pull('{image_name}', tag='{image_tag}')

具体的に記述すると次のようになります。
client.images.pull('python', tag='3.9.13')

これで 3.9.13 タグの python イメージを取得できます。

コンテナの操作

起動中のコンテナを取得するには、次のようにします。
# 起動中のコンテナ
launching_containers = client.containers.list()
print(launching_containers)

また停止しているコンテナも含めて全コンテナを取得するには、引数を追加します。
# 全てのコンテナ
all_containers = client.containers.list(all=True)
print(all_containers)

イメージを元にコンテナを立ち上げるには、 run メソッドを実行します。
# イメージを元にコンテナを立ち上げる
client.containers.run('{image_name}')

実際には名前を付けて立ち上げることが多いと思いますので、次のようにして名前を付けてあげればいいでしょう。
# イメージを元に名前をつけてコンテナを立ち上げる
client.containers.run('{image_name}', name='{container_name}')

停止している特定の名前のコンテナを起動する場合は、次のようにします。
# 停止している特定の名前のコンテナを起動する
client.containers.get('{container_name}').start()
containers の get メソッドを見ると引数は container_id となっていますが、 id もしくは name を渡すことができるようになっています。
ローカルにおいて、name は一意ですので指定できて当然と言えば当然ですね。
停止している全コンテナを起動したい場合は、全コンテナを取得しステータスを確認して起動すればいいでしょう。
# 停止しているコンテナを全て起動する
all_containers = client.containers.list(all=True)
for container in all_containers:
    if container.status == 'exited':
        container.start()


まとめ

今回は、Python から Docker を操作することができるパッケージを紹介しました。
普段叩いている docker コマンドは一通り処理できるので、自動化させることも容易です。私にとって、ここ最近で最も素晴らしいと感じたパッケージでした。ぜひ活用してみてください。
» エンジニア登録はこちら