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/clientKhởi tạo Client
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
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
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
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
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
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
- Xử lý lỗi: Luôn kiểm tra lỗi khi tương tác với Docker API
- Đóng tài nguyên: Sử dụng defer để đóng các tài nguyên như io.ReadCloser
- Sử dụng context: Truyền context để có thể hủy các thao tác khi cần
- Quản lý version: Đảm bảo version Docker client tương thích với Docker server
- 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.
