Skip to content

DockerAPI

Tài liệu: Develop with Docker Engine SDKs | Docker Documentation

DockerAPI là SDK của Docker để tương tác với Docker theo cách lập trình, ví dụ như kéo image, chạy container, tài liệu này chỉ giải thích đơn giản cách sử dụng DockerAPI, trong tài liệu chính thức có giải thích chi tiết hơn cho từng API. API chính thức chỉ có phiên bản Go và Python, và bản thân Docker cũng hỗ trợ tương tác qua HTTP, nếu là ngôn ngữ khác thì có thể sử dụng SDK mã nguồn mở từ cộng đồng bên thứ ba, hướng dẫn này sẽ sử dụng ngôn ngữ Go để giải thích.

Cài đặt

Cài đặt Docker Client bằng Go Get.

go get github.com/docker/docker/client

Khởi tạo Client

go
package main

import (
    "context"
    "fmt"
    "github.com/docker/docker/api/types"
    "github.com/docker/docker/client"
)

func main() {
    cli, err := client.NewClientWithOpts(client.FromEnv)
    if err != nil {
        panic(err)
    }
    
    // Lấy thông tin phiên bản Docker
    version, err := cli.ServerVersion(context.Background())
    if err != nil {
        panic(err)
    }
    
    fmt.Printf("Phiên bản Docker: %s\n", version.Version)
}

Kéo Image

go
package main

import (
    "context"
    "fmt"
    "github.com/docker/docker/api/types"
    "github.com/docker/docker/client"
    "io"
    "os"
)

func main() {
    cli, err := client.NewClientWithOpts(client.FromEnv)
    if err != nil {
        panic(err)
    }
    
    // Kéo image
    out, err := cli.ImagePull(context.Background(), "nginx:latest", types.ImagePullOptions{})
    if err != nil {
        panic(err)
    }
    defer out.Close()
    
    // Sao chép đầu ra
    io.Copy(os.Stdout, out)
    fmt.Println("\nĐã kéo image thành công!")
}

Chạy Container

go
package main

import (
    "context"
    "fmt"
    "github.com/docker/docker/api/types/container"
    "github.com/docker/docker/client"
)

func main() {
    cli, err := client.NewClientWithOpts(client.FromEnv)
    if err != nil {
        panic(err)
    }
    
    // Tạo container
    resp, err := cli.ContainerCreate(context.Background(), &container.Config{
        Image: "nginx:latest",
        Cmd:   []string{"nginx", "-g", "daemon off;"},
    }, nil, nil, nil, "my-container")
    
    if err != nil {
        panic(err)
    }
    
    // Khởi động container
    if err := cli.ContainerStart(context.Background(), resp.ID, types.ContainerStartOptions{}); err != nil {
        panic(err)
    }
    
    fmt.Println("Container đã được khởi động!")
}

Liệt kê Container

go
package main

import (
    "context"
    "fmt"
    "github.com/docker/docker/client"
)

func main() {
    cli, err := client.NewClientWithOpts(client.FromEnv)
    if err != nil {
        panic(err)
    }
    
    // Liệt kê container
    containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{})
    if err != nil {
        panic(err)
    }
    
    for _, container := range containers {
        fmt.Printf("ID: %s, Tên: %s, Trạng thái: %s\n", container.ID[:10], container.Names[0], container.Status)
    }
}

Dừng và Xóa Container

go
package main

import (
    "context"
    "fmt"
    "github.com/docker/docker/api/types/container"
    "github.com/docker/docker/client"
    "time"
)

func main() {
    cli, err := client.NewClientWithOpts(client.FromEnv)
    if err != nil {
        panic(err)
    }
    
    containerID := "my-container"
    
    // Dừng container
    timeout := 30 * time.Second
    if err := cli.ContainerStop(context.Background(), containerID, container.StopOptions{Timeout: &timeout}); err != nil {
        panic(err)
    }
    
    fmt.Println("Container đã dừng!")
    
    // Xóa container
    if err := cli.ContainerRemove(context.Background(), containerID, types.ContainerRemoveOptions{}); err != nil {
        panic(err)
    }
    
    fmt.Println("Container đã được xóa!")
}

Xem Log Container

go
package main

import (
    "context"
    "fmt"
    "github.com/docker/docker/api/types"
    "github.com/docker/docker/client"
    "io"
    "os"
)

func main() {
    cli, err := client.NewClientWithOpts(client.FromEnv)
    if err != nil {
        panic(err)
    }
    
    // Xem log
    out, err := cli.ContainerLogs(context.Background(), "my-container", types.ContainerLogsOptions{
        ShowStdout: true,
        ShowStderr: true,
    })
    
    if err != nil {
        panic(err)
    }
    defer out.Close()
    
    io.Copy(os.Stdout, out)
}

Best Practices

  1. Xử lý lỗi: Luôn kiểm tra lỗi khi tương tác với Docker API
  2. Đóng tài nguyên: Sử dụng defer để đóng các tài nguyên như io.ReadCloser
  3. Sử dụng context: Truyền context để có thể hủy các thao tác khi cần
  4. Quản lý version: Đảm bảo version Docker client tương thích với Docker server
  5. Biến môi trường: Sử dụng biến môi trường để cấu hình Docker host

Kết luận

Docker API cung cấp một cách mạnh mẽ để tương tác với Docker từ ứng dụng Go. Với thư viện client chính thức, bạn có thể dễ dàng quản lý container, image, network và volume từ code của mình.

Golang by www.golangdev.cn edit