Python
 Computer >> コンピューター >  >> プログラミング >> Python

DockerをPythonで操作する!docker-pyライブラリAPIの使い方徹底解説

PythonのライブラリAPIを使えば、コンテナ、イメージ、クラスタ、SwarmといったDockerオブジェクトにアクセスし、管理・操作することができます。DockerコマンドでできることはほぼすべてPythonから実行可能です。特にDjangoやFlaskなどのPythonアプリケーションを開発している場合、アプリ本体と同じスクリプトの中でDockerコンテナを管理できるのは非常に便利です。

docker-pyのインストール

Docker用のPythonライブラリAPIを使用するには、「docker-py」というパッケージをインストールする必要があります。以下のpipコマンドでインストールできます。Python 2環境をお使いの場合は、「pip3」を「pip」に置き換えてください。

pip3 install docker-py

ここからは、DockerのPythonクライアントライブラリAPIのさまざまな機能を順番に見ていきます。

Dockerデーモンへの接続

Pythonスクリプト内でAPI経由のDockerコマンドを実行するには、まずDockerデーモンに接続する必要があります。接続は次のコマンドで行います。

#import client
from docker import client

#create a client object to connect to the daemon
myClient = client.Client(base_url='unix://var/run/docker.sock')

コンテナの基本操作

コンテナ一覧の取得

Dockerデーモンに接続したら、以下のコマンドですべてのコンテナの一覧を取得できます。なお、権限エラーを避けるため、これらのコマンドを実行する前にrootユーザーとしてログインしておいてください。

myClient.containers()

このコマンドを実行すると、ローカルマシン上に存在するすべてのコンテナのリストが、ID、関連イメージとイメージID、ラベル、ポート、ステータスなどの情報とともに返されます。

コンテナの作成

新しいコンテナを作成するには、クライアントオブジェクトのcreate_containerメソッドを使用します。

myContainer=myClient.create_container(image='ubuntu:latest',command='/bin/bash')

上記のコマンドでは、ubuntuイメージからコンテナを作成し、bashを起動するコマンド(または任意の他のコマンド)を指定しています。

コンテナが正しく作成されたかどうかは、以下のコマンドでコンテナのIDを出力して確認できます。

print(myContainer['Id'])

コンテナの詳細確認(inspect)

特定のコンテナの詳細情報を取得するには、クライアントオブジェクトのinspect_containerメソッドを使用します。

myClient.inspect_container('a74688e3cf61ac11fd19bcbca1003465b03b117537adfc826db52c6430c46ba5')

引数には調べたいコンテナのコンテナIDを指定します。また、名前、作成日時、パスなど、特定のフィールドだけを取得することも可能です。

myClient.inspect_container('a74688e3cf61ac11fd19bcbca1003465b03b117537adfc826db52c6430c46ba5')['Name']

myClient.inspect_container('a74688e3cf61ac11fd19bcbca1003465b03b117537adfc826db52c6430c46ba5')['Created']

myClient.inspect_container('a74688e3cf61ac11fd19bcbca1003465b03b117537adfc826db52c6430c46ba5')['Path']

コンテナのコミット(commit)

コンテナをコミットしてイメージとして保存するには、commitメソッドを使用します。タグを付けることもできます。

myClient.commit('a74688e3cf61ac11fd19bcbca1003465b03b117537adfc826db52c6430c46ba5', tag='container1')

このコマンドはコンテナのIDを返します。コンテナを再起動する際は、そのコンテナがまだ存在していることを確認する必要があります。存在しないコンテナへの操作によるエラーを避けるため、コマンドをtry-exceptブロックで囲むのがおすすめです。

try:
myClient.restart('a74688e3cf61ac11fd19bcbca1003465b03b117537adfc826db52c6430c46ba5')
except Exception as e:
print(e)

イメージの操作

すべてのイメージの一覧を取得するには、クライアントオブジェクトのimagesメソッドを使用します。

images = myClient.images()

