Container hóa Go App bằng Docker

Học cách dùng Docker để đóng gói và triển khai những ứng dụng Go hiệu quả, khiến chúng trở nên linh động và dễ quản lý. Dưới đây là hướng dẫn chi tiết.

Docker

Docker là công nghệ container hóa phổ biến nhất nhờ tính đơn giản và dễ sử dụng của nó. Docker giảm bớt áp lực về các vấn đề liên quan tới tính di động trong quá trình phát triển và phân phối phần mềm. Bạn có thể triển khai bộ chứa docker cho hầu hết các nhà cung cấp dịch vụ đám mây.

Việc container hóa các ứng dụng Go bằng Docker có thể giúp bạn đảm bảo việc triển khai nhất quán và đáng tin cậy trên các môi trường khác nhau. Bạn có thể triển khai ứng dụng Go trên những môi trường khác nhau như phát triển, dàn dựng và sản xuất. Các container Docker nhẹ và chiếm ít không gian hơn so với máy ảo truyền thống. Điều này có thể giúp bạn tiết kiệm tiền lưu trữ và triển khai nhanh hơn.

Thiết lập server web đơn giản trong Go

Thư viện chuẩn Go chứa các gói bạn cần để thiết lập một máy chủ web đơn giản.

Đầu tiên, nhập các gói http, logjson. Bạn sẽ sử dụng gói http của Go để thiết lập máy chủ và GET (nhận) điểm cuối yêu cầu. Gói log để ghi các lỗi có thể xảy ra vào bảng điều khiển của bạn. Gói json để mã hóa cấu trúc thành JSON cho điểm cuối API.

import (
    "encoding/json"
    "log"
    "net/http"
)

Bạn có thể mã hóa phiên bản struct dưới dạng JSON cho client như một phản hồi dựa trên tính hợp lệ của truy vấn như sau:

type Message struct {
    Response string `json:"response"`
    Description string `json:"description"`
}

Hàm xử lý sẽ trả về thông báo thành công cho máy khách nếu yêu cầu tới điểm cuối là yêu cầu GET.

// dockerTestEndpoint xử lý endpoint API để kiểm tra kết nối Docker 
func dockerTestEndpoint(writer http.ResponseWriter, request *http.Request) {
 
    // Đặt header để hiện nội dung JSON
    writer.Header().Set("Content-Type," "application/json")
 
    // Nếu phương thức truy vấn là GET
    if request.Method == "GET" {
 
        // Đặt code trạng thái phản hồi là 200 OK
        writer.WriteHeader(http.StatusOK)
 
        // Tạo cấu trúc thông báo cho phản hồi thành công
        message := Message{
            Response: "Successful",
            Description: "You've successfully hit the API endpoint " +
                "From your Docker Container",
        }
        // Mã hóa thông báo dưới dạng JSON và gửi nó đi dưới dạng phản hồi
        err := json.NewEncoder(writer).Encode(&message)
        if err != nil {
            return
        }
    } else {
 
        // Nếu phương thức truy vấn không phải là GET
        // Đặt code trạng thái phản hồi là 400 Bad Request
        writer.WriteHeader(http.StatusBadRequest)
 
        // Tạo cấu trúc thông báo cho phản hồi truy vấn xấu
        message := Message{
            Response: "Bad Request",
            Description: "You've successfully hit the API endpoint From your " +
                "Docker Container, But you made a bad request",
        }
 
        // Mã hóa thông báo là JSON và gửi nó làm phản hồi
        err := json.NewEncoder(writer).Encode(&message)
        if err != nil {
            return
        }
    }
}

Bạn thiết lập hàm handler trong hàm main với route là /api/docker/go. Hàm xử lý dockerTestEndpoint xác thực rằng yêu cầu tới trình xử lý là yêu cầu GET. Nếu đó là một yêu cầu GET, thì nó sẽ mã hóa một cấu trúc Message được khởi tạo cho máy khách dựa trên trạng thái của yêu cầu.

