Documentation Index
Fetch the complete documentation index at: https://mintlify.com/fussybeaver/bollard/llms.txt
Use this file to discover all available pages before exploring further.
Bollard provides async methods for the full Docker network and volume lifecycle. Networks let containers communicate with each other; volumes provide persistent, container-independent storage. Both APIs are accessed through the Docker struct.
Networks
Listing Networks
list_networks returns Vec<Network>. Use ListNetworksOptionsBuilder to filter by driver, label, name, or type.
use bollard::Docker;
use bollard::query_parameters::ListNetworksOptionsBuilder;
use std::collections::HashMap;
let docker = Docker::connect_with_socket_defaults().unwrap();
let mut filters = HashMap::new();
filters.insert("label", vec!["maintainer=alice"]);
let networks = docker
.list_networks(Some(
ListNetworksOptionsBuilder::default()
.filters(&filters)
.build(),
))
.await?;
for net in &networks {
println!("{:?} — driver: {:?}", net.name, net.driver);
}
Creating a Network
create_network takes a NetworkCreateRequest from bollard::models and returns NetworkCreateResponse.
use bollard::Docker;
use bollard::models::NetworkCreateRequest;
let docker = Docker::connect_with_socket_defaults().unwrap();
let config = NetworkCreateRequest {
name: String::from("my-bridge-net"),
driver: Some(String::from("bridge")),
..Default::default()
};
let response = docker.create_network(config).await?;
println!("Network ID: {:?}", response.id);
Omitting driver defaults to bridge. Use "overlay" for Swarm-mode
multi-host networking.
Inspecting a Network
inspect_network returns NetworkInspect with IPAM configuration, connected containers, and options.
use bollard::Docker;
use bollard::query_parameters::InspectNetworkOptionsBuilder;
let docker = Docker::connect_with_socket_defaults().unwrap();
let info = docker
.inspect_network(
"my-bridge-net",
Some(
InspectNetworkOptionsBuilder::default()
.verbose(true)
.scope("local")
.build(),
),
)
.await?;
println!("Containers: {:?}", info.containers);
Connecting a Container to a Network
connect_network attaches a running container to a network. You can optionally assign a static IP address via EndpointSettings.
use bollard::Docker;
use bollard::models::{NetworkConnectRequest, EndpointSettings, EndpointIpamConfig};
let docker = Docker::connect_with_socket_defaults().unwrap();
let config = NetworkConnectRequest {
container: String::from("my-app"),
endpoint_config: Some(EndpointSettings {
ipam_config: Some(EndpointIpamConfig {
ipv4_address: Some(String::from("172.24.56.89")),
..Default::default()
}),
..Default::default()
}),
};
docker.connect_network("my-bridge-net", config).await?;
Disconnecting a Container
use bollard::Docker;
use bollard::models::NetworkDisconnectRequest;
let docker = Docker::connect_with_socket_defaults().unwrap();
let config = NetworkDisconnectRequest {
container: String::from("my-app"),
force: Some(false),
};
docker.disconnect_network("my-bridge-net", config).await?;
Removing a Network
let docker = bollard::Docker::connect_with_socket_defaults().unwrap();
docker.remove_network("my-bridge-net").await?;
A network cannot be removed while containers are connected to it. Disconnect
all containers first, or use prune_networks.
Pruning Unused Networks
use bollard::Docker;
use bollard::query_parameters::PruneNetworksOptionsBuilder;
use std::collections::HashMap;
let docker = Docker::connect_with_socket_defaults().unwrap();
let mut filters = HashMap::new();
filters.insert("label", vec!["maintainer=alice"]);
let result = docker
.prune_networks(Some(
PruneNetworksOptionsBuilder::default()
.filters(&filters)
.build(),
))
.await?;
println!("Pruned networks: {:?}", result.networks_deleted);
Volumes
Listing Volumes
list_volumes returns VolumeListResponse, which wraps a volumes field (Vec<Volume>) and optional warnings.
use bollard::Docker;
use bollard::query_parameters::ListVolumesOptionsBuilder;
use std::collections::HashMap;
let docker = Docker::connect_with_socket_defaults().unwrap();
let mut filters = HashMap::new();
filters.insert("dangling", vec!["1"]);
let result = docker
.list_volumes(Some(
ListVolumesOptionsBuilder::default()
.filters(&filters)
.build(),
))
.await?;
for vol in result.volumes.unwrap_or_default() {
println!("{} — driver: {}", vol.name, vol.driver);
}
Creating a Volume
create_volume takes a VolumeCreateRequest and returns a Volume struct.
use bollard::Docker;
use bollard::models::VolumeCreateRequest;
let docker = Docker::connect_with_socket_defaults().unwrap();
let config = VolumeCreateRequest {
name: Some(String::from("app-data")),
driver: Some(String::from("local")),
..Default::default()
};
let volume = docker.create_volume(config).await?;
println!("Created volume: {} at {}", volume.name, volume.mountpoint);
Inspecting a Volume
use bollard::Docker;
let docker = Docker::connect_with_socket_defaults().unwrap();
let vol = docker.inspect_volume("app-data").await?;
println!("Mountpoint: {}", vol.mountpoint);
println!("Driver: {}", vol.driver);
Removing a Volume
Pass force(true) to remove a volume even if it is in use.
use bollard::Docker;
use bollard::query_parameters::RemoveVolumeOptionsBuilder;
let docker = Docker::connect_with_socket_defaults().unwrap();
docker
.remove_volume(
"app-data",
Some(RemoveVolumeOptionsBuilder::default().force(false).build()),
)
.await?;
Pruning Unused Volumes
use bollard::Docker;
use bollard::query_parameters::PruneVolumesOptionsBuilder;
use std::collections::HashMap;
let docker = Docker::connect_with_socket_defaults().unwrap();
let mut filters = HashMap::new();
filters.insert("label", vec!["env=staging"]);
let result = docker
.prune_volumes(Some(
PruneVolumesOptionsBuilder::default()
.filters(&filters)
.build(),
))
.await?;
println!(
"Reclaimed: {:?} bytes from {:?} volumes",
result.space_reclaimed,
result.volumes_deleted.as_ref().map(|v| v.len())
);
prune_volumes permanently deletes all anonymous volumes not referenced by
any container. Pass a label filter to restrict the scope.