with one click
bollard
Rust製非同期Docker APIクライアント「Bollard」の使い方と実装パターン
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
Rust製非同期Docker APIクライアント「Bollard」の使い方と実装パターン
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
| name | bollard |
| description | Rust製非同期Docker APIクライアント「Bollard」の使い方と実装パターン |
| tags | ["docker","rust","async","container"] |
| version | 1.0.0 |
Rust製非同期Docker APIクライアント「Bollard」の実装ガイドです。
Bollardは、Rust製の非同期Docker API クライアントライブラリです。 HyperとTokioを使用し、futuresとasync/awaitパラダイムで実装されています。
このスキルは以下の場合に活用してください:
use bollard::Docker;
// OS固有のデフォルト設定で接続(推奨)
let docker = Docker::connect_with_local_defaults()?;
use bollard::container::{Config, CreateContainerOptions};
// 作成
let response = docker.create_container(Some(options), config).await?;
// 起動
docker.start_container::<String>(&container_id, None).await?;
// 停止
docker.stop_container(&container_id, Some(StopContainerOptions { t: 10 })).await?;
// 削除
docker.remove_container(&container_id, Some(RemoveContainerOptions {
force: true,
v: true,
..Default::default()
})).await?;
// 一覧
let containers = docker.list_containers(Some(ListContainersOptions::<String> {
all: true,
..Default::default()
})).await?;
use bollard::image::CreateImageOptions;
use futures_util::stream::TryStreamExt;
// Pull
let options = Some(CreateImageOptions {
from_image: "postgres",
tag: "16",
..Default::default()
});
let mut stream = docker.create_image(options, None, None);
while let Some(info) = stream.try_next().await? {
println!("{:?}", info);
}
use bollard::errors::Error;
match docker.create_container(options, config).await {
Ok(response) => { /* 成功 */ }
Err(Error::DockerResponseServerError { status_code: 409, .. }) => {
// コンテナが既に存在
}
Err(Error::DockerResponseServerError { status_code: 404, .. }) => {
// イメージが見つからない
}
Err(e) => { /* その他のエラー */ }
}
use bollard::container::{Config, CreateContainerOptions};
use bollard::models::HostConfig;
use std::collections::HashMap;
let config = Config {
image: Some("postgres:16".to_string()),
labels: Some({
let mut labels = HashMap::new();
// Docker Compose互換のラベル
labels.insert("com.docker.compose.project".to_string(),
format!("{}-{}", project_name, stage_name));
labels.insert("com.docker.compose.service".to_string(),
service_name.to_string());
// カスタムラベル
labels.insert("app.project".to_string(), project_name.to_string());
labels.insert("app.stage".to_string(), stage_name.to_string());
labels
}),
host_config: Some(HostConfig {
port_bindings: Some(port_bindings),
binds: Some(volumes),
..Default::default()
}),
..Default::default()
};
let options = CreateContainerOptions {
name: format!("{}-{}-{}", project_name, stage_name, service_name),
..Default::default()
};
match docker.create_container(Some(create_options.clone()), config.clone()).await {
Ok(response) => {
println!(" ✓ コンテナ作成: {}", response.id);
docker.start_container::<String>(&response.id, None).await?;
println!(" ✓ 起動完了");
}
Err(bollard::errors::Error::DockerResponseServerError { status_code: 409, .. }) => {
println!(" ℹ コンテナは既に存在します");
match docker.start_container::<String>(&container_name, None).await {
Ok(_) => println!(" ✓ 既存コンテナを起動"),
Err(e) => println!(" ⚠ 起動エラー: {}", e),
}
}
Err(e) => {
return Err(anyhow::anyhow!("コンテナ作成エラー: {}", e));
}
}
Docker接続インスタンスは複数の操作で再利用できます:
let docker = Docker::connect_with_local_defaults()?;
// 同じインスタンスを使い回す
docker.create_container(...).await?;
docker.start_container(...).await?;
docker.list_containers(...).await?;
ステータスコードで適切にハンドリング:
match result {
Err(Error::DockerResponseServerError { status_code: 404, .. }) => {
// イメージが見つからない → pull
}
Err(Error::DockerResponseServerError { status_code: 409, .. }) => {
// 既に存在 → 起動試行
}
Err(Error::DockerResponseServerError { status_code: 500, .. }) => {
// サーバーエラー(ポート競合など)
}
Ok(result) => { /* 成功 */ }
Err(e) => { /* その他 */ }
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let docker = Docker::connect_with_local_defaults()?;
let containers = docker.list_containers(None).await?;
Ok(())
}
詳細な実装例とパターンについては、以下のリファレンスを参照してください:
Bollardを使って実装できる機能:
FleetFlow(KDLベースのコンテナオーケストレーションツール)を効果的に使用するためのガイド
仕様(Why)と設計(How)を記録し、Living Documentation原則でコードと常に同期させる
LLMが外部サービスと対話するための適切に設計されたツールを通じて、高品質なMCP (Model Context Protocol) サーバーを作成するためのガイド。Python (FastMCP)、Node/TypeScript (MCP SDK)、Rust (Tokio)で、外部APIやサービスを統合するMCPサーバーを構築する際に使用します。