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コマンドを記述することを強くおすすめします。
-
Pythonコードを高速化する11の最適化テクニック
Pythonはコンパイル言語ほど高速ではないことは周知の事実ですが、大手企業がPythonで大規模なワークロードを処理している事例からも分かるように、決して「遅い言語」ではありません。この記事では、正しく動作するPythonプログラムをさらに速く、効率的にするために押さえておきたい最適化のヒントを11個紹介します。 ヒント1: 組み込み関数を活用する Pythonで独自に効率的なコードを書くことも可能ですが、C言語で実装された組み込み関数の速度には到底及びません。利用可能な組み込み関数はdir(__builtins__)で一覧表示できるので、車輪の再発明をする前に必ず確認しましょう。 ヒン
-
Docker Desktop レビュー ― コンテナ管理を快適にする直感的GUIフロントエンドの実力とは?
私が好むのは、直感的に操作できるソフトウェアです。マニュアルなしでも使いこなせて、万が一ドキュメントを確認する必要があるときも、必ず求めている答えが見つかるような製品。これまでの経験から言えば、Docker関連のツールはまさにその領域に該当すると言えます。 そんな中、最近「Docker Desktop」という新しいDockerツールに出会いました。これはDockerコンテナ管理のためのGUIで、本来ならコマンドラインからDockerエンジンを使って行う作業を、快適なフロントエンドから実行できるようにするものです。かなり興味深そうなので、早速詳しく見ていきましょう。 インストールと初期設定 ま