4个版本

0.2.0 2023年1月26日
0.1.5 2023年1月28日

#988 in 网络编程

26每月下载量

MIT许可证

79KB
1.5K SLoC

Docker Engine API包装器

与Docker Engine API交互的简单方法

入门指南

安装

cargo添加 docker_engine_api

或手动添加到您的Cargo.toml中

docker_engine_api= "0.1.5"

然后运行 cargo build

首先您应该在本地安装Docker;然后您应该使用命令 cargo test 运行库测试(测试使用alpine镜像:docker pull alpine);如果一切顺利,恭喜您可以开始编码了。

创建客户端

客户端是连接到Docker Engine API的主要方式,通常套接字位于 /var/run/docker.sock

extern crate docker_engine_api;
use crate::docker_engine_api::client::ClientTrait;

fn main() {
    let mut client = docker_engine_api::new("/var/run/docker.sock".to_string());
    match client.ping() {
        Ok(_) => {println!("Pong!")},
        Err(e) => panic!("Error: {}", e)
    };
}

注意

为了使用 client.containers 方法,您需要将 ContainersService 导入

use docker_engine_api::containers_service::ContainersServiceTrait;

获取容器

为了获取容器,提供了获取多个容器的方法,最原始且未经修改的部分是应该作为字符串提供的过滤器,无论如何,您可以检查文档 filters

fn get_containers(&mut self, all: bool, limit: i32, size: bool, filters: String) -> Result<Vec<Container>, Box<dyn std::error::Error + Send + Sync>>

函数中的这些参数是什么? 检查Docker Engine API文档

match client.containers.get_containers(false, 0, false, "".to_string()) {
    Ok(containers) => containers,
    Err(e) => panic!("Error: {}", e)
};

创建新容器

对于以下示例,您已经在系统中安装了 alpine:latest 镜像。现在打开命令提示符并输入 docker image ls,否则您可以编辑镜像并使用您想要的...

更多信息

简单易用

use docker_engine_api::container_create::CreateContainerBody;

let mut options = CreateContainerBody::default();
options.image = "alpine:latest".to_string();
options.cmd = vec!["/bin/true".to_string()];

let response = match client.containers.create_container("test2", "linux", &options) {
    Ok(response) => response,
    Err(e) => panic!("Error: {}", e)
};

最大的自定义选项

use docker_engine_api::container_create::CreateContainerBody;

let options = CreateContainerBody {
    hostname: "localhost".to_string(),
    domainname: "localhost".to_string(),
    user: "".to_string(),
    attach_stdin: true,
    attach_stdout: true,
    attach_stderr: true,
    tty: true,
    open_stdin: true,
    stdin_once: false,
    env: vec![],
    cmd: vec!["echo test'".to_string()],
    image: "alpine:latest".to_string(),
    labels: HashMap::new(),
    volumes: HashMap::new(),
    working_dir: "".to_string(),
    entrypoint: "".to_string(),
    network_disabled: false,
    mac_address: "".to_string(),
    stop_signal: "".to_string(),
    stop_timeout: 0,
    host_config: HostConfig::default(),
    networking_config: NetworkingConfig::default(),
    exposed_ports: HashMap::new(),
};

let response = match client.containers.reate_container("test", "linux", &options) {
    Ok(response) => response,
    Err(e) => panic!("Error: {}", e)
};

获取统计数据

match client.containers.get_stats_container(container_id, true, false) {
    Ok(stats) => {
        println!("{:?}", stats);
    },
    Err(e) => panic!("Error: {}", e)
};

容器服务的其他方法

fn inspect_container(&mut self, id: &str) -> Result<InspectedContainer, Box<dyn std::error::Error + Send + Sync>>
fn start_container(&mut self, id: &str) -> Result<EmptyOk, Box<dyn std::error::Error + Send + Sync>>
fn stop_container(&mut self, id: &str, timeout: i32) -> Result<EmptyOk, Box<dyn std::error::Error + Send + Sync>>
fn restart_container(&mut self, id: &str) -> Result<EmptyOk, Box<dyn std::error::Error + Send + Sync>>
fn remove_container(&mut self, id: &str, remove_associated_volumes: bool, force: bool, remove_specified_linked: bool) -> Result<EmptyOk, Box<dyn std::error::Error + Send + Sync>>
fn get_container_logs(&mut self, id: &str) -> Result<GET_CONTAINER_LOGS_RETURN, Box<dyn std::error::Error + Send + Sync>>
fn list_processes(&mut self, id: &str) -> Result<LIST_PROCESSES_RETURN, Box<dyn std::error::Error + Send + Sync>>
fn resize_container_tty(&mut self, id: &str, height: i32, width: i32) -> Result<EmptyOk, Box<dyn std::error::Error + Send + Sync>>
fn pause_container(&mut self, id: &str) -> Result<EmptyOk, Box<dyn std::error::Error + Send + Sync>>
fn unpause_container(&mut self, id: &str) -> Result<EmptyOk, Box<dyn std::error::Error + Send + Sync>>
fn wait_container(&mut self, id: &str, condition: &str) -> Result<EmptyOk, Box<dyn std::error::Error + Send + Sync>>
fn update_container(&mut self, id: &str, more: &UpdateContainerWith) -> Result<WarningsResponse, Box<dyn std::error::Error + Send + Sync>>;
fn rename_container(&mut self, id: &str, new_name: &str) -> Result<EmptyOk, Box<dyn std::error::Error + Send + Sync>>;
fn delete_stopped_containers(self) -> Result<EmptyOk, Box<dyn std::error::Error + Send + Sync>>;

贡献者

在这里见到您将非常高兴...

依赖项

~5–18MB
~198K SLoC