Đây là cách bạn có thể gắn hàm xử lý trên một tuyến và thiết lập máy chủ để chạy trên cổng 8080:

func main() {
    // Đăng ký hàm handler 'dockerTestEndpoint'
    // để xử lý truy vấn URL "/api/docker/go".
    http.HandleFunc("/api/docker/go", dockerTestEndpoint)
 
    // Khởi động server HTTP và nghe các truy vấn đến trên cổng 8080.
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
        log.Fatalln("There's an error with the server:", err)
    }
}

Hàm main là điểm vào của máy chủ, lắng nghe trên cổng 8080. Phương thức HandleFunc gắn kết các tuyến trên hàm xử lý. Phương thức ListenAndServe khởi động máy chủ trên cổng máy chủ cục bộ được chỉ định 8080.

Bắt đầu container hóa app Go bằng Docker

Sau khi cài đặt và thiết lập Docker, bạn cần một tệp Docker có tên Dockerfile để tạo và xây dựng hình ảnh Docker cho ứng dụng Go của mình. Bạn sẽ chỉ định các lệnh cho hình ảnh cơ sở và các lệnh để sao chép các tệp, thêm thư mục làm việc và chạy ứng dụng trong Dockerfile.

Chạy lệnh này trong terminal của không gian làm việc để tạo Dockerfile.

touch Dockerfile

Bạn sẽ chỉ định các lệnh để xây dựng hình ảnh Docker trong Dockerfile.

Nếu có bất kỳ tệp nào muốn tách khỏi hình ảnh Docker, bạn có thể sử dụng tệp .dockerignore. Các tệp .dockerignore hoạt động chính xác như các tệp .gitignore.

touch .dockerignore

Tiếp theo, bạn sẽ chỉ định các lệnh xây dựng trong Dockerfile để chứa các ứng dụng của mình.

Xác định các lệnh trong Dockerfile

Lệnh trong Dockerfile

Dockerfiles có thể tùy chỉnh dựa trên thông số kỹ thuật của dự án. Bạn sẽ xác định các lệnh để xây dựng hình ảnh cơ sở cho phát triển ứng dụng.

Ví dụ nội dung của Dockerfile xây dựng web server kể trên:

# Dùng ảnh cơ sở Golang 
FROM golang:latest
 
# Đặt thư mục hoạt động trong container
WORKDIR /app
 
# Sao chép toàn bộ file trong thư mục cục bộ vào thư mục đang hoạt động trong container
COPY . .
 
# Download các phụ thuộc mô đun Go 
RUN go mod download
 
# Xây dựng app Go 
RUN go build -o app
 
# Đặt điểm vào cho ứng dụng
ENTRYPOINT ["./app"]

Dockerfile sử dụng hình ảnh cơ sở golang:latest để xây dựng ứng dụng sau khi đặt thư mục làm việc thành /app.

Dockerfile sao chép các tệp bằng lệnh COPY và tải xuống phần phụ thuộc bằng lệnh RUN.

Tệp chỉ định thao tác xây dựng và chạy bằng lệnh RUN, sau đó đặt lệnh để chạy khi vùng chứa khởi động bằng lệnh CMD.

Lưu Dockerfile trong cùng thư mục với các tệp go.mod và main.go của bạn; sau đó chạy lệnh này để tạo hình ảnh Docker từ Dockerfile:

docker build -t GolangTutorial .

Lệnh trên sẽ tạo một hình ảnh Docker kèm tag golangtutorial. Bạn có thể chạy một container bằng lệnh này:

docker run -p 8080:8080 golangtutorial

Lệnh này ánh xạ cổng 8080 từ container tới cổng 8080 trên localhost của máy lưu trữ. Bạn có thể yêu cầu server chạy trong container Docker từ máy host.

Kết quả từ việc gửi truy vấn CURL tới server:

Kết quả

Hi vọng bài viết hữu ích với các bạn!

Chủ Nhật, 23/07/2023 11:25
31 👨 210
0 Bình luận
Sắp xếp theo