すべてのイメージのリストが返されます。最初のイメージの詳細を出力するには、次のようにします。

print(images[0])

特定のイメージの詳細を確認するには、inspect_imageメソッドを使用します。

myClient.inspect_image('9140108b62dc87d9b278bb0d4fd6a3e44c2959646eb966b86531306faa81b09b')

引数には対象のイメージIDを指定してください。

ボリュームの操作

次に、ボリュームを扱うための便利なコマンドをいくつか紹介します。すべてのボリュームの一覧を取得するには、クライアントオブジェクトのvolumesメソッドを使用します。

volumes = myClient.volumes()

すべてのボリュームのリストが返されます。最初のボリュームの詳細を出力するには、次のようにします。

print(volumes['Volumes'][0])

ボリュームの作成

ボリュームを作成するには、ボリューム名とドライバー名を指定します。必要に応じて、その他のオプションも指定できます。

volume=myClient.create_volume(name='myVolume1', driver='local', driver_opts={})

ボリュームが正しく作成されたかどうかは、出力してみると確認できます。

print(volume)

ボリュームの詳細確認

ボリュームの詳細情報を取得するには、クライアントオブジェクトのinspect_volumeメソッドを使用します。

myClient.inspect_volume('myVolume1')

ボリュームをマウントしたコンテナの作成

ボリュームをマウントした状態でコンテナを作成するには、次の例のようにします。

mounted_container = myClient.create_container(
'ubuntu', 'ls', volumes=['/var/lib/docker/volumes/myVolume1'],
host_config=myClient.create_host_config(binds=[
'/var/lib/docker/volumes/myVolume1:/usr/src/app/myVolume1'
])
)

上記のコマンドは、ubuntuイメージからコンテナを作成し、エントリポイントとして「ls」を指定しています。さらに、ローカルマシンの/var/lib/docker/volumes/myVolume1にあるボリュームを、Dockerコンテナ内の/usr/src/app/myVolume1にマウントしています。

まとめ

この記事では、Pythonスクリプトを使ってDockerコンテナ、イメージ、ボリュームといったDockerオブジェクトを作成・詳細確認・管理する方法について解説しました。DjangoやFlaskを使ったWebアプリケーション、tkinterを使ったGUIアプリケーションなど、Pythonツールでアプリケーションを構築している際に非常に役立つ知識です。Dockerコンテナ上でアプリケーションを管理したい場合は、コマンドラインインターフェースから個別にコマンドを実行するのではなく、PythonスクリプトでDockerコマンドを記述することを強くおすすめします。

  1. Pythonコードを高速化する11の最適化テクニック

    Pythonはコンパイル言語ほど高速ではないことは周知の事実ですが、大手企業がPythonで大規模なワークロードを処理している事例からも分かるように、決して「遅い言語」ではありません。この記事では、正しく動作するPythonプログラムをさらに速く、効率的にするために押さえておきたい最適化のヒントを11個紹介します。 ヒント1: 組み込み関数を活用する Pythonで独自に効率的なコードを書くことも可能ですが、C言語で実装された組み込み関数の速度には到底及びません。利用可能な組み込み関数はdir(__builtins__)で一覧表示できるので、車輪の再発明をする前に必ず確認しましょう。 ヒン

  2. Docker Desktop レビュー ― コンテナ管理を快適にする直感的GUIフロントエンドの実力とは?

    私が好むのは、直感的に操作できるソフトウェアです。マニュアルなしでも使いこなせて、万が一ドキュメントを確認する必要があるときも、必ず求めている答えが見つかるような製品。これまでの経験から言えば、Docker関連のツールはまさにその領域に該当すると言えます。 そんな中、最近「Docker Desktop」という新しいDockerツールに出会いました。これはDockerコンテナ管理のためのGUIで、本来ならコマンドラインからDockerエンジンを使って行う作業を、快適なフロントエンドから実行できるようにするものです。かなり興味深そうなので、早速詳しく見ていきましょう。 インストールと初期設定 